2013-02-10 47 views
0

所以,我有這個遊戲,我希望玩家移動,所以我使用一個滴答的方法,當關鍵是關閉它創建2個事件監聽器,一個keyup監聽器和一個tick。它的自我和刪除tick。tick包含運動和我推測動畫的地方。 這裏是我的代碼:動畫停止動作3.0滴答

// For every frame // 
import flash.events.Event; 
import flash.events.TouchEvent; 
import flash.events.MouseEvent; 
import flash.events.KeyboardEvent; 
var gravity = 0.6; 
var floor = 410; 
jordan1.y = floor; 
jordan1.speedY = floor; 
jordan1.impulsion = 10; 
var onFloor:Boolean = false; 
var keyRight:Boolean = false; 
stage.addChild(jordan1); 
stage.addChild(leftwall1); 
stage.addChild(finish1); 
stage.addChildAt(abovedoor, 0); 
stage.addChild(left); 
stage.addChild(right); 
stage.addChild(jump); 
addEventListener(Event.ENTER_FRAME, enters); 
function enters(e:Event) { 
    jordan1.speedY += gravity; 
    jordan1.y += jordan1.speedY 
    if(jordan1.y > floor) { 
     jordan1.speedY = 0; 
     jordan1.y = floor; 
     onFloor = true; 
     if(keyRight == true) { 
      jordan1.gotoAndPlay(7); 
     } 
     if(keyRight == false) { 
     jordan1.gotoAndStop(1); 
     } 
    } 
} 

function stageup(e:MouseEvent) { 
    removeEventListener(Event.ENTER_FRAME,tickleft); 
    removeEventListener(Event.ENTER_FRAME,tickright); 
    removeEventListener(MouseEvent.MOUSE_UP, stageup); 
} 
stage.addEventListener(MouseEvent.MOUSE_DOWN, stagedown); 
function stagedown(e:MouseEvent) { 
    stage.addEventListener(MouseEvent.MOUSE_UP, stageup); 
} 



stage.addEventListener(KeyboardEvent.KEY_DOWN, jumpkey); 
function jumpkey(e:KeyboardEvent) { 
    if(e.keyCode == Keyboard.SPACE) { 
     if(onFloor == true) 
     { 
     jordan1.speedY=-jordan1.impulsion; 
     onFloor = false; 
     jordan1.gotoAndStop(2); 
     } 
     } 
    } 

stage.addEventListener(KeyboardEvent.KEY_DOWN, leftkey); 
function leftkey(e:KeyboardEvent) { 
if(e.keyCode == Keyboard.LEFT) { 
    addEventListener(Event.ENTER_FRAME, leftkeytick); 
    stage.addEventListener(KeyboardEvent.KEY_UP, leftkeydown); 



} 
} 
function leftkeydown(e:KeyboardEvent) { 
    removeEventListener(Event.ENTER_FRAME, leftkeytick); 
    stage.removeEventListener(KeyboardEvent.KEY_UP, leftkeydown); 

} 
function leftkeytick(e:Event) { 
    jordan1.x-=10; 
     if(onFloor == true) { 
    jordan1.gotoAndStop(3); 
    } 
    if(onFloor == false) { 
     jordan1.gotoAndStop(6); 
    } 

} 





stage.addEventListener(KeyboardEvent.KEY_DOWN, rightkey); 
function rightkey(e:KeyboardEvent) { 
if(e.keyCode == Keyboard.RIGHT) { 
    keyRight == true; 
    addEventListener(Event.ENTER_FRAME, rightkeytick); 
    stage.addEventListener(KeyboardEvent.KEY_UP, rightkeydown); 
} 
} 
function rightkeydown(e:KeyboardEvent) { 
    removeEventListener(Event.ENTER_FRAME, rightkeytick); 
    keyRight == false; 
    stage.removeEventListener(KeyboardEvent.KEY_UP, rightkeydown); 
} 
function rightkeytick(e:Event) { 
    jordan1.x+=10; 
    if(onFloor == true) { 
    jordan1.gotoAndPlay(7); 
    } 
    if(onFloor == false) { 
     jordan1.gotoAndStop(5); 
    } 
} 

