0

アクションスクリプトを使用して、ネクサス7のインタラクティブシーンを作成しようとしています。ボタンを押している間、うなじの体を連続的に動かそうとしています。trace(event.target.name); タップハンドラーでは、期待どおりに押されているボタンのインスタンス名が返されますが、enter_frameの押された関数の同じトレースステートメントはボタンの親名を返しているため、以下の動きは発生していません。私のコードです。

resetBtn.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler);
ballBtn.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler );
leftArrow.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler );
rightArrow.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler );

private function tapHandler(event:TouchEvent):void
{
    //listen for mouse up on the stage, in case the finger moved off of the button accidentally when they release.
    rightArrow.addEventListener(TouchEvent.TOUCH_END, endTouch);
    //while the mouse is down, run the tick function once every frame as per the project frame rate
        addEventListener(Event.ENTER_FRAME, pressed); 

    trace(event.target.name);           
    //ball.applyImpulse(new Vec2(25,0));
}

function endTouch(e:Event):void 
{
    removeEventListener(Event.ENTER_FRAME, pressed);  
    //stop running the tick function every frame now that the mouse is up
    this.removeEventListener(TouchEvent.TOUCH_END,endTouch); 
    //remove the listener for endTouch
}
function pressed(e:Event):void 
{
    space.step(1 / stage.frameRate);

    trace(e.target.name);           
    if(e.target.name == "leftArrow")
    {
        trace("going left");
        crane.position.x -=  5;
        boom.position.x -=  5;
        c.position.x -=  5;
    }
    if(e.target.name == "rightArrow")
    {
        trace("going Right");
        crane.position.x +=  5;
        boom.position.x +=  5;
        c.position.x +=  5;
    }
}

あなたが私がこれを修正するのを手伝うか、このwourヘルプを達成するためのより良い方法を提案することができれば大いに感謝されます。

4

1 に答える 1

0

問題は基本的に、Enter_frameイベントの親にリスナーを追加しているため、そのイベントがディスパッチされるときのターゲットが希望どおりのボタンではないことです。リスナーを動かす代わりに、次のようにボタンへの参照を保持するために変数を使用する方が良いと思います。

private var curButton:Sprite;

resetBtn.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler);
ballBtn.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler );
leftArrow.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler );
rightArrow.addEventListener(TouchEvent.TOUCH_BEGIN , tapHandler );

private function tapHandler(event:TouchEvent):void
{
    curButton = event.target;
    curButton.addEventListener(TouchEvent.TOUCH_END, endTouch);

    addEventListener(Event.ENTER_FRAME, pressed); 
}

function endTouch(e:Event):void 
{
    trace("touch end received");
    removeEventListener(Event.ENTER_FRAME, pressed);  
    curButton.removeEventListener(TouchEvent.TOUCH_END, endTouch);
    curButton = null;
}
function pressed(e:Event):void 
{
    trace("currently pressed");
    space.step(1 / stage.frameRate);

    if(curButton == leftArrow)
    {
        trace("going left");
        crane.position.x -=  5;
        boom.position.x -=  5;
        c.position.x -=  5;
    }
    if(curButton == rightArrow)
    {
        trace("going Right");
        crane.position.x +=  5;
        boom.position.x +=  5;
        c.position.x +=  5;
    }
}

上記の私の編集をご覧ください。うまくいけば解決に役立つはずです。また、変数を定義するときに変数に付けるインスタンス名は、.nameプロパティまたは.idプロパティと同じではないことをすでに理解しているように思われるため、インスタンス名は実行時に使用できなくなります。 (本当に必要な場合は、nameプロパティを使用できますが、自分で入力する必要があります。通常は、コンパイル時にチェックされ、余分なランタイムが発生しないため、代わりにコードでインスタンス名を使用するのが最適です。オーバーヘッド)。

于 2013-03-25T03:26:55.883 に答える