[英]AS3 Keyboard Controlled Character - Animation problems with multiple key presses
我在一個游戲中有鍵盤控制的角色,當沒有
按下鍵,並為上下左右方向選擇四個不同的動畫
(無對角線運動)。
因此,當按下左鍵時,_character在屏幕上向左移動並播放左動畫。 釋放鍵/向上鍵時,靜止幀會在角色靜止的地方播放。
這可以在緩慢的速度下正常工作,但是當按下多個鍵來圍繞障礙物等進行操作時,角色通常會停留在固定位置,並且僅在延遲后才能播放動畫。 使用速度可以使Movieclip的運動很好,但是動畫會受到影響。
這肯定與加鎖處理程序有關。 我是一個初學者,所以我確定我只是無法理解一些簡單的邏輯,但是我無法弄清楚! 請幫幫我。 無論我以多快的速度敲擊按鍵,我都需要播放動畫,並且只有當什么都沒有按下時,我才能看到靜止的圖像。
具有速度變量的同級角色。
package
{
import flash.display.MovieClip;
import flash.display.DisplayObject
[Embed(source="../swfs/characterRes.swf", symbol="Character")]
public class Character extends MovieClip
{
//Public properties
public var vx:int = 0;
public var vy:int = 0;
public function Character()
{
}
}
}
添加了Keydown和KeyUp偵聽器。
_stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
_stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
在enterFrame中,字符X和Y的位置與速度相關
private function enterFrameHandler(event:Event):void
{
//Move the game character and check its stage boundaries
_character.x += _character.vx;
_character.y += _character.vy;
}
摳像處理程序使用箭頭和WASD控制速度並向特定幀播放該方向(帶有嵌入式動畫)
private function keyDownHandler(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
{
_character.vx = -4;
_character.gotoAndStop(4);
}
else if (event.keyCode == Keyboard.RIGHT || event.keyCode == 68)
{
_character.vx = 4;
_character.gotoAndStop(5);
}
else if (event.keyCode == Keyboard.UP || event.keyCode == 87 )
{
_character.vy = -4;
_character.gotoAndStop(2);
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == 83)
{
_character.vy = 4;
_character.gotoAndStop(3);
}
}
鍵控處理器停止速度並播放第一幀,即靜止圖像。
private function keyUpHandler(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT
|| event.keyCode == 65 || event.keyCode == 68)
{
_character.vx = 0;
_character.gotoAndStop(1);
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP
|| event.keyCode == 87 || event.keyCode == 83 )
{
_character.vy = 0;
_character.gotoAndStop(1);
}
}
我還將靜止圖像變成鮮紅色,以使我更容易發現,一旦我開始朝不同方向移動角色,我就會看到紅色! (從字面上和比喻!)
更新資料
Vesper的答案很好地解決了動畫狀態問題,但是這個新的控制系統似乎想沿對角線行駛,從而在不需要的路徑上發送角色。
我的舞台是一個50像素正方形的網格。 角色是50px和50px的盒子(帶有碰撞檢測),周圍有50px的邊框,因此角色可以在舞台上操縱。
如果我按下/保持一個方向,則角色移動沒有問題(從左到右,也可以從上到下也可以。),但是如果我向左走,然后向下或從上到右,依次類推,則角色將沿該方向移動,然后繼續沿該方向移動那些盒子。 當我在沒有盒子的情況下進行測試時,角色會沿該方向對角線繼續。
因此,如果我想順時針旋轉一個框(從框的左下角開始),我將按向上,然后按向右,如果我不迅速向下按,則角色將再次向上和向右移動,朝頂部移動在舞台的右邊。 (如果釋放鍵,字符會停止。)
因此,如果我從相對的updown或leftright變量中按下兩個鍵,則它想沿對角線移動。 任何想法如何解決這個問題?
最終更新
Vesper的答案解決了我原來的動畫問題。 我將提出新的問題來處理其余的查詢。
實際上,您實際上有四個事實上的獨立鍵狀態:按下/釋放的向上鍵,向下鍵,向左鍵,向右鍵。 從技術上講,一次可以按下兩個相對的鍵可以執行特殊的操作,在您的情況下不需要,但是仍然值得一提。 因此,您需要分別處理所有這些字符,然后才選擇角色的臉部位置。
var bDown:Boolean=false;
var bUp:Boolean=false;
var bLeft:Boolean=false;
var bRight:Boolean=false;
// declare vars to store key states. You can use an array if you want
private function keyDownHandler(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
{
bLeft=true;
// now, instead of directly attaching the movement, just set flag
}
else if (event.keyCode == Keyboard.RIGHT || event.keyCode == 68)
{
bRight=true;
}
else if (event.keyCode == Keyboard.UP || event.keyCode == 87 )
{
bUp=true;
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == 83)
{
bDown=true;
}
}
與鍵處理程序相同,將值設置為false。 現在,根據按下的鍵來解析實際角色的動作。 最好的地方是Enter框架處理程序-很好的事情是您已經將其放置在適當的位置。
private function enterFrameHandler(event:Event):void
{
var updown:Boolean=Boolean(!(bUp==bDown));
// if both are true or both are false, this is false. If this is true,
// we are moving upwards or downwards
var leftright:Boolean=Boolean(!(bLeft==bRight));
// same here
if (!updown && !leftright) {
// not moving anywhere
_character.gotoAndStop(1);
_character.vy=0;
_character.vx=0;
// other mechanics might be in place in case you decide to implement inertia, for example
} else {
if (bUp) {
_character.vy=-4; // hardcoding this might get you issues later
// will still do for today's task
_character.gotoAndStop(2);
} else if (bDown) {
_character.vy=4;
_character.gotoAndStop(3);
}
// one side parsed. Note, with this sequence the leftwards or rightwards
//animation supersedes up/down. But, we don't have diagonals, so there should be superseded animation
if (bLeft) {
_character.vx=-4;
_character.gotoAndStop(4);
} else if (bRight) {
_character.vx=4;
_character.gotoAndStop(5);
}
}
// Okay, now velocity and facing is set, proceed with move
//Move the game character and check its stage boundaries
_character.x += _character.vx;
_character.y += _character.vy;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.