首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多按键AS3键盘控制的字符动画问题

多按键AS3键盘控制的字符动画问题
EN

Stack Overflow用户
提问于 2014-01-25 15:47:17
回答 1查看 2.1K关注 0票数 0

我有一个键盘控制的字符在游戏中有一个固定的框架,而不是

按下键和四个不同的动画为向上,向下,左,右方向

(无对角线运动)。

因此,当按左键时,_character向左移动到屏幕上,然后播放左边的动画。当键被释放/按上键时,固定帧会在字符仍然存在的地方播放。

这很好的一个缓慢的速度,但当多个键被按在周围的障碍等,人物往往坚持静止的位置,只有在延迟后才播放动画。动画片的运动速度很好,但动画却受到影响。

这肯定和钥匙处理程序有关。我是一个初学者,所以我肯定我无法理解一些简单的逻辑,但我无法理解它!请帮帮我。无论我敲击键有多快,我都需要那个动画来播放,只有当没有东西被按下时,我才能看到静止的图像。

在它自己的类中的字符,带有速度变量。

代码语言:javascript
复制
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侦听器增加了。

代码语言:javascript
复制
_stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
            _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 

在enterFrame中,字符X和Y的位置与速度有关

代码语言:javascript
复制
private function enterFrameHandler(event:Event):void
        {   
            //Move the game character and check its stage boundaries
            _character.x += _character.vx; 
            _character.y += _character.vy;
        }

按键处理程序使用箭头和WASD来控制速度,并播放特定帧的方向(使用嵌入式动画)。

代码语言:javascript
复制
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);
            }   
        }

按键处理程序停止速度并播放第一帧,即静止图像。

代码语言:javascript
复制
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 of正方形组成的网格。字符为50 is,50 is盒(与碰撞检测)在它们周围有一个50 is的边框,这样角色就可以在舞台上机动。

如果我按下/按住一个方向,角色就没有问题(从左到右,从上到下也可以。)但如果我向左然后向下或向上然后右转等等,角色就会沿着这个方向移动,然后在方框周围继续这个方向。当我在没有盒子的情况下进行测试时,字符继续沿着这个方向斜转。

所以,如果我想顺时针绕着一个盒子转(从它的左下角开始),我会按下,然后向右,如果我不太快地按下,角色会向上和向右移动,向舞台的右上角移动。(如果释放键,字符就会停止。)

所以,如果我按两个来自相反的向上或左右变量的键,它想要对角移动。有什么办法解决这个问题吗?

最终更新

维斯珀的回答解决了我最初的动画问题。我将提出新的问题来处理其余的查询。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-25 18:16:36

你实际上有四个事实上独立的密钥状态,向上键按下/释放,向下键,左键,右键。从技术上讲,在一次按下两个相反的键时,可以实现特殊操作,在您的情况下,不需要这样做,但仍然值得一提。所以,你把它们分开处理,然后选择你的角色应该面对的地方。

代码语言:javascript
复制
    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。现在,根据按下的键对实际字符的运动进行解析。最好的地方是进入帧处理程序-好东西,你已经在适当的地方。

代码语言:javascript
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21352644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档