Показать сообщение отдельно
Старый 24.03.2016, 06:27
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
У тебя вообще какая-то каша в коде. Я думал ты уже давно понял, что нейп - это чисто математика, он к дисплей листу вообще никакого отношения не имеет, и глупо искать у него каких-то родителей. У нейпа есть только пространство Space, в котором и происходят все вычисления.
Мне не понятны у тебя две вещи:
1) У тебя тело создается не в том объекте, к которому оно принадлежит что ли?
2) Почему ты не используешь для этого стандартные события нейпа? То, что у тебя сделано с событиями - это такой дикий костыль, что просто жесть)

Я делаю просто. У меня физическое тело персонажа создается в самом классе персонажа, которому оно принадлежит. А подписывается оно на события примерно так:
Вот метод из рабочей игры:

Код AS3:
protected function createPhysBody():void {
 
	var bodyWidth:	int					= dip(70) * p_totalCharScale;
	var bodyHeight:	int					= dip(25) * p_totalCharScale;
	_physBody							= new Body(BodyType.DYNAMIC);
	_physBody.allowRotation				= false;
	_mainShape							= new Polygon(
		Polygon.regular(bodyWidth, bodyHeight, 4)
	);	
	_mainShape.userData.object			= this;
	_mainShape.cbTypes.add(CallbackTypes.playerPhysCbType);
	_physBody.shapes.add(_mainShape);
	_physBody.mass						= 30;
 
	var shapeWidth:Number				= bodyWidth * p_totalCharScale;
	_feelerShape	= new Polygon(
		Polygon.rect( -p_hitZoneWidth * .5, 
		-p_hitZoneHeight * 2, 
		p_hitZoneWidth, p_hitZoneHeight)
	);
	_feelerShape.userData.object		= this;
	_feelerShape.sensorEnabled			= true;
	_feelerShape.cbTypes.add(CallbackTypes.heroSensorCbType);
	_physBody.shapes.add(_feelerShape);
	var enemyWeaponLis:InteractionListener	= new InteractionListener(
		CbEvent.BEGIN, 
		InteractionType.SENSOR, 
		CallbackTypes.heroSensorCbType, 
		CallbackTypes.enemyWeaponCbType, 
		onEnemyWeaponCollision
	);
	var inclineBeginLis:InteractionListener	= new InteractionListener(
		CbEvent.BEGIN, 
		InteractionType.SENSOR, 
		CallbackTypes.playerPhysCbType, 
		CallbackTypes.inclineCbType, 
		onInclineCollision
	);
	var inclineEndLis:InteractionListener		= new InteractionListener(
		CbEvent.END, 
		InteractionType.SENSOR, 
		CallbackTypes.playerPhysCbType, 
		CallbackTypes.inclineCbType, 
		onInclineCollision
	);
	// обработка лестниц
	var ladderBeginLis:InteractionListener	= new InteractionListener(
		CbEvent.BEGIN, 
		InteractionType.SENSOR, 
		CallbackTypes.playerPhysCbType, 
		CallbackTypes.ladderCbType, 
		onLadderCollision
	);
	var ladderEndLis:InteractionListener		= new InteractionListener(
		CbEvent.END, 
		InteractionType.SENSOR, 
		CallbackTypes.playerPhysCbType, 
		CallbackTypes.ladderCbType, 
		onLadderCollision
	);
 
 
	var explosionListener:InteractionListener	= new InteractionListener(
		CbEvent.BEGIN, 
		InteractionType.SENSOR, 
		CallbackTypes.heroSensorCbType, 
		CallbackTypes.effectCbType, 
		onEffectCollision
	);
	//  чтобы потом было проще удалять все слушатели циклом, или добавлять их в Space
	_listeners.push(
		enemyWeaponLis,
		inclineBeginLis,
		inclineEndLis, 
		explosionListener,
		ladderBeginLis,
		ladderEndLis
	);
 
}
Все типы колбэков нейпа занесены в статические константы, и доступны по все игре
Код AS3:
package  {
	import nape.callbacks.CbType;
 
	public class CallbackTypes {
 
		public static const enemyCbType:		CbType 	= new CbType();
		public static const enemyPhysCbType:	CbType 	= new CbType();
		public static const npcCbType:			CbType 	= new CbType();
		public static const obstacleCbType:		CbType 	= new CbType();
		public static const playerSensorCbType:	CbType 	= new CbType();
		// это для проверок типа вижу / не вижу
		public static const playerPhysCbType:	CbType 	= new CbType();
		public static const bulletCbType:		CbType 	= new CbType();
		public static const effectCbType:		CbType 	= new CbType();
		public static const feelerCbType:		CbType 	= new CbType();
		public static const inclineCbType:		CbType 	= new CbType();
		public static const ladderCbType:		CbType 	= new CbType();
		public static const roomKeyCbType:		CbType 	= new CbType();
 
		public static const enemyWeaponCbType:	CbType 	= new CbType();
		public static const wallCbType:			CbType 	= new CbType();
 
 
 
		public function CallbackTypes() {
 
		}
 
	}
 
}
То есть если создается тело оружия врага, то ему добавляется колбэк enemyWeaponCbType,
и, свой персонаж уже сможет определить, что он столкнулся с оружием врага, к примеру.

Ну и наконец обработчик столкновения с оружием врага
Код AS3:
private function onEnemyWeaponCollision(collision:InteractionCallback):void {
	if (_dead || _immortal || _isFalling || _isJumping) return;
	var shape1:	Shape		= collision.int1.castShape;
	if (shape1.userData.object == this) {
		var hitterBody:	Body 		= collision.int2.castBody;
		if (hitterBody.userData.object is ColdWeaponPhysicsBase) {
			var coldWeapon:ColdWeaponPhysicsBase = hitterBody.userData.object as ColdWeaponPhysicsBase;
			if (coldWeapon.backsOff) {
				// нужно ли отбрасывать ударом?
				//backOff(dip(70));
			}
			if (coldWeapon.falls) {
				var direction:int  = hitterBody.position.x > physX ? -1 : 1;
				scaleX = -direction;
				quickFallAnimation();
			}
			health -= coldWeapon.power;
		}
	}
}
Как видишь, при столкновении с оружием врага, у персонада сразу отнимается соответствующий процент здоровья, и не нужно ничего никуда диспатчить
__________________
Ко мне можно и нужно обращаться на ты)