Показать сообщение отдельно
Старый 07.07.2015, 19:26
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 6  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Делюсь своими наработками, юзаю precollisionHandler для того чтобы, объекты могли проходить только под определённым углом и collisionHandler для отлова нужных столкновений
Код AS3:
package ru.jumper.model.providers
{
	import nape.callbacks.CbEvent;
	import nape.callbacks.CbType;
	import nape.callbacks.InteractionListener;
	import nape.callbacks.InteractionType;
	import nape.callbacks.ListenerList;
	import nape.callbacks.PreListener;
 
	public class CollisionsProvider
	{
		private var _listeners:ListenerList;
		public function CollisionsProvider(listeners:ListenerList)
		{
			_listeners = listeners;
		}
 
		public function bind(emmiter:CbType, target:CbType, callback:Function):CollisionsProvider
		{
			_listeners.add(
				new InteractionListener(
					CbEvent.BEGIN,
					InteractionType.COLLISION, 
					emmiter,
					target,
					callback
				)
			);
 
			return this;
		}
 
 
		public function sensor(emmiter:CbType, target:CbType, callback:Function):CollisionsProvider
		{
			_listeners.add(
				new PreListener(
					InteractionType.COLLISION,
					emmiter,
					target,
					callback,
					0,
					true
				)
			);
			return this;
		}
	}
}
Код AS3:
var cbType1:CbType	= new CbType();
var cbType2:CbType	= new CbType();
 
body.cbTypes.add(cbType1);
body.userData.normal = Vec2.fromPolar(1, Math.PI * 0.5); // задаем вектор указывающий вверх объекта
 
body2.cbTypes.add(cbType2);
body2.userData.normal = Vec2.fromPolar(1, Math.PI * 0.5);
 
 
_napeCollision = new CollisionsProvider( _space.listeners )
		.bind(cbType1,cbType2,collisionHandler)
		.sensor( cbType1, CbType.ANY_BODY, precollisionHandler);
Код AS3:
protected function collisionHandler(collision:InteractionCallback):void {
 
	// вектор столкновения			
	var v1:Vec2 = collision.arbiters.at(0).collisionArbiter.normal;
 
}
Код AS3:
protected function precollisionHandler(cb:PreCallback):PreFlag
{        			
	var v1:Vec2 = cb.arbiter.collisionArbiter.normal;
	var body:Body = cb.int1.castBody;
	var v2:Vec2 = body.userData.normal; 
 
	// Обработчик который пропускает или не пропускает два объекта, в зависимости от вектора столкновения между ними
 
	if (v1.dot(v2) <= 0)
		return PreFlag.IGNORE
	else
		return PreFlag.ACCEPT;
}
Пищи хватит, дальше под свои задачи.

Добавлено через 9 минут
собственно в CollisionsProvider можно заменить
Код AS3:
CbEvent.BEGIN
на
Код AS3:
CbEvent.END
и ловить данные после столкновений
__________________
return this...


Последний раз редактировалось AlexCooper; 07.07.2015 в 19:38.