Показать сообщение отдельно
Старый 02.07.2010, 23:44
Dos87 вне форума Посмотреть профиль Отправить личное сообщение для Dos87 Найти все сообщения от Dos87
  № 3  
Ответить с цитированием
Dos87

Регистрация: Jun 2009
Сообщений: 39
Думаю не стоит объяснять что такое world, fixture, fixtureDef, body, bodyDef и userData.

Для того, чтобы определить столкновение 2х объектов нужно повесить на игровой мир Box2D прослушиватель столкновений:
Код AS3:
var contactListener:ContactListener = new ContactListener();
world.SetContactListener(contactListener);
Предварительно в userData записываем нужный нам объект:
Код AS1/AS2:
public function set userData(value:*):void
{
	bodyDef.userData = value;
	fixtureDef.userData = value;
}
Класс ContactListener, полное переопределение (Нам потребуется только BeginContact):
Код AS3:
package
{
	import Box2D.Collision.b2Manifold;
	import Box2D.Dynamics.b2ContactListener;
	import Box2D.Dynamics.b2ContactImpulse;
	import Box2D.Dynamics.Contacts.b2Contact;
 
	public class ContactListener extends b2ContactListener
	{
		public override function BeginContact(contact:b2Contact):void
		{
			var obj1:* = contact.GetFixtureA().GetUserData();
			var obj2:* = contact.GetFixtureB().GetUserData();
		}
 
		public override function EndContact(contact:b2Contact):void
		{
 
		}
 
		public override function PreSolve(contact:b2Contact, oldManifold:b2Manifold):void
		{
 
		}
 
		public override function PostSolve(contact:b2Contact, impulse:b2ContactImpulse):void
		{
 
		}
	}
}
3 объекта одновременно столкнуться ни как не могут. В любом случае между столкновениями будет промежуток времени, возможно незначительно маленький. Можем предположить, что разница между столкновениями в 30ms - это всё одно столкновение. Тогда мы можем создать массив столкнувшихся объектов и перед каждым столкновением его обновлять:
Код AS3:
public class CollisionObject
{
	private var __userData:*;
	private var __time:*;
 
	public function CollisionObject(userData:*, time:Number)
	{
		__userData = userData;
		__time = time;
	}
 
	public function get userData(value:*):void
	{
		return __userData;
	}
	public function get time(value:Number):void
	{
		return __time;
	}
}
 
 
private static const MAX_COL_TIME:int = 30;
//Тут все недавно столкнувшиеся объекты
private var collisionArray:Vector.<CollisionObject> = new Vector.<CollisionObject>();
 
public override function BeginContact(contact:b2Contact):void
{
	var obj1:FieldObject = contact.GetFixtureA().GetUserData();
	var obj2:FieldObject = contact.GetFixtureB().GetUserData();
	obj1.hit(obj2);
	obj2.hit(obj1);
 
 
	if (obj1.color == obj2.color)
		if (checkForColor(obj1.color))
		{
			//3 объекта столкнулись
			//тут можно их всех уничтожить
		}
		else
		{
			//тут можно всех добавить
			var time:int = getTimer();
			collisionArray.push(new CollisionObject(obj1, time));
			collisionArray.push(new CollisionObject(obj1, time));
		}
}
private function checkForColor(color:uint):Boolean
{
	//тут проверяем каждый объект в collisionArray.
	//Если он находится в массиве дольше MAX_COL_TIME - удаляем и проверяем дальше,
	//иначе проверяем по цвету.
	//Если совпал - return true,
	//иначе проверяем дальше
}