Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача события дочернему объекту (http://www.flasher.ru/forum/showthread.php?t=195885)

KumoKairo 15.03.2013 09:33

Передача события дочернему объекту
 
Вложений: 1
Добрый день. Проблема в следующем:
Есть у меня класс обработки нажатий клавиш, который занимается тем, что выкидывает события нажатия каких-то определенных клавиш. То есть сам он отслеживает просто факт нажатия и отпускания, а диспатчит отдельные события по кнопкам (например событие StateChangeEvent.JUMP). Все эти события изначально должен был отслеживать класс, определяющий перемещения в зависимости от найденных столкновений.

Все было хорошо, пока не поменялось ТЗ и не пришлость делать факт нажатия клавиши "Выстрел" совершенно отдельно от перемещения.

Мое упрощенное решение - отслеживать нажатия клавиши "выстрел" в объекте игрока, а не в классе проверки столкновений. И, собственно, сама проблема - объект проверки нажатия клавиш по иерархии никак не связан с объектом игрока. Иерархия схематически следующая:
Вложение 29274

Объект проверки столкновений еще меняет значение "состояние" игрока, и эта схема работала хорошо пока ТЗ не поменялось. Раньше на 3 состояния выстрела (стоя, во время ходьбы, в прыжке) отводилось три разных состояния. Сейчас состояние выстрела совершенно не зависит от того, в каком положении находится игрок.
-----------
Кто подскажет, есть ли способ передать событие вьюшке персонажа? А если нет, то может какое-то другое "архитектурное" решение есть?
Заранее спасибо

PainKiller 15.03.2013 11:10

Если у вас MVC (судя по вьюшкам) то все зависит от её реализации, обычно есть способы доставить инфу во вьюху, а чтобы ответить более конкретно слишком мало данных.

expl 15.03.2013 21:03

Если ещё не дошли до решения, и не лень на это потратить время, накидайте немного кода с примерами, как чего вызывается. А то на картинке всяко можно нарисовать, а проблема, мне, например, не понятна.
Ну и самое банальное - нарисуйте стрелочки: Если у A есть ссылка на B, то от А к B идет стрелочка. А если A подписался на событие B, то от A к B идёт пунктирная стрелочка. Если оба друг на друга ссылаются - 2 стрелочки. Пару основных методов, которые эти актёры друг у друга вызывают напишите.

KumoKairo 16.03.2013 00:42

Со всеми заморочками я совсем забыл, что у меня в проверке столкновений уже есть ссылка на игрока.

Решением было просто вызвать паблик функцию игрока при получении события нажатия клавиши выстрела, без всяких новых регистраций слушателей.

НО эта проблема заставила таки подумать над идеей передачи событий дочерним объектам. То есть по сабжу

Мы можем передать событие ВНИЗ, а не на тот же уровень и не вверх? Я где-то что-то мельком видел про notifyChildren но погуглив не нашел толковых статей или ответов

cleptoman 16.03.2013 13:25

как то все заморочено )..не проще передавать ссылку на папу по иерархии вложенности внутрь и там его обвесить слушателями?...таким образом все получаетели будут довольны...тока отписываться не забываем

Добавлено через 56 секунд
даже не так..там папа и не нужен..нужна ссылка на диспатчера нужного события..кто им будет - вам виднее.

expl 16.03.2013 13:44

Цитата:

Мы можем передать событие ВНИЗ, а не на тот же уровень и не вверх? Я где-то что-то мельком видел про notifyChildren но погуглив не нашел толковых статей или ответов
В одном редакторе так делал, руками, в цикле перебирал детей просто. Чтобы не делать подписку-отписку внутри детей.

Но если ребёнок - это DisplayObject, то _чаще_ проще передать ему некий объект, который содержит данные и диспетчит события при их изменении.
На ADDED_TO_STAGE подписываемся на этот объект
На REMOVED_FROM_STAGE - отписываемся.

Но если это не DisplayObject - то чтобы такое провернуть нужно _очень_ хорошо представлять, когда объект активен, а когда нет. Там уже простые решения не прокатывают, часто просто запрещается этим объектам не на что-либо подписываться

KumoKairo 16.03.2013 22:40

cleptoman, expl, спасибо за наводки, буду обрабатывать :)
Хотя я этот подход (вы оба описали одно и то же, как я понял), я использовал для вызова методов без наличия событий, то есть по простым условиям. Мне почему-то казалось, что такой же подход для событий - путь через забор. Надо попробовать в общем, спасибо

mikhailk 16.03.2013 23:38

Паттерн Обсервер еще посмотрите между делом.


Часовой пояс GMT +4, время: 01:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.