0

我有一个运行 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]));
                }
            }
        }
4

1 回答 1

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);
        }
于 2010-08-19T21:37:46.123 回答