Создание пользовательского события:
Во-первых, вы, вероятно, захотите создать свой собственный класс событий, который будет расширяться Event
.Это объясняется тем, что вы можете добавить свойства, которые вам, вероятно, понадобятся в функции прослушивания.
Ваше основное событие начнется с того, что будет выглядеть так:
public class PhysicsEvent extends Event
{
public function PhysicsEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
{
super(type, bubbles, cancelable);
}
}
ПервоеВозможно, вы захотите добавить к вашему событию некоторые константы, которые представляют тип события, которое вы собираетесь отправлять.В качестве примера вы можете добавить:
public static const COLLISION:String = "collision";
Это может представлять событие, которое происходит при обнаружении столкновения между двумя объектами.
Некоторая информация, к которой вы, возможно, захотите получить доступкогда произошло столкновение, это может включать двух участников столкновения и, возможно, некоторую числовую информацию, такую как угол между участниками, а также расстояние.Вы также можете добавить их в свой пользовательский класс событий:
public var p1:GameEntity;
public var p2:GameEntity;
public var angle:Number;
public var distance:Number;
В целом ваш класс должен выглядеть следующим образом:
public class PhysicsEvent extends Event
{
public static const COLLISION:String = "collision";
public var p1:GameEntity;
public var p2:GameEntity;
public var angle:Number;
public var distance:Number;
public function PhysicsEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
{
super(type, bubbles, cancelable);
}
}
Отправка события:
К сожалению, вам все равно нужно будет использовать Event.ENTER_FRAME
, чтобы пройти по всем игровым объектам и проверить на столкновения, как вы делаете в настоящее время.Обычно вы должны иметь класс Physics
или аналогичный, который содержит список всех ваших физических объектов и проверяет наличие столкновений между ними каждый раз, когда вы заканчиваете перемещать все свои игровые объекты.
Функция, которая оценивает возможные коллизии, может выглядеть примерно так:
for each(var a:PhysicsObject in physicsObjects)
{
for each(var b:PhysicsObject in physicsObjects)
{
if(a == b) continue; // Prevent objects from colliding with themselves.
// Check for a collision between a and b.
}
}
Когда есть коллизия между a
и b
, вы сможете подготовиться к отправке экземпляра вашегособытие с информацией о них, например:
// Collision was detected, prepare an event for dispatch.
var evt:PhysicsEvent = new PhysicsEvent(PhysicsEvent.COLLISION);
Затем вам нужно будет назначить некоторую информацию для вашего события, прежде чем вы сможете отправить его:
evt.p1 = a;
evt.p2 = b;
evt.angle = <insert angle math. hint: Math.atan2>;
evt.distance = <insert distance math. hint: pythag>;
И, наконец, выможет отправить это событие:
dispatchEvent(evt);
Прослушивание:
Предполагая, что вы отправили свое событие из экземпляра класса, который имеет дело с физикой игры, вы можете прикрепитьслушатель события этого экземпляра.Это может выглядеть так:
physics.addEventListener(PhysicsEvent.COLLISION, onCollision);
Подготовьте функцию прослушивания:
function onCollision(e:PhysicsEvent):void
{
// Todo.
}
И заполните эту функцию, чтобы делать все, что вам нужно делать с двумя сталкивающимися объектами:
function onCollision(e:PhysicsEvent):void
{
// Push participants away from each other.
e.p1.x -= Math.cos(e.angle) * (e.distance/2);
e.p1.y -= Math.sin(e.angle) * (e.distance/2);
e.p2.x += Math.cos(e.angle) * (e.distance/2);
e.p2.y += Math.sin(e.angle) * (e.distance/2);
}
Надеюсь, это поможет.