在输入时,输入Frame不会精确检测到hitTestObject

时间:2010-08-19 11:13:29

标签: actionscript-3 collision-detection enterframeevent

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

1 个答案:

答案 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);
        }