我花了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始终位于每个对象的最后一帧。
答案 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.在这种特殊情况下,我找不到其他方法来阻止电影。