|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Обращение к родительскому классу
Доброго!
Ранее никогда не пробовал писать код с обращением к родителю Что хочу: диспатчить событие в определённый мувик из тела body в Nape. тут происходит столкновение, я хочу отправить событие в родительский класс,в котором был создан body private function defoltCollision(cb:PreCallback):PreFlag { if ((cb.int1.castBody.velocity.y > 0) && (Math.abs(cb.int1.castBody.position.y - cb.int2.castBody.position.y) > 30)) { stage.dispatchEvent(new UserEvent(UserEvent.COLLISION_GROUND_UNIT, true, false)); cb.int1.castBody.velocity.y *= -1; cb.int2.castBody.parent.dispatchEvent(new UserEvent(UserEvent.KILL_UNIT, true, false)); } return PreFlag.IGNORE_ONCE; } unit - это экземпляр класса, в котором создан экземпляр Body public function KillGroundUnit(_unit:MovieClip) { unit = _unit; } override public function init(e:Event):void { super.init(e); this.addEventListener(Event.ENTER_FRAME, updateClip); unit.addEventListener(UserEvent.KILL_UNIT, killUnit); unit.addEventListener(UserEvent.REVIVAL_UNIT, revivalUnit); } Добавлено через 1 час 34 минуты ошибка вылезает тут, т.к. нету parent у Body, вариантов вижу несколько, но всё костыли, которые на выходе выдают, что в несколько классов могут менять один и тотже параметр, что совсем не хорошо, вот хотел через события, дабы избежать зависимостей, но увы Добавлено через 1 час 36 минут public class GroundUnits extends ParentCommon { private var body:Body; private var timer:Timer = new Timer(Math.random() * 4000); public function GroundUnits() { body = new Body(BodyType.KINEMATIC); body.shapes.add(new Polygon(Polygon.box(35, -35))); body.align(); body.userData.tempSpeed = 0; timer.addEventListener(TimerEvent.TIMER, timerUpdateTempSpeed); timer.start(); } Последний раз редактировалось neonoviiwolf; 23.03.2016 в 21:07. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
root, parent, child — это термины DisplayList
parent — не тот, кто создал (такого свойства вообще нет), а тот, кто добавил в свой Список Отображения.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
это я уже выяснил, есть возможность красиво сделать без использования body.userData.***?
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
То, что Вы считали парентом — не может подписаться на событие от Body и передиспатчить его?
Добавлено через 3 минуты Тут два очевидных пути: 1) передиспатчивать событие. То есть генерить его в Body, ловить в его создателе и диспатчить от создателя. Тогда вторая часть (с подпиской) не меняется. 2) Подписываться на событие от Body а не от его "парента"-создателя. Возможно, для этого у создателя надо завести публичную ссылку на экземпляр Body
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Цитата:
Добавлено через 6 минут Цитата:
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
(сразу хочется сказать, что Вы вывернули наизнанку конвенции: приватные члены именуются с андерскора: _body, а публичные и локальные — без.
Сделайте этому свойству геттер Диспатчите событие из body: Подписываетесь тоже на событие от body:
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Wolsh невозможно повесить событие на Body
Добавлено через 6 минут в общем сделал так, но мне не нравится private function defoltCollision(cb:PreCallback):PreFlag { if (cb.int2.castBody.userData.killUnits == false) if ((cb.int1.castBody.velocity.y > 0) && (Math.abs(cb.int1.castBody.position.y - cb.int2.castBody.position.y) > 30)) { stage.dispatchEvent(new UserEvent(UserEvent.COLLISION_GROUND_UNIT, true, false)); cb.int1.castBody.velocity.y *= -1; cb.int2.castBody.userData.killUnits = true; } return PreFlag.IGNORE_ONCE; } ackage classesGame.killUnits { import classesGame.parentsCommon.ParentCommon; import classesGame.userEvent.UserEvent; import flash.display.MovieClip; import flash.events.Event; import nape.phys.Body; public class KillGroundUnit extends ParentCommon { private var _sprite:MovieClip; private var _body:Body; public function KillGroundUnit(sprite:MovieClip, body:Body) { _sprite = sprite; _body = body; } override public function init(e:Event):void { super.init(e); this.addEventListener(Event.ENTER_FRAME, updateClip); } private function updateClip(e:Event):void { if (_sprite.currentFrame == 11) if (_body.userData.killUnits == false) _sprite.gotoAndPlay(1); else _sprite.gotoAndStop(11); } override public function removeInit(e:Event):void { super.removeInit(e); this.removeEventListener(Event.ENTER_FRAME, updateClip); } } } |
|
|||||
У тебя вообще какая-то каша в коде. Я думал ты уже давно понял, что нейп - это чисто математика, он к дисплей листу вообще никакого отношения не имеет, и глупо искать у него каких-то родителей. У нейпа есть только пространство Space, в котором и происходят все вычисления.
Мне не понятны у тебя две вещи: 1) У тебя тело создается не в том объекте, к которому оно принадлежит что ли? 2) Почему ты не используешь для этого стандартные события нейпа? То, что у тебя сделано с событиями - это такой дикий костыль, что просто жесть) Я делаю просто. У меня физическое тело персонажа создается в самом классе персонажа, которому оно принадлежит. А подписывается оно на события примерно так: Вот метод из рабочей игры: 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 ); } 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() { } } } и, свой персонаж уже сможет определить, что он столкнулся с оружием врага, к примеру. Ну и наконец обработчик столкновения с оружием врага 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; } } }
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Цитата:
caseyryan идею я понял, но пока не дорос, сложновато, чтобы с ходу переписать код |
Часовой пояс GMT +4, время: 15:55. |
|
« Предыдущая тема | Следующая тема » |
|
|