// Just for this frame // 
leftwall1.addEventListener(Event.ENTER_FRAME, leftwall1hit); 
function leftwall1hit(e:Event) { 
    if(leftwall1.hitTestObject(jordan1)) { 
     jordan1.x +=10; 
    } 
} 

abovedoor.addEventListener(Event.ENTER_FRAME, abovedoorhit); 
function abovedoorhit(e:Event) { 
    if(abovedoor.hitTestObject(jordan1)) { 
     jordan1.x-=10; 
    } 
} 

jordan1.addEventListener(Event.ENTER_FRAME, finish1hit); 
function finish1hit(e:Event) { 
    if(jordan1.x > 960) { 
     gotoAndStop(67); 

    } 
} 

所以,當我測試它,並把它goestoandstops該keydown在7,而不是playing.Please幫助!謝謝!

+0

您應該重新組織代碼,使其只有一個'KEY_DOWN'偵聽器,並且只有一個'ENTER_FRAME'偵聽器。 'KEY_DOWN'和'ENTER_FRAME'不應該調用「gotoAndPlay」這樣的「單獨調用」函數,否則你將在每幀調用它並且不會看到「Play」部分。 – YoannM 2013-02-10 21:12:19

回答

0

您的goto不應該在您的勾號中,否則它們將在每幀中執行。這解釋了爲什麼它停留在框架7

而是把它們放在KEY_DOWN聽衆:

animated = false; 
stage.addEventListener(KeyboardEvent.KEY_DOWN, rightkey); 
function rightkey(e:KeyboardEvent) { 
    if(e.keyCode == Keyboard.RIGHT) { 
    if(onFloor == true && !animated) { 
     jordan1.gotoAndPlay(7); 
    } 
    if(onFloor == false && !animated) { 
     jordan1.gotoAndStop(5); 
    } 
    animated = true; 
    addEventListener(Event.ENTER_FRAME, rightkeytick); 
    stage.addEventListener(KeyboardEvent.KEY_UP, rightkeydown); 
    } 
} 
function rightkeydown(e:KeyboardEvent) { 
    animated = false; 
    removeEventListener(Event.ENTER_FRAME, rightkeytick); 
    stage.removeEventListener(KeyboardEvent.KEY_UP, rightkeydown); 
} 
function rightkeytick(e:Event) { 
    jordan1.x+=10; 
} 

但你不應該使用蜱功能與keydown事件。

KEY_DOWN在您按/ a鍵時調用每個幀。

如果你不能改變你的邏輯(這對你想達到的目標不好),你可以標記你的處理程序。 通過爲您正在監聽的每個鍵設置一個布爾值。 然後在你的滴答聲中,根據鍵被按下來做你需要做的事情。

keyRight = false; 
keyLeft = false; 
//... same for all your keys. 
// or you could store them in one object for a more dynamic solution. 

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp); 
stage.addEventListener(Event.ENTER_FRAME,tick); 

function keyDown(e:KeyboardEvent){ 
    if(e.keyCode === Keyboard.RIGHT && !keyRight){ 
     keyRight = true; 
    } 
    else if(e.keyCode === Keyboard.LEFT && !keyLeft){ 
     keyLeft = true; 
    } 
    //... same for all your keys. 
} 

function keyUp(e:KeyboardEvent){ 
    if(e.keyCode === Keyboard.RIGHT){ 
     keyRight = false; 
    } 
    else if(e.keyCode === Keyboard.LEFT){ 
     keyLeft = false; 
    } 
    //... same for all your keys. 
} 

function tick(e:Event){ 
    if(keyRight) jordan1.x += 10; 
    if(keyLeft) jordan1.x -= 10; 
    //... etc for all your keys. 
} 

This other question覆蓋多個KEY_DOWN的主題非常好。

+0

無法正常工作。跳轉有效,但不是動畫。 – user1666767 2013-02-10 20:19:57

+0

Right ...添加一個布爾變量來檢測只有第一個keydown。 更新我的答案。 – YoannM 2013-02-10 20:22:41

+0

......想過之後......我認爲你不需要在你的keydown事件中打勾。或者你應該刪除你的處理程序中的keydown監聽器。否則它會在您按下按鍵時執行。 – YoannM 2013-02-10 20:27:14