2

我有一个屏幕类,当我移动光标时,我想检测它下面有什么对象。我添加了一个类 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
4

1 回答 1

1

Button 是 DisplayObjectContainer 的子类,当它被创建时,它会为自己添加一个 Image 作为背景,一个 TextField 作为标签(如果有的话)。这两者都包含在按钮内的 Sprite 中。

要专门解决您要执行的操作,请尝试以下操作:

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);
    }
}

但是,这种方法有一个问题:如果 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);
    }
}

但是,您是否有理由不只是touch在按钮本身上监听事件?

http://doc.starling-framework.org/core/starling/display/DisplayObject.html#event:touch

于 2012-10-18T20:18:14.463 回答