![]() |
|
||||||||||
|
|||||
|
Добрый день. Проблема в следующем:
Есть у меня класс обработки нажатий клавиш, который занимается тем, что выкидывает события нажатия каких-то определенных клавиш. То есть сам он отслеживает просто факт нажатия и отпускания, а диспатчит отдельные события по кнопкам (например событие StateChangeEvent.JUMP). Все эти события изначально должен был отслеживать класс, определяющий перемещения в зависимости от найденных столкновений. Все было хорошо, пока не поменялось ТЗ и не пришлость делать факт нажатия клавиши "Выстрел" совершенно отдельно от перемещения. Мое упрощенное решение - отслеживать нажатия клавиши "выстрел" в объекте игрока, а не в классе проверки столкновений. И, собственно, сама проблема - объект проверки нажатия клавиш по иерархии никак не связан с объектом игрока. Иерархия схематически следующая: Объект проверки столкновений еще меняет значение "состояние" игрока, и эта схема работала хорошо пока ТЗ не поменялось. Раньше на 3 состояния выстрела (стоя, во время ходьбы, в прыжке) отводилось три разных состояния. Сейчас состояние выстрела совершенно не зависит от того, в каком положении находится игрок. ----------- Кто подскажет, есть ли способ передать событие вьюшке персонажа? А если нет, то может какое-то другое "архитектурное" решение есть? Заранее спасибо |
|
|||||
|
Если ещё не дошли до решения, и не лень на это потратить время, накидайте немного кода с примерами, как чего вызывается. А то на картинке всяко можно нарисовать, а проблема, мне, например, не понятна.
Ну и самое банальное - нарисуйте стрелочки: Если у A есть ссылка на B, то от А к B идет стрелочка. А если A подписался на событие B, то от A к B идёт пунктирная стрелочка. Если оба друг на друга ссылаются - 2 стрелочки. Пару основных методов, которые эти актёры друг у друга вызывают напишите. |
|
|||||
|
Со всеми заморочками я совсем забыл, что у меня в проверке столкновений уже есть ссылка на игрока.
Решением было просто вызвать паблик функцию игрока при получении события нажатия клавиши выстрела, без всяких новых регистраций слушателей. НО эта проблема заставила таки подумать над идеей передачи событий дочерним объектам. То есть по сабжу Мы можем передать событие ВНИЗ, а не на тот же уровень и не вверх? Я где-то что-то мельком видел про notifyChildren но погуглив не нашел толковых статей или ответов |
|
|||||
|
как то все заморочено )..не проще передавать ссылку на папу по иерархии вложенности внутрь и там его обвесить слушателями?...таким образом все получаетели будут довольны...тока отписываться не забываем
Добавлено через 56 секунд даже не так..там папа и не нужен..нужна ссылка на диспатчера нужного события..кто им будет - вам виднее.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Цитата:
Но если ребёнок - это DisplayObject, то _чаще_ проще передать ему некий объект, который содержит данные и диспетчит события при их изменении. На ADDED_TO_STAGE подписываемся на этот объект На REMOVED_FROM_STAGE - отписываемся. Но если это не DisplayObject - то чтобы такое провернуть нужно _очень_ хорошо представлять, когда объект активен, а когда нет. Там уже простые решения не прокатывают, часто просто запрещается этим объектам не на что-либо подписываться |
|
|||||
|
cleptoman, expl, спасибо за наводки, буду обрабатывать
![]() Хотя я этот подход (вы оба описали одно и то же, как я понял), я использовал для вызова методов без наличия событий, то есть по простым условиям. Мне почему-то казалось, что такой же подход для событий - путь через забор. Надо попробовать в общем, спасибо |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Паттерн Обсервер еще посмотрите между делом.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 01:57. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|