Image Starling将按钮检测为图像

Image Starling将按钮检测为图像,image,flash,button,actionscript,starling-framework,Image,Flash,Button,Actionscript,Starling Framework,我有一个类,它是一个屏幕,当我移动光标时,我想检测它下面是什么对象。我在TalentBtn类中添加了一个自定义按钮,该类扩展自starling的button类,但当我跟踪它时,它是Image类的一个实例。我不能将它转换为talenTbtn,当我尝试时,它引用null。我使用hitTest(point)方法检测对象,该方法返回一个DisplayObject。你们觉得我能解决这个问题吗? 这是检测方法 private function onOverTalent(e:TouchEvent):void

我有一个类,它是一个屏幕,当我移动光标时,我想检测它下面是什么对象。我在TalentBtn类中添加了一个自定义按钮,该类扩展自starling的button类,但当我跟踪它时,它是Image类的一个实例。我不能将它转换为talenTbtn,当我尝试时,它引用null。我使用hitTest(point)方法检测对象,该方法返回一个DisplayObject。你们觉得我能解决这个问题吗? 这是检测方法

private function onOverTalent(e:TouchEvent):void {
        var point:Point = new Point(e.getTouch(stage).globalX, e.getTouch(stage).globalY);
        
        displayObject = hitTest(point);
        if (displayObject == null) {
            return;
        }
        
        if (displayObject is Image) {
            talentFound = displayObject as TalentBtn;

            trace(displayObject);
            trace(talentFound);
        }
        
    }
记录道的结果如下:

    [object Image]
    null

Button是DisplayObjectContainer的一个子类,创建它时,它会为自己添加一个背景图像和一个标签文本字段(如果有)。这两者都包含在按钮内的精灵中

要明确说明您正在尝试做什么,请尝试以下操作:

private function onOverTalent(e:TouchEvent):void
{
    var point:Point = new Point(e.getTouch(stage).globalX, e.getTouch(stage).globalY);

    var hit:DisplayObject = hitTest(point);
    if (!hit)
    {
        return;
    }

    // Probably not a good idea, in case the interior structure of Button ever changes.
    var button:Button = hit.parent.parent as Button;
    trace(button);
    }
}
然而,这种方法有一个问题:如果按钮内部的代码发生变化,它可能会崩溃。所以这里有一个更一般的方法:

private function onOverTalent(e:TouchEvent):void
{
    var point:Point = new Point(e.getTouch(stage).globalX, e.getTouch(stage).globalY);

    var hit:DisplayObject = hitTest(point);
    if (!hit)
    {
        return;
    }

    var button:Button;
    if (hit is Image || hit is TextField)
    {
        // Should be the containing Sprite now
        hit = hit.parent;
        while (hit)
        {
            button = hit as Button;

            if (button)
            {
                break;
            }

            // Go up one in the display hierarchy
            hit = hit.parent;
        }

        // None of it was a button.
        if (!button)
        {
            return;
        }

        // button will be the Button object at this point.
        trace(button);
    }
}
但是,您是否有理由不只是收听按钮本身上的
触摸事件


首先,感谢你的回答。第二,我不想给每个按钮都添加一个新的侦听器,我很确定这会不必要地浪费大量内存。现在我知道这不可能,但谁在乎呢@ferencedajka特别是在Starling中,事件是池化的,如果有的话,也不会增加太多内存使用。