![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Предположим, нужно нам заиметь контроллер клавиатуры - абстрактно это будет нечто вроде: висит себе где-то какой-то объект и слушает нажатия/отпускания клавиш, фильтрует их в соответствии со своими задачами и на выходе выдает какие-то события.
Сразу пример, чтобы легче представить: в игре слушает нажатия различных кнопок, отфильтровывает из них кнопки LEFT, RIGHT, UP, DOWN (и дубляж A, D, W, S), режет повторения, если кнопка уже нажата, и рассылает соответствующие события "leftPressed"/"leftReleased", "rightPressed"/"rightReleased" и т.д... Чтобы слушать события нажатий клавиш всей сцены контроллеру придется вешать слушатели на stage, и тут возникает следующая делема: 1) Чтобы нормально обрабатывать те моменты, когда stage доступен/недоступен контроллеру придется быть DisplayObject-ом. Минимально-весомый, вроде, Shape. Но тут начинает коробить то, что нашему контроллеру приходится обзаводиться функциональностью, которая ему совершенно не нужна - как-то не айс. 2) Можно передать в конструктор контроллера ссылку на stage, но тогда внешний код должен будет гарантировать, что во время передачи stage доступен, но тут уже возникают всякие проблемы, связанные с тем, почему собственно убрали глобальный _stage из AS3. Как бы вы поступили? Может я чего-то упускаю и есть какие-то совершенно простые элементарные решения? Это не проблема производительности или чего-то там еще, просто хочется понять сам обобщенный подход с точки зрения ООП - т.е. ответ "забей, делай шейп и не парься" не подходит, хотя "так-то оно, конечно, так"...))) P.S. я маразматик - знаю)))
__________________
скриптограф |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
где я такое сказал?))) там сказано, что в момент инициализации контроллера, надо гарантировать что передается то, что нужно))) т.е. должно во внешнем коде слушаться наличие stage
__________________
скриптограф |
|
|||||
|
[+1 19.06.10]
[+1 27.07.10] Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
|
а у меня не должно работать следующее
???
__________________
Trapatatupatupa |
|
|||||
|
Цитата:
Цитата:
__________________
O God! The Aftermath. |
|
|||||
|
Дружно говорим спасибо silin`у.
package silin.utils { import flash.display.*; import flash.events.*; /** * отслеживание нажатых клавиш * @author silin */ public class Key { private static var _keys:Array = []; private static var _stage:Stage; private static var _enabled:Boolean=true; public static function register(stage:Stage):void { _stage = stage; _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); } private static function keyUpHandler(evnt:KeyboardEvent):void { for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == evnt.keyCode) _keys.splice(i, 1); } } private static function keyDownHandler(evnt:KeyboardEvent):void { var key:int = evnt.keyCode; for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == key) return; } _keys.push(key); } public static function isKeyDown(key:int):Boolean { for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == key) return true; } return false; } public static function get lastPressed():int { return _keys.length ? _keys[_keys.length - 1] : 0; } static public function get enabled():Boolean { return _enabled; } static public function set enabled(value:Boolean):void { if (_enabled == value) return; _enabled = value; _keys = []; if (_enabled) { _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); }else { _stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler); } } } }
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Цитата:
Цитата:
первый вариант - получаем то, что совершенно нам не нужно второй вариант - пришли к тому, от чего пытались избавиться в рамках улучшения ООП-шности языка Добавлено через 2 минуты поясните, что вы хотели сказать этим примером у меня проблем с написанием контроллера не возникает, тут речь о подходах у силина как я понял при беглом просмотре используется второй подход - и? надо правда его более тщательно переварить в связи с тем, что у него статические методы класса используются, но это по сути как переменная (сам класс) в глобальном доступе
__________________
скриптограф Последний раз редактировалось orcpochta; 30.04.2010 в 15:16. |
|
|||||
|
orcpochta, сам не пробовал, но может быть могу помочь:
Есть класс KeyboardEventDispatcher или что-то в этом роде. В Вашем документ классе пишите следушее: public static var keyboardDispatcher:KeyboardEventDispatcher =new KeyboardEventDispatcher(); |
|
|||||
|
Хм, да вроде опубликовав его класс я согласился с его подходом.
Да, я считаю что некоторые вещи лучше знать только тем, кому их надо знать. А если кому-то надо знать, а он не знает? Сказать. Например, я очень расстроюсь если другой программист по запарке возьмет значение моего класса, примет за своё - ну, например случайно взял и забыл сделать копию массива и манипулирует моим - и поменяет там что нибудь, а мой класс от этого сойдёт с ума. В этом и фишка инкапсуляции - при правильном её использовании хорошо будет всем. Пример абстрактный, но суть понятна. А теперь опа - и у нас stage. Зачем какому нибудь классу для работы с сокетом знать о том, что есть stage? По дефолту - незачем. Так же и с клавиатурой. Исключения, на мой взгляд, составляют 1.5 вещи: работа со звуком и с клавиатурой - с последней наполовину. Со звуком - у меня всегда есть в проекте класс SoundMaster со статическим методом addSound. Туда я передаю, какой звук мне нужно проиграть. Да, можно это реализовать в самих классах, передавать ссылку, но черт возьми, это не удобно. С клавиатурой 50/50, в половине случаев нужно знать, какая кнопка нажата и хорошо бы что-то с этим предпринять, в другой половине удобней сделать без этого, например, в MVC. Обычно кнопки управляют персонажем, меняют его свойства/параметры (не в прыжке/в прыжке, в ударе и т.д.) - достаточно подписать контроллер на клавиатуру, она поменяет модель, а эту модель слушает половина окружающего мира. И собственно, незачем писать велосипеды, которые уже есть. Пока не встречал случаев, когда мне нужен класс для работы с клавиатурой и не подошел бы класс silin`а.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
А в чем подход-то? То, что вы предложили, это своего рода блокнот, который можно открыть и посмотреть запись нажата ли сейчас кнопка и какая нажата последней. Цитата:
incvizitor, вы промахнулись с проблематикой треда)))
__________________
скриптограф Последний раз редактировалось orcpochta; 30.04.2010 в 15:39. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|