![]() |
Некоторые мысли о контроллерах клавиатуры
Предположим, нужно нам заиметь контроллер клавиатуры - абстрактно это будет нечто вроде: висит себе где-то какой-то объект и слушает нажатия/отпускания клавиш, фильтрует их в соответствии со своими задачами и на выходе выдает какие-то события.
Сразу пример, чтобы легче представить: в игре слушает нажатия различных кнопок, отфильтровывает из них кнопки LEFT, RIGHT, UP, DOWN (и дубляж A, D, W, S), режет повторения, если кнопка уже нажата, и рассылает соответствующие события "leftPressed"/"leftReleased", "rightPressed"/"rightReleased" и т.д... Чтобы слушать события нажатий клавиш всей сцены контроллеру придется вешать слушатели на stage, и тут возникает следующая делема: 1) Чтобы нормально обрабатывать те моменты, когда stage доступен/недоступен контроллеру придется быть DisplayObject-ом. Минимально-весомый, вроде, Shape. Но тут начинает коробить то, что нашему контроллеру приходится обзаводиться функциональностью, которая ему совершенно не нужна - как-то не айс. 2) Можно передать в конструктор контроллера ссылку на stage, но тогда внешний код должен будет гарантировать, что во время передачи stage доступен, но тут уже возникают всякие проблемы, связанные с тем, почему собственно убрали глобальный _stage из AS3. Как бы вы поступили? Может я чего-то упускаю и есть какие-то совершенно простые элементарные решения? Это не проблема производительности или чего-то там еще, просто хочется понять сам обобщенный подход с точки зрения ООП - т.е. ответ "забей, делай шейп и не парься" не подходит, хотя "так-то оно, конечно, так"...))) P.S. я маразматик - знаю))) |
2) А как stage, переданный по ссылке, может стать недоступным?
|
Цитата:
|
а у меня не должно работать следующее
Код AS3:
|
Цитата:
Цитата:
|
Дружно говорим спасибо silin`у.
Код AS3:
|
Цитата:
Цитата:
первый вариант - получаем то, что совершенно нам не нужно второй вариант - пришли к тому, от чего пытались избавиться в рамках улучшения ООП-шности языка Добавлено через 2 минуты Цитата:
у меня проблем с написанием контроллера не возникает, тут речь о подходах у силина как я понял при беглом просмотре используется второй подход - и? надо правда его более тщательно переварить в связи с тем, что у него статические методы класса используются, но это по сути как переменная (сам класс) в глобальном доступе |
orcpochta, сам не пробовал, но может быть могу помочь:
Есть класс KeyboardEventDispatcher или что-то в этом роде. В Вашем документ классе пишите следушее: Код AS3:
Код AS3:
|
Хм, да вроде опубликовав его класс я согласился с его подходом.
Да, я считаю что некоторые вещи лучше знать только тем, кому их надо знать. А если кому-то надо знать, а он не знает? Сказать. Например, я очень расстроюсь если другой программист по запарке возьмет значение моего класса, примет за своё - ну, например случайно взял и забыл сделать копию массива и манипулирует моим - и поменяет там что нибудь, а мой класс от этого сойдёт с ума. В этом и фишка инкапсуляции - при правильном её использовании хорошо будет всем. Пример абстрактный, но суть понятна. А теперь опа - и у нас stage. Зачем какому нибудь классу для работы с сокетом знать о том, что есть stage? По дефолту - незачем. Так же и с клавиатурой. Исключения, на мой взгляд, составляют 1.5 вещи: работа со звуком и с клавиатурой - с последней наполовину. Со звуком - у меня всегда есть в проекте класс SoundMaster со статическим методом addSound. Туда я передаю, какой звук мне нужно проиграть. Да, можно это реализовать в самих классах, передавать ссылку, но черт возьми, это не удобно. С клавиатурой 50/50, в половине случаев нужно знать, какая кнопка нажата и хорошо бы что-то с этим предпринять, в другой половине удобней сделать без этого, например, в MVC. Обычно кнопки управляют персонажем, меняют его свойства/параметры (не в прыжке/в прыжке, в ударе и т.д.) - достаточно подписать контроллер на клавиатуру, она поменяет модель, а эту модель слушает половина окружающего мира. И собственно, незачем писать велосипеды, которые уже есть. Пока не встречал случаев, когда мне нужен класс для работы с клавиатурой и не подошел бы класс silin`а. |
Цитата:
А в чем подход-то? То, что вы предложили, это своего рода блокнот, который можно открыть и посмотреть запись нажата ли сейчас кнопка и какая нажата последней. Цитата:
incvizitor, вы промахнулись с проблематикой треда))) |
| Часовой пояс GMT +4, время: 18:20. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.