繁体   English   中英

AS3键盘控制字符-多次按键动画问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM