我有一个运行Enter_Frame的函数,并在函数期间补间它。我知道你可以使用object.y = object.y + 1而不是我现在正在使用的TweenLite。但TweenLite给出了我想要的最佳效果。我现在的问题是,我想删除enter_frame函数,当它没有相互冲突时。但是当我跟踪hitTestObject时,它就像一个瞬间,其中hitTestObject结果返回'false'。所以补间不能真正完成第一次,并且在对象仍然在碰撞时删除enter_frame早期。
private function checkCollision (e:Event):void
{
//detect collision in array
for (var j:uint = 0; j < collisionArray.length - 1; j++)
{
for (var k:uint = j + 1; k < collisionArray.length; k++)
{
if (collisionArray[j].hitTestObject(collisionArray[k]))
{
//do something
TweenLite.to (objectA,0.2,{y:move2Y});
TweenLite.to (objectB,0.2,{y:move3Y});
}
trace (collisionArray[j].hitTestObject(collisionArray[k]));
}
}
}
答案 0 :(得分:0)
您的问题是,在调用checkCollision方法后0.2秒内,补间程序才会完成。
如果在ENTER_FRAME中调用此方法,则将不断覆盖现有的补间。试想一下--ENTER_FRAME调用checkCollisions,checkCollisions将启动一些补间,在补间有时间完成之前,下一个ENTER_FRAME触发,再次调用checkCollisions并启动相同对象上的补间,因为补间还没有完成重新定位对象。
你最好的选择可能是根本不使用ENTER_FRAME - 运行checkCollisions,为相交对象启动补间,如果有交叉对象,则在0.2秒后再次调用chechCollisions(一旦补间完成)
private function checkCollision (e:Event):void
{
var collisionsDetected:Boolean = false;
//detect collision in array
for (var j:uint = 0; j < collisionArray.length - 1; j++)
{
for (var k:uint = j + 1; k < collisionArray.length; k++)
{
if (collisionArray[j].hitTestObject(collisionArray[k]))
{
//do something
TweenLite.to (objectA,0.2,{y:move2Y});
TweenLite.to (objectB,0.2,{y:move3Y});
collisionsDetected = true;
}
trace (collisionArray[j].hitTestObject(collisionArray[k]));
}
}
//you might want to make the timeout a little longer than 200ms,
//to make sure that the tweens have completed when it fires.
//you can figure out the best delay based on your framerate
if(collisionsDetected) setTimeout(checkCollision, 250);
}