我在游戏中有一个键盘控制的角色,当没有时,它有一个固定的框架 按下键,上下左右方向为四个不同的动画 (没有对角线移动)。
因此,当按下左键时,_字符向左移动屏幕并播放左侧动画。当钥匙被释放/按键时,静止的框架会在角色静止的地方播放。
这在慢节奏下工作正常,但是当按下多个按键以在障碍物周围操纵时,角色经常粘在静止位置并且仅在延迟之后播放动画。 Movieclip的移动使用速度很好,但动画受到影响。
肯定会与密钥处理程序有关。我是初学者,所以我确信我无法理解一些简单的逻辑,但我无法理解!请帮帮我。无论我多快按键,我都需要播放动画,只有在没有任何按下时才能看到静止的图像。
使用Velocity变量在其自己的类中的字符。
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 :(得分: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;
}