2014-01-25 77 views
0

我有一个键盘控制字符在游戏中有一个固定的框架,当没有
键被按下,四个不同的动画的上,下,左,右方向
(无对角线移动)。AS3键盘控制角色 - 动画问题与多个按键

所以当左键被按下时,_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; 
     } 

在KeyDown处理程序使用箭头和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的回答已经解决了动画状态问题精辟但是这个新的控制系统似乎想斜向地行进,它发送不需要的路径上的字符。

我的舞台是一个50px的方格。角色是50px和50px boxess(带有碰撞检测)周围有50px的边框,所以角色可以在舞台上进行操控。

如果我按住一个方向,角色移动没有问题(从左到右,也可以从上往下),但是如果我向左走然后向下或向上然后右等,角色将朝那个方向行进,然后继续围绕这些方框。当我测试没有箱子时,角色沿着那个方向对角地继续。

所以如果我想围绕一个盒子顺时针转动(从左下方开始),我会按下,然后右键,如果我不很快按下,角色会向上移动并再次右键,朝着舞台的右上方。 (如果键被释放,字符会停止。)

所以,如果我从对立的updown或leftright变量中按下两个键,它想要对角线移动。任何想法如何解决这个问题?

最后更新

的Vesper的回答解决了我的原创动漫的问题。我会提出新的问题来处理剩下的问题。

回答

0

实际上,您实际上有四个事实上独立的按键状态,上按键按下/释放,下按键,左键,右键。从技术上讲,可以在一次按下两个相反的按键的情况下执行特殊操作,在您的情况下不需要,但仍然值得一提。所以,你分开处理所有的人,然后才选择你的角色应该在哪里面对。

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也是如此。现在按照按键解析实际角色的移动。最好的地方是输入框架处理程序 - 你已经拥有它的好东西。

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

傻了,我把updown和leftright变量放在程序的开头,而不是在输入框中。现在它运行得非常好,播放适当的动画并在关闭时停止。然而,这些控件有点失控,角色会围绕障碍选择自己的方向。那是因为机构处理器每秒发出六十次指令吗?任何想法如何解决这个问题? – Rookie

+0

这不太可能是因为速度的原因,但您可以考虑将帧速率降低到30,例如最有可能您的游戏最终会过大而无法保持60fps。但的确如此,如果新框架是相同的,你可以从字符中收集'currentFrame'属性来不调用'gotoAndStop()'。你描述的其他行为对我来说还不清楚。 – Vesper

+0

嗨,抱歉建议速度/机架是问题,它与此无关。我的问题不再是动画,而是实际的动画片段对象的移动。我在主要问题部分添加了更新。如果你能再次看看并帮助,我会很感激。 – Rookie