2

画面であるクラスがあります。カーソルを移動すると、その下にあるオブジェクトを検出したいと思います。スターリングの Button クラスから拡張されたクラス TalentBtn のカスタム ボタンを追加しましたが、それをたどると Image クラスのインスタンスです。talenTbtn にキャストできません。試してみると、null を参照しています。DisplayObject を返す hitTest(point) メソッドでオブジェクトを検出します。どうにかしてこの問題を解決できると思いますか? 見分け方はこちら

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 (存在する場合) を自身に追加します。これらは両方とも、ボタン内にあるスプライト内に含まれています。

やろうとしていることに具体的に対処するには、これを試してください:

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 に答える