动作脚本 3. 继续动画直到最后一帧而不中断

Posted

技术标签:

【中文标题】动作脚本 3. 继续动画直到最后一帧而不中断【英文标题】:Action Script 3. Continue animation till last frame without interrupting 【发布时间】:2013-09-25 18:26:20 【问题描述】:

我正在创建 Flash 游戏。这里有 3 种具有不同动画的不同攻击(键盘绑定 z、x、c)。

问题 #1

例如如果我使用attack1(通过单击“z”)它会显示大约100帧的动画,但是如果在动画期间我点击attack2(x)它会取消attack1动画并开始播放attack2动画。我需要在动画期间制作它不能被其他动画打断。

问题 #2

如果我使用attack1(通过单击“z”)并按住“z”动画会冻结,直到我释放“z”按钮。如果我在开始播放动画后单击任何攻击按钮并且不能通过单击同一按钮来中断/暂停,我需要这样做。

在最后一帧的每个攻击影片剪辑中,我添加了代码MovieClip(this.parent).gotoAndStop("stay");,在攻击动画播放后它开始播放“停留”动画(这部分工作)。

key_down 函数:

private function key_down(event:KeyboardEvent)

    if (event.keyCode == 90)
    
        attack1 = true;
    
    if (event.keyCode == 88)
    
        attack2 = true;
    
    if (event.keyCode == 67)
    
        attack3 = true;
    


key_up 函数:

private function key_up(event:KeyboardEvent)


    if (event.keyCode == 90)
    
        attack1 = false;
    
    if (event.keyCode == 88)
    
        attack2 = false;
    
    if (event.keyCode == 67)
    
        attack3 = false;
    

startAttack() 函数

private function startAttack() 

            if (attack1)
            
                Hero.gotoAndStop("attack1");
            
            if (attack2)
            
                Hero.gotoAndStop("attack2");
            
            if (attack3)
            
                Hero.gotoAndStop("attack3");
            

【问题讨论】:

【参考方案1】:

在 startAttack 中,您可以检查是否有一些攻击在起作用。您可以使用状态或检查帧来确定是否可以开始新的攻击。

【讨论】:

【参考方案2】:

在您的代码中,Hero 可以同时以 3 种方式进行攻击,但据我所知,您不希望这样。那么你为什么要制作三个单独的变量。 制作一个并将其命名为“攻击”。它的值将是攻击类型的数量。 您还可以创建一个将攻击编号映射到键码的数组:

var codes:Array = new Array(0, 90, 88, 67);
var attack:Number = 0;

并在您的 key_up 和 key_down 函数中使用它。现在,您可以添加新的攻击,而无需在函数中创建额外的 if。

key_down:

if(attack > 0) return; // don't interrupt other attack
for(var c in codes) 
  if(codes[c] == event.keyCode) 
      attack = c;
      Hero.gotoAndStop("attack" + attack);
  

key_up:

for(var c in codes) 
  if(codes[c] == event.keyCode) 
      if(c == attack) attack = 0;
  

startAttack() 是多余的。

【讨论】:

感谢您的回答,但我收到错误:code[1] = 9;.... : 1120: Access of undefined property code. 和其他 1120: Access of undefined property codes. 在此行中的 3 个错误for(var c in codes) 我这里没有 Flash,所以我自己编写了一个代码。现在,应该会更好。 谢谢,这对问题 #2 有效。单击同一个按钮无法中断,但如果在攻击 1 动画期间仍然使用攻击 2 动画进行中断。如何解决? 我认为攻击动画在按键被按下时会持续。如果持续时间较长,则应设置attack=0;在动画的最后一帧而不是 key_up 函数【参考方案3】:

不被打断的最好方法是在攻击正在进行时有一个标识符。在这种情况下,最好有一个布尔 inAttackMode(或任何东西)来测试它是否是。这是基于你的例子

private function key_down(event:KeyboardEvent)

    if (event.keyCode == 90)
    
        attack1 = true;
        inAttackMode = true;
    
    if (event.keyCode == 88)
    
        attack2 = true;
        inAttackMode = true;
    
    if (event.keyCode == 67)
    
        attack3 = true;
        inAttackMode = true;
    




private function startAttack() 
                if(!inAttackMode)
                if (attack1)
                
                    Hero.gotoAndStop("attack1");
                
                if (attack2)
                
                    Hero.gotoAndStop("attack2");
                
                if (attack3)
                
                    Hero.gotoAndStop("attack3");
                
    

然后把你的

MovieClip(this.parent).gotoAndStop("stay");
    inAttackMode = false;

或者更好的是为每个攻击分配标识符,例如 inAttackMode1 为真,然后其他攻击还不能播放。

【讨论】:

以上是关于动作脚本 3. 继续动画直到最后一帧而不中断的主要内容,如果未能解决你的问题,请参考以下文章

什么是关键帧动画

动作脚本 3. 如何在角色的底部制作阴影?

中断内部 foreach 循环并继续外部 foreach 循环

PHP ImageMagick 在每一帧动画 Gif 中改变颜色

互联网中断时继续尝试与服务器通信

使用 JavaScript 中断 iOS 滚动