如何阻止movieClip在Flash CS6 AS3中播放(使用Box2D)

时间:2015-02-24 19:51:20

标签: actionscript-3 box2d flash-cs6

我花了14个小时来解决这个问题。这是一个基本的碰撞检查器,用于设置发生碰撞时要播放的MovieClip动画。剪辑是

  

currentBallObject.clip。

有效。剪辑播放。但它一遍又一遍地重复着。

private function checkCollisions():void
        {
            var i = balls.length;
            while (i--)
            {
                var currentBallObject = balls[i];



                if (currentBallObject.contact)
                { 

                    //condition hits ground
                    if (currentBallObject.ground)
                    {

                    currentBallObject.body.SetPosition(new b2Vec2(currentBallObject.startX / PIXELS_TO_METRE, currentBallObject.startY / PIXELS_TO_METRE));
                    currentBallObject.body.SetLinearVelocity(new b2Vec2(0, 0));
                    currentBallObject.body.SetAngularVelocity(0);

                    //currentBallObject.texture.pop();                                              
                    }
                    else // it hit player
                    {


                            // assign clip texture to current position  
                            currentBallObject.clip.x = currentBallObject.body.GetPosition().x * PIXELS_TO_METRE;
                            currentBallObject.clip.y = currentBallObject.body.GetPosition().y * PIXELS_TO_METRE;

                            // whisk old object away
                            currentBallObject.body.SetPosition(new b2Vec2(currentBallObject.startX / PIXELS_TO_METRE, currentBallObject.startY / PIXELS_TO_METRE));
                            currentBallObject.body.SetLinearVelocity(new b2Vec2(0, 0));
                            currentBallObject.body.SetAngularVelocity(0);
                            currentBallObject.contact = false;


                    }

                }
            }
        }

我添加了这段代码来删除MovieClip,或者在播放一次后以某种方式摆脱它。 (42帧)。我还尝试添加一个frameListener和至少十几个其他建议。当我添加

  

stop()

动画无法播放。它只是加载最后一帧。我现在的代码是:

private function updateClips():void
        {
            var i = balls.length;
            while (i--)
            {
                var currentBallObject = balls[i];

                if(currentBallObject.clip)
                {


                   var frame:int = currentBallObject.clip.currentFrame;
                    //trace(currentBallObject.clip.currentFrame);
                    if(frame == 42)

                      {

                          currentBallObject.clip._visible = false;
                          currentBallObject.clip.removeMovieClip();
                          currentBallObject.clip.enabled = -1;



                      }

                }
            }
        }

我已经尝试过对帧进行计数,将其作为一次运行函数,一个帧退出侦听器,我没有想法。我只想让MovieClip运行一次。我也尝试在时间轴中放置stop()然后动画没有播放。它只是加载了最后一帧。

现在碰撞工作但动画永远停留在屏幕上,永远循环。

编辑:我得到了Patrick的代码,可以毫无错误地运行。

我将事件监听器与其他人一起添加:

_input = new Input(stage);
                    ...
                    addEventListener(Event.ENTER_FRAME, oEF);
                    addEventListener(Event.ENTER_FRAME, update);
                    time_count.addEventListener(TimerEvent.TIMER, on_time);
                    time_count.start();
                }

然后创建了一个函数:

private function oEF(e:Event):void{

            var i = balls.length;
            while (i--)
            {
                var currentBallObject = balls[i];



            if (currentBallObject.clip.currentFrame >= currentBallObject.clip.totalFrames)
            {
              currentBallObject.clip.stop();
              currentBallObject.clip.removeEventListener(Event.ENTER_FRAME, oEF);
              if (currentBallObject.clip.parent) currentBallObject.clip.parent.removeChild(currentBallObject.clip);
            }
        }
        }

但我仍然遇到与其他任何结果相同的问题。如果没有动画发生,MovieClip会在联系时消失。

通过调试,我学到了更多。 currentFrame的值从1-40开始,然后在剩余的执行时保持在40。 因此,MovieClip始终位于每个对象的最后一帧。

2 个答案:

答案 0 :(得分:0)

如果clip是MovieClip,那么您可以在enterframe监听器中使用clip.totalFrames

function oEF(e:Event):void{
    if (this.currentFrame >= this.totalFrames){
      this.stop();
      this.removeEventListener(Event.ENTER_FRAME, oEF);
      if (this.parent) this.parent.removeChild(this);
    }
}

this.addEventListener(Event.ENTER_FRAME, oEF);

答案 1 :(得分:0)

我明白了。

if (currentBallObject.clip.currentFrame == currentBallObject.clip.totalFrames)

                   {
                       trace("Frame before kill: ", currentBallObject.clip.currentFrame);
                       currentBallObject.clip.x = 0;
                       currentBallObject.clip.y = 0;                               
                   }

上面的块就在

之后
  

var currentBallObject = balls [i];

它检查movieClip是否在最后一帧,然后通过设置clip.x&放弃剪辑。 clip.y为0.在这种特殊情况下,我找不到其他方法来阻止电影。