我制作了一个类似迷宫的游戏,玩家通过箭头或WASD控制舞台周围的动画片段(_character)并在一定时间内收集东西。 MovieClip有五个不同的帧,每个帧都有自己的状态动画,左,右,上,下和静止。
在舞台上有正方形/方框,有碰撞检测,我需要能够在不同的方向上绕它们进行操纵。
我的问题是,我似乎无法在动画片段和中获得动画,同时动画片段本身正常运动。
我当前的控件可以很好地锁定障碍物,当没有按下按键时停止并播放相关的_字符动画,但是当按下两个对角线方向键时,即使我释放其中一个键,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);
与盒子碰撞。^^^
旁注
不确定它的重要性,但我的旧键盘方法只使用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控件。
结论
我不知道碰撞检测或键盘控制是否应该受到责备,但我希望能够快速操纵播放器Movieclip,并让各种状态动画播放。
我之前看到过基于磁贴的设计,但我可以在上面的两个不同的键盘尝试中得到我想要的东西。当然,我可以在不重新设计整个瓷砖的情况下获得两全其美的效果?!请帮帮我!
答案 0 :(得分:1)
知道了。我没有告诉你在解析当前运动之前应该清除_character
的速度。抱歉。所以,你添加这个:
_character.vx=0;
_character.vy=0;
在开始时进入函数enterFrameHandler
,这应该使你的char正常运行。