【问题标题】:Flash AS3; how to play an entire animation then stop闪存 AS3;如何播放整个动画然后停止
【发布时间】:2014-04-30 03:04:09
【问题描述】:

我目前正在尝试制作“攻击”动画。但是必须有一个冷却时间(大约 2-3 秒)。

虽然我可以做到这一点,但我目前遇到的问题是动画中断了。我所追求的是完整播放动画,然后倒计时开始。

我尝试使用自定义调度事件。但是,因为对象被放入数组中。我尝试在其他地方遵循一些建议,但似乎没有一个有效。如果我在将对象推入数组后尝试直接添加事件侦听器,我要么得到错误"A term is undefined and has no properties"(IEenemy[i].addEventListener(...))

或者,如果我尝试将侦听器添加为对象的变量,则会收到错误 "addEventListener is not a function"(IEenemy.addEventListener(...);)

我还尝试了使用 while 循环的更简单的方法(AI 发起攻击,触发 while 循环,增加一个整数直到达到 100 左右,然后退出并重置为 0。在 while 循环期间, boolean AI/角色是否可以攻击是假的。当它退出时,它也重置为真)但问题是,它切断了动画。

如果对如何对攻击速度进行简单的冷却有任何建议,请提供帮助。我已经发布了我认为相关的程序部分(涉及创建敌人并推动它,AI 如何确定它是否攻击,以及涉及攻击的部分等);

public function addEnemies()
    {
        enemies = new Array();
        var i:int = 1;
        while(true)
        {
            attackDone = cooldown(i);
            if(gameLevel["enemy"+i] == null) break;
            var enemy = new Object();
            enemy.aI = true;
            enemy.mc = gameLevel["enemy"+i];
                            //....
                            //OTHER VARIABLES
                            //....
            enemy.attackAnimation = new Array (26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40)
                            //....
            enemy.animStep = 0;
                            //....
                            //....
            enemy.attack = false;
                            //....
            enemy.cooldown = 0
            enemy.canAttack = true;
                            //....
                            //....
            enemy.addEventListener("ATTACK_DONE", attackDone);
            enemies.push(enemy);
            i++;
        }
    }

确定人工智能做什么;

public function moveEnemies(timeDiff:int)
        {
            for(var i:int = 0; i<enemies.length; i++)
            {
                //Move the enemies
                moveCharacter(enemies[i], timeDiff);

                enemies[i].playerDistance = player.mc.x - enemies[i].mc.x;
                if(enemies[i].playerDistance < 0)
                {
                    enemies[i].playerDistance = -enemies[i].playerDistance;
                }

                //If hit something, reverse direction
                if(enemies[i].hitWallLeft)
                {
                    enemies[i].moveLeft = true;
                    enemies[i].moveRight = false;
                    enemies[i].attack = false;
                }
                else if(enemies[i].hitWallRight)
                {
                    enemies[i].moveLeft = false;
                    enemies[i].moveRight = true;
                    enemies[i].attack = false;
                }

                if(enemies[i].playerDistance <= 10)
                {
                    enemies[i].moveLeft = false;
                    enemies[i].moveRight = false;
                    if(enemies[i].canAttack)
                        enemies[i].attack = true;
                }
            }
        }

执行攻击;

public function moveCharacter(char:Object, timeDiff:Number)
        {
            if(timeDiff < 1) return;


                            //.......
                            //.......
            //Key Press
            var horizontalChange = 0;
            var newAnimState:String = "stand";
            var newDirection:int = char.direction;

            //Test Assumptions
            //Move Left             

                                    //.......
                                    //.......

                //attack
                if(char.attack)
                {
                    newAnimState = "attack";
                }


                       //.......
                       //.......
                       //.......
                       //.......
                       //.......
                       //.......
                       //.......
                       //.......
                       //.......
                       //.......

            //Set new position of Character
            char.mc.x = newX;
            char.mc.y = newY;
                       //.......
                       //.......
                       //.......

            char.animState = newAnimState;
                       //.......
                       //.......
                       //.......
                       //.......

            else if(char.animState == "attack")
            {
                char.animStep += timeDiff / 60;
                if(char.animStep > char.attackAnimation.length)
                {
                    char.animStep = 0;
                }
                char.mc.gotoAndPlay(char.attackAnimation[Math.floor(char.animStep)]);


            }

                       //.......
                       //.......

        }

【问题讨论】:

    标签: actionscript-3 flash animation side-scroller


    【解决方案1】:

    addEventListener 必须在 EventDispatcher 上调用 - 一个可以分派您正在等待的事件的类。

    你尝试在一个简单的对象上调用它:

    var enemy = new Object();
    enemy.addEventListener("ATTACK_DONE", attackDone);
    

    这就是您收到此错误的原因。您应该创建自己的自定义类来调度此事件。

    而且,当你开始你的动画时,没有地方可以发送它。它应该在电影的最后一帧,或者你应该做一些代码来知道动画何时结束(寻找帧标签;设置计时器;关键帧上的调度事件,或任何你喜欢的)。

    【讨论】:

    • 嘿,谢谢,是的,我在动画的最后一帧有一个 dispatchEvent。我会试一试:)
    • 那么最简单的尝试方法是:enemy.mc.addEventListener IF mc 是您拥有dispatchEvent 的位置。试试这个,如果你需要,你可以创建一个类:) 干杯!
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多