2013-02-10 4 views
0

Итак, у меня есть эта игра, и я хочу, чтобы игрок переместился, поэтому я использую метод тика, когда ключ вниз, он создает 2 прослушивателя событий, прослушиватель клавиш и галочку. Слушатель клавиатуры удаляет его сам и удаляет галочку. Тик содержит движение и где я предполагал анимацию. Вот мой код:Анимация stop actionscript 3.0 tick

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

    } 
} 

Так что, когда я проверить его и поставить KeyDown его goestoandstops на 7, а playing.Please помощь! Спасибо!

+0

Вы должны реорганизовать свой код, чтобы иметь только один слушатель 'KEY_DOWN' и только один прослушиватель' ENTER_FRAME'. 'KEY_DOWN' и' ENTER_FRAME' не должны вызывать функцию «one-called», например 'gotoAndPlay', или вы закончите с вызовом этого в каждом кадре и никогда не увидите часть' Play'. – YoannM

ответ

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

+0

Правильно ... добавьте логическую переменную для обнаружения только первого нажатия клавиши. Обновление моего ответа. – YoannM

+0

Также ... подумав об этом. Я не думаю, что вам нужен тик со своим событием keydown. Или вы должны удалить своего слушателя с клавиатуры в своем обработчике. Иначе это будет выполняться, пока вы нажимаете клавишу. – YoannM

Смежные вопросы