我做了一个类似迷宫的游戏,玩家用箭头或WASD控制舞台周围的动画片段(_character)并在一定时间内收集东西 . MovieClip有五个不同的帧,每个帧都有自己的状态动画,左,右,上,下和静止 .
在舞台上有正方形/盒子与碰撞检测,我需要能够在所有不同的方向周围操纵它们 .
我的问题是,我似乎无法在动画片段 AND 内正确移动动画片段本身同时工作 .
我当前的控件可以在障碍物周围拉链,在没有按键时停止并播放相关的_字符动画,但是当按下两个对角线方向键时,即使我释放其中一个键,MovieClip也会沿对角线方向移动 .
例如,如果舞台上有一个方格/盒子,我想绕它顺时针方向行进(从顶部开始)我应该能够向右,向下,向左,向上,然后再向右按压返回原来的位置 .
然而,根据我当前的代码,我会向右,向下按(在我可以向左按下框之前)我的Movieclip将移动到舞台的右下角(右下) .
即使我把手指从DOWN键上移开然后按下它也不会自己纠正并向右移动,它会卡在那个对角线位置!
图像给出了按下LEFT的示例,然后在游戏开始时按下DOWN .
Game Movement http://i61.tinypic.com/1szl7o.jpg
当我从舞台上移除所有框以测试空白区域中的移动时,如果我按下两个按钮,动画片段对象仍然固定为对角线方向,没有框可以移动它只是移动到舞台的角落它旨在 .
防止这是我的问题,我不能禁用多次按键,因为它在迷宫中移动变得太困难了(_字符必须完全排列到间隙)
现行代码:
方向的变量
private var _bUp:Boolean = false;
private var _bDown:Boolean = false;
private var _bLeft:Boolean = false;
private var _bRight:Boolean = false;
KeyDown Handler中的变量为true .
private function keyDownHandler(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
{
_bLeft=true;
}
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;
}
KeyUp中的错误 .
private function keyUpHandler(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT
|| event.keyCode == 65 || event.keyCode == 68)
{
_bLeft=false;
_bRight=false;
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP
|| event.keyCode == 87 || event.keyCode == 83 )
{
_bUp=false;
_bDown=false;
}
在enterFrameHandler _character中移动速度并播放动画 . 如果没有按下任何键,则速度为0且_字符仍然是 . 然后角色movieclip获取要移动的速度值,我们检查阶段边界,然后与框冲突 .
private function enterFrameHandler(event:Event):void
{
var _updown:Boolean=Boolean(!(_bUp==_bDown));
var _leftright:Boolean=Boolean(!(_bLeft==_bRight));
if (!_updown && !_leftright)
{
// not moving anywhere
_character.gotoAndStop(1);
_character.vy=0;
_character.vx=0;
}
else
{
if (_bUp)
{
_character.vy=-4;
_character.gotoAndStop(2);
}
else if (_bDown)
{
_character.vy=4;
_character.gotoAndStop(3);
}
if (_bLeft)
{
_character.vx=-4;
_character.gotoAndStop(4);
}
else if (_bRight)
{
_character.vx=4;
_character.gotoAndStop(5);
}
}
_character.x += _character.vx;
_character.y += _character.vy;
checkStageBoundaries(_character);
//Collisions
Collision.block(_character,_box1);
Collision.block(_character,_box2);
与盒子碰撞 . ^^^
On a side note
不确定它的重要性,但我的旧键盘方法只使用enterFrame Handler将速度链接到角色对象,KeyDown Handler移动了chacters速度 . 这使用了相同的碰撞检测盒,但我没有移动movieclip对象的问题
该代码是:
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);
}
}
// Key up handler stops velocity and plays first frame which is the stationary image.
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);
}
}
这种移动技术完美地将MovieClip移动到舞台周围,没有奇怪的路线,但动画无法通过多次按键正常播放,因此我切换到布尔变量和enterFrame控件 .
In Conclusion
我不知道碰撞检测或键盘控制是否应该受到责备,但我只是想能够 manoeuvre the player Movieclip quickly around the boxes and have the appropriate state animations play.
我已经看过之前提到过的基于磁贴的设计,但我可以在上面的两个不同的键盘尝试中得到我想要的东西 . 当然,我可以在不重新设计整个瓷砖的情况下获得两全其美的效果?!请帮帮我!
1 回答
得到它了 . 我没有告诉你在解析当前运动之前应该清除_1522357的速度 . 抱歉 . 所以,你添加这个:
进入函数
enterFrameHandler
的开头,这应该让你的char去正确的方式 .