as3 flash游戏:如何停止gotoAndPlay('label')循环?

我正在做一个主角的Flash游戏,帮助城里的人。 由于使用keyPressed()函数,可以使用箭头键移动。

当主角hitTests与一个人,你按空格键人应该gotoAndPlay标签内。 这很好,但是因为我把这些if语句放在了keyPressed函数中,所以每当主字符移动(keyPressed)时,标签就从头开始播放。 我明白为什么会发生这种情况,但是我对你的问题是:

它到目前为止,但现在我意识到我有很多if语句,他们都在keyPressed函数。 这导致我的问题(gotoAndPlay的循环),我敢肯定,这将在未来造成更多的麻烦。 我应该使用更多的function,但是何时何地使用这些来实现我的目标?

更多信息:我在时间轴上编码(F9),maincharacter = char,client =这个人应该去“离开”

var clients:int = 0; var orders:int = 0; var delivery:int = 0; var hodling:int = 0; var isRight:Boolean=false; var isLeft:Boolean=false; var isUp:Boolean=false; var isSpace:Boolean=false; var isDown:Boolean=false; var speed:Number = 3; var mazeRect:Rectangle = bounds.getBounds(this); var charRect:Rectangle = char.getBounds(this); var boundsBmpData = new BitmapData(mazeRect.width, mazeRect.height, true, 0); var charBmpData = new BitmapData(charRect.width, charRect.height, true, 0); boundsBmpData.draw(bounds); charBmpData.draw(char); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); stage.addEventListener(Event.ENTER_FRAME, moving); function keyPressed(event:KeyboardEvent):void { if(event.keyCode==39){ isRight=true char.gotoAndStop('right')} if(event.keyCode==37){ isLeft=true char.gotoAndStop('left')} if(event.keyCode==38){ isUp=true char.gotoAndStop('up')} if(event.keyCode==40){ isDown=true char.gotoAndStop('down')} if(event.keyCode==32){ isSpace=true } if(char.hitTestObject(order) && isSpace == true && orders <3) { orders++ ; } if(char.hitTestObject(orderz) && isSpace == true && orders > 0 && holding <3 ) { orders--; holding++;} if(char.hitTestObject(order2) && isSpace == true && orders > 0) { orders--; holding++;} if(char.hitTestObject(order3) && isSpace == true && orders > 0) { orders--; holding++;} if (char.hitTestObject(client) && client.currentLabel == 'seated' && isSpace == true && holding>0){ delivery++; } if( char.hitTestObject(order) && isSpace == true && orders == 1){ orderz.gotoAndPlay('one') } if( char.hitTestObject(order) && isSpace == true && orders == 2){ order2.gotoAndPlay('two') } if( char.hitTestObject(order) && isSpace == true && orders == 3){ order3.gotoAndPlay('three') } if( char.hitTestObject(orderz) && isSpace == true){ orderz.gotoAndPlay('zero') } if( char.hitTestObject(order2) && isSpace == true ){ order2.gotoAndPlay('zero') } if( char.hitTestObject(order3) && isSpace == true ){ order3.gotoAndPlay('zero') } if (counterDisplay.text == ('3') && delivery == 3) { served ++; //trace("ready"); client.gotoAndPlay('leaving'); } if (counterDisplay.text == ('2') && delivery == 2 ) { served ++; //trace("ready"); client.gotoAndPlay('leaving'); } if (counterDisplay.text == ('1') && delivery == 1 ) { served ++; client.gotoAndPlay('leaving'); } if ( served == 1) { trace("ready"); } } function keyReleased(event:KeyboardEvent) { if(event.keyCode==39){ isRight=false} if(event.keyCode==37){ isLeft=false} if(event.keyCode==38){ isUp=false} if(event.keyCode==40){ isDown=false} if(event.keyCode==32){ isSpace=false} } function moving(e: Event): void { var newx: Number = char.x - (isLeft ? speed : 0) + (isRight ? speed : 0); var newy: Number = char.y - (isUp ? speed : 0) + (isDown ? speed : 0); if(!boundsBmpData.hitTest(new Point(bounds.x, bounds.y), 255, charBmpData, new Point(newx, newy), 255)) { char.x = newx; char.y = newy; } } 

一些额外的信息:“离开”标签的长度是200帧,然后它应该停在下一个标签。 (下一个标签还没有在代码中,但问题是,每次按下某个键时,第一个框架都会重复“离开”标签,并且在animation期间主要字符应该是可移动的,因此按键将被按下导致标签从第一帧开始循环/重新开始。

如果指定的条件为真,代码只执行gotoAndPlay。 你需要修改你的if语句,以便条件更严格。 例如:

 if(char.hitTestObject(order) && isSpace == true && orders == 1 && PREVIOUS_PLAY_IS_FINISHED){ // only when previous animation of "one" finished then we play again. orderz.gotoAndPlay('one') } 

不知道你想要做什么,很难告诉你如何执行更严格的条件。

编辑:您可以使用MovieClip.currentFrame属性来检查animation是否仍在播放,以便您不要从开始重复animation。

 if(char.currentFrame == 200) // change 200 to the actual frame number, 200 from the "leaving" label. { client.gotoAndPlay('leaving'); } 

另外,为了处理你的一般结构的组织,你可以考虑把charanimation作为单独的animation片段嵌套在charanimation片段中。 然后可以做类似的事情

char.leaving.play()在哪里离开是movieclipanimation的“离开”等,那么你可以做的事情

 if(!char.leaving.isPlaying) // if not playing the leaving animation { char.leaving.play(); }