На простом уровне:
1) отделяет физику от всего остального: она делает вещи проще и удобнее для повторного использования.
2) пусть каждый физический объект зарегистрирует себя, скажем, с менеджером по физике. вы должны следить за тем, чтобы объект был статическим или динамическим (движущимся) и, возможно, даже флагом формы (если вы только хотели столкнуть определенные объекты с другими объектами). флаг формы - это просто целое число, которое сообщает вам, какой это тип
3) иметь одно событие onEnterFrame, а не входной кадр для каждого объекта. это облегчит вашу жизнь
4) в этом единственном событии onEnterFrame вызовите своего менеджера по физике, чтобы обновить объекты и посмотреть, не сталкиваются ли они. Вы можете проверить столкновения между статическими и динамическими объектами и (возможно) динамическими объектами с другими динамическими объектами. Вы можете использовать флаги формы, чтобы исключить ненужные тесты. Если вы обнаружите столкновение, вы можете отправить событие / уведомить ваши объекты / удалить их из игры.
что-то вроде
private function _init():void
{
// create 4 walls
for( var i:int = 0; i < 4, i++ )
{
var w:Wall = new Wall;
// position and add to stage etc
// add it to the physics manager (they don't need an update)
this._physicsManager.addStatic( w, ShapeFlags.WALL );
}
// create 10 bullets
for( i = 0; i < 10; i++ )
{
var b:Bullet = new Bullet;
// position and add to stage etc
// add it to the update and physics manager
this._updateManager.add( b );
this._physicsManager.addDynamic( b, ShapeFlags.BULLET ); // ShapeFlags is a static class of different types of objects
}
}
private function _onEnterFrame( e:Event ):void
{
// if you're moving your objects based on time, then
// dt is "delta time", i.e., the amount of time that
// has passed since the last update
// you can have an update manager that will move your
// different objects according to their speed.
this._updateManager.update( dt );
// now your objects have moved to their new position,
// get the physics manager (though in fairness, if it's
// only doing collisions, then it should just be a
// collisions manager) to check for collisions
this._physicsManager.update();
// do whatever else
}
Это очень простой пример. Здесь мы перемещаем объекты, а затем проверяем их на наличие столкновений. Вы можете столкнуться с проблемами с объектами, которые движутся слишком быстро и проходят друг через друга, поэтому столкновения не регистрируются. Примерно так:
// frame one: object a is heading towards object b
// and object b is heading towards object a
(a)-> <-(b)
// frame two: because of their speed, they pass through
// each other, and you don't see a collision
<-(b) (a)->
Эта система - самый простой и простой способ сделать это и, вероятно, подходит для многих игр. Если вам нужно более сложное (например, при проверке коллизий между кадрами), то это немного сложнее, но вы все равно можете это использовать.
Обнаружение / реагирование на столкновения - большая тема, и вы можете найти сотни примеров кода в сети. Однако хорошая структура кода может изменить мир.