2015-02-24 81 views
0

我在这个问题上花了14个小时。这是一个基本的碰撞检查器,可以在发生碰撞时设置MovieClip动画播放。该剪辑是如何停止在Flash CS6 AS3中播放动画片段(使用Box2D)

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; 


        } 

       } 
      } 
     } 

我加入这个代码删除影片剪辑或以某种方式摆脱它,它已经通过一次打后。 (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(),然后动画不播放。它只是加载最后一帧。

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

编辑:我得到了帕特里克的代码运行没有错误。

我添加事件侦听器与其他这样的:

_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始终位于每个对象的最后一帧。

回答

0

if if clip is MovieClip then then you can use clip.totalFrames in an enterframe listener。

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); 
+0

谢谢。但我得到这些错误。 未定义的方法addEventListener通过ref。静态类型的类。 访问未定义的属性oEF。 正在使用像“lightball.addEventListener(Event.ENTER_FRAME,oEF” 轻球是库中的剪辑名称,我不明白如何让我的剪辑成为'这个'。 – 2015-02-24 22:31:25

0

我想通了。

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

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

上述块进入右后

变种currentBallObject =球[I];

它检查动画片段的最后一帧,然后得到由& clip.y设置clip.x为0。我找不到任何其他办法来阻止影片在这种特殊情况下摆脱夹。