2013-03-24 95 views
0

我正在嘗試使用動作使交互式場景fot我的連接點7。我正試圖讓一個頸部身體在按下按鈕時連續移動。 trace(event.target.name);在tap處理程序中正在返回被按下的按鈕的實例名稱,因爲我期望它,但enter_frame按下的函數中的相同trace語句正在返回按鈕父項名稱,因此下面不會發生移動是我的代碼。as3連續移動物體與觸摸事件

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

如果你能幫助我解決這個問題,或者提出一個更好的方法來實現這種幫助將不勝感激。

回答

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屬性,但你必須自己填充它,通常最好是在代碼中使用實例名稱,因爲這是在編譯時檢查的,並且沒有額外的運行時間高架)。

+0

非常感謝你,我得到了這個工作,但我不得不將curButton更改爲一個字符串,只跟蹤curButton而不是curButton.name – Lonergan6275 2013-03-25 10:42:17

+0

但是當leftArrow被釋放時,對象繼續向左移動,直到按下另一個按鈕 – Lonergan6275 2013-03-25 10:54:00