![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
зачем мне кого-то высмеивать? не надо так бурно реагировать на невинные шутейные пассажи)))
Цитата:
если говорить общо, то "контроллер" - это нечто, имеющее что-то на входе и на выходе на входе я имею нажатия/отжатия клавиш, на выходе фильтрованные события Не думайте, что я ставлю себя выше вас - это не так. Я представляю свое видение, вы - свое. Вы можете соглашаться или наоборот. Можете меня даже переубедить - я только рад буду, что меня ткнули носом туда, где я косячу. Но пока я не вижу весомых аргументов своей неправоты.
__________________
скриптограф |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
1. Если говорить общо, то контроллер "чего-то" - это нечто, отдающее "чему-то" управляющие команды. Клавиатура - контроллер. Но "контроллер клавиатуры" это пользователь. Ваше определение "что-то на входе и на выходе" слишком "общо" и подходит к чему угодно, т.е. никак не конкретизирует функциональность объекта на уровне определения - контроллер или адаптер, или конвертер, или драйвер, или просто дисплей? На этом уровне определений "контроллер" - "то что отдает команды". То, что хотите получить Вы - контроллер персонажа, контроллируемый клавиатурой. Это о терминах. Используйте термины правильно, и Вас будут "слышать" и "понимать". Используйте свои определения, и все вокруг станут глухими идиотами, предлагающими "совсем не то".
2. Игры посложнее "пройти из точки А в точку В" занимаются расчетом и визуализацией СОСТОЯНИЙ. Как ни парадоксально, события нажатия клавиш в них дело десятое. Это вопрос архитектуры, что удобнее - слушать события или отображать состояние модели каждый интервал времени. У клавиатуры всего два события, но сотни состояний. Фактически клавиатура является моделью персонажа, и "блокнот" silin'a здесь как никогда уместен. То, что написали Вы - представляет клавиатуру как источник сигналов, то, что класс silin'a имеет на входе. Другими словами, чтобы пользоваться Вашим классом, надо написать к нему аналог класса silin'a, создающий модель из тех же событий "нажата" и "отпущена". Ваше разделение на отдельные события непродуктивно - если при нажатии клавиши надо сделать что-то сложнее "начать смещаться вправо в полной пустоте" (х++) и нужны проверки ВЗАИМОДЕЙСТВИЯ с миром, в конечном итоге все обработчики будут вызывать один и тот же метод "изменить состояние модели персонажа" в контроллере сцены или персонажа, передавая ему еще какой-то код-константу, в реальности содержащий все тот же "нажали W". И в этом методе контроллера будет ровно столько же if'ов и switch'ей, как если бы Вы получили простое событие клавиатуры и проверяли "W? делаем то-то - а именно - проверяем текущее СОСТОЯНИЕ персонажа и мира и вносим изменения, если они допустимы". Не слишком ли долгий путь для простого стандартного события клавиатуры? Ваше мнение?
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
1. Можно спорить до бесконечности. Можно даже спорить "контроллер клавиатуры" - это тот, кто жмет на клавиатуру, или это чип, встроенный в клаву и выдающий сигналы (знаете такое выражение "контроллер клавы сгорел" - человек сгорел? о, майн гот)))) Соответственно программный контроллер выдает программные сигналы.
Выключатель (например света) - это контроллер: человек жмет выключатель (дает на вход сигнал состояния тумблера), контроллер делает внутреннее действие (замыкает/размыкает внутренний участок цепи) и на выходе мы имеем результат "замкнут/разомкнут". И, заметьте, никем он не управляет. Если к нему подключить лампочку, или группу лампочек (навесить слушатель), то благодаря состояниям контроллера на выходе, они будут загораться/тухнуть. С таким же успехом можно подключить радио к тому же переключателю. При этом наш переключатель абсолютно никем не управляет целенаправленно - т.е. он не был создан только включать/выключать лампочки - он был создан давать на выходе состояние (отсылать событие), чтобы все, кому надо, им пользовались. Вы хотите сказать, что человек - это контроллер выключателя? Я б обиделся за человека))) 2. Я не мешаю в одной куче проверку состояний объекта в мире и команды, которые объект должен получить. У меня подход такой: существует пул ф-ий, который обрабатывается в слушателе смены кадров или событий таймера. На основе этого пула персоонаж выполняет действия. Если команда дана, она должна быть обработана - пусть это делает отдельный поведенческий класс, который уже решает, что добавить в пул. Что это дает? Интерактивный объект не зависит ни от чего - он вещь в себе. На него вешается любой поведенческий класс и любой контроллер. И никто друг о друге ничего не знает и друг на друга не завязан. Единственное, что я сейчас рассматриваю вариант не вешать отдельное событие на каждое действо контроллера, а отсылать общее событие "changed" в результате которого брать пул текущих состояний - слушатель один, смысл тот же. P.S. забудьте определения из MVC - окружающий мир и, в частности, ООП на MVC не заканчиваются.
__________________
скриптограф Последний раз редактировалось orcpochta; 01.05.2010 в 14:01. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
1. Хаха. Выключатель - контроллер тока в цепи.
2. Цитата:
Цитата:
p.S. Когда я начинал писать свою первую игру, я понятия не имел об MVC - я и сейчас-то не очень представляю, что там происходит. И первое, что я написал - класс для удобного назначения клавиш. Ирония в том, что назывался он у меня KeyboardController)). Только разница в том, что я был нуб нубом, а Вы даже знаете MVC))) Я хочу сказать, что забывай-не забывай, называй как хочешь, а всегда останется клавиатура/мышь, системник и монитор. И все Ваши действия будут обрабатываться контроллером, который создаст модель изображения и отдаст его монитору. Хотите предложить другой вариант - валяйте. Почему я использую понятные большинству термины - контроллер и модель - я уже сказал выше. Но руководствуюсь я обычной человеческой логикой, т.е. по-другому устройство просто не представляю. А как там это называется на программерском сленге - мне как-то все равно. Это - естественное состояние вещей, и уходить от него если и можно, то точно не имеет смысла. Вы сделайте игру, и все само встанет на свои места. Даже в обычном пустом лабиринте Вы не сможете двигать шарик влево, не проверив наличие стен. Так что нет никакого "поведенческого класса", есть система мир+персонаж, и персонаж не выполняет какие то действия, пришедшие прямо с клавиатуры - что ему делать, решает... простите, контроллер на основе модели. Как бы Вы их ни называли. Слушаю Ваш вариант управления персонажем. Управления, которое ничего кроме персонажа не знает и никак на мир не завязано.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Выключатель - контроллер всегда. Только его иногда не "слушают")))
Транзистор тоже только на плате является транзистором? Если брать игры в общем, а не подкатегорию, на которую вы сейчас опираете, то можно вспомнить всякие арканоиды, дезерт страйки и т.д., где надо двигать персоонаж, а окружающий мир второстепенен. Игры, где идет взаимодействие с окружающим миром, - это подкласс. У меня есть контроллер для всего класса игр, с помощью нехитрых фокусов он будет взаимодействовать и с вашим подклассом. В чем проблема-то?
__________________
скриптограф Последний раз редактировалось orcpochta; 01.05.2010 в 16:06. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Ну вот у меня сейчас есть вертолет с трехфазным движением вперед/назад и поворот лево/право. Трехфазность заключается в том, что есть плавный разгон, движение на предельной скорости, плавное торможение. Все организовано предельно ясно и отлично работает при совместном нажатии клавиш (например вперед и влево). Без всяких ифов, кейсов и т.д. Смотрю и радуюсь. И я не вижу, какие еще манипуляции мне надо произвести - все уже работает предельно четко и корректно.
__________________
скриптограф |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Подкатегория... Щас мозг лопнет, не могу придумать игру с персонажем, не взаимодействующим с миром. В чем же геймплей? Это команды "почесать нос" и "закурить". Или игра "Вы стоите посреди плоской пустыни, дойдите до края" - и то придется проверять, дошел или нет. Я серьезно. О каких играх Вы говорите? Цитата:
Задам Вам Ваш же вопрос - как Вы собираетесь использовать этот класс? Что будет происходить дальше, там где сейчас стоят трейсы типов событий? Можно на варианте с одним обработчиком, не важно... (...Вы просили указать косяк, я высказываю свое мнение...) Добавлено через 21 минуту Летающий в пустоте вертолет - принято. Хороший пример. А игра в чем?
__________________
Reality.getBounds(this); |
|
|||||
|
Как оказалось, моё мнение разделяют и другие люди, это радует.
По поводу контроллеров клавиатуры - говорите "контроллер сигналов клавиатуры", тогда это будет уже более ясно. Лично мне кажется, что "контроллер" звучит круто, поэтому многие так обзывают свои классы. Но это бред, класс можно называть и матерными словами, лишь бы работало. По теме: есть кнопки на клаве, которые игрок нажимает. Их слушает главный герой, всё ок, но нет взаимодействия с миром. Но если мир тоже будет их слушать - будет всё ок. Персонаж и мир не будут связаны, но их логика будет идти 2 раза. То есть мир не спросит у персонажа - "как дела?", а мир сам просчитает, как дела у персонажа и примет решение. Лично я считаю что это чертовски неудобно и глупо. Но у автора есть своё мнение и право идти так, как хочет он - это хорошо, о сложностях в дальнейшем его предупредили. Но когда каждый объект в мире должен слушать клавиатуру и она не реализует статичные методы, т.е. каждому объекту надо передавать ссылку на "контроллер" клавиатуры - это уже откровенная глупость. Ну, автор не хочет подумать на берегу - все начинали с малого, на ошибках учатся, причем тут откровенное желание на них поучится. Я и слился. А так да, подпишусь под каждым словом Wolsh`а.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: May 2010
Сообщений: 3
|
Вот уж не знаю, сюда ли этот вопрос:
Конкретная ситуация - скрипт нормально обрабатывает нажатия всех кнопок (влево, вверх, вправо, вниз), нормально отрабатывает нажатие двух одновременно кнопок, но, при, например, зажатых влево и вверх не хочет больше принимать никаких кнопок. Например: при движении вправо вверх пробелом можно стрелять, а влево вверх не получается. Как с этим бороться? |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:26. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|