Войти
Gamedev LectureСтатьи

Лекция #24. GUI Revisited. Подробная лекция. [Лектор - Cool Ace]

Автор:

Disclaimer: некоторые опечатки поправлены. полный лог

[23:04:58] <coolace> значит захотелось как то раз GUI сделать 1 раз и так чтобы его юзать везде
[23:05:52] <coolace> для этого нужно было придумать как например не париться с внедрением новых контролов в редактор будующий
[23:06:42] <coolace> вобщем нужен был рефлекшн новых контролов
[23:07:33] <coolace> для этого сделана была система свойств, с которыми контрол работет и может предоставлять их полный список
[23:08:18] <coolace> с именами и типами чтобы в редакторе автоматически заполнять панель редактирования выбранного контрола
[23:09:10] <coolace> причем сам контрол для своих вычислений использует те же самые свойства
[23:09:55] <coolace> свойства добавляются динамически в вектор и потом по имени можно его получить
[23:10:49] <coolace> не особо это хорошо можно переделать, но пока так суть в том чтобы все свойства контрола
[23:11:32] <coolace> не какие то промежуточные состояния а именно то что однозначное его инициализирует рефлектилось
[23:13:03] <coolace> значит так же сделаны обработчики событий, те их список тоже можно получить и к каждому привязать пользовательский обработчик
[23:14:18] <coolace> пользовательский обработчик это функтор(в макросы обернутый для простоты), который регистрируется в системе и при надобности получается его копия
[23:14:44] <coolace> к ней биндятся параметры если они нужны и исполнятся
[23:15:39] <coolace> обработка сообщений(событий) состороны контрола состоит из 3х этапов
[23:16:00] <coolace> а не рано еще про это :)
[23:17:04] <coolace> терминологии не много которую я буду использовать
[23:18:16] <coolace> процессор сообщения - функция которая обрабатывает сообщение на низком уровне
[23:18:54] <coolace> пример: ProcessClick()
[23:20:21] <coolace> обработчик - вирт функция которую можно переопределить если нужно в потомке изменять некие промежуточные данные
[23:20:41] <coolace> пример OnClick
[23:21:24] <coolace> пользовательский обработчик - то что рулит игрой или тем чем нужно
[23:22:11] <coolace> вот значит в принципе промежуточный кровень можно убрать, но иногда удобным оказалось
[23:22:23] <coolace> например в кнопках
[23:22:39] <coolace> те менять текстуру принаведении
[23:23:38] <coolace> процессоры сообщений регистрируются в классе и биндятся к определенным типам сообщений
[23:24:29] <coolace> извлекают из них параметры и параметры эти передают пользовательскому и системному обработчику
[23:24:55] <coolace> здесь же проводится валидация этих параметров
[23:25:09] <coolace> все понятно пока?

[23:25:39] <coolace> значит как приходят сообщения....
[23:26:00] <R|lecture> можешь пример простой менюшки (контрола) и обработчика в коде изобразить? было бы понятнее глядя на код, я думаю
[23:26:08] <R|lecture> извини, что перебиваю
[23:26:27] <coolace> могу щас
[23:27:21] <coolace> void DefaultAction::Execute()
[23:27:21] <coolace> {
[23:27:21] <coolace>  ActionParameters::action_parameters_list::const_iterator i;
[23:27:21] <coolace>  for(i = input_parameters.GetParameters().begin(); i != input_parameters.GetParameters().end(); ++i)
[23:27:21] <coolace>  {
[23:27:22] <coolace>    if (i->name == "action_name")
[23:27:24] <coolace>    {
[23:27:26] <coolace>      std::string report_string = "Не найден обработчик с именем: " + boost::get<std::string>(i->value);
[23:27:28] <coolace>      GUI_LOG_2("DefaultAction::Execute(): ", report_string);
[23:27:30] <coolace>    }
[23:27:32] <coolace>  }
[23:27:34] <coolace> }
[23:27:38] <R|lecture> лучше было, конечно, в everfall.com/paste
[23:27:49] <coolace> понимаю :)
[23:27:57] <coolace> щас
[23:30:37] <coolace> http://www.everfall.com/paste/id.php?iq2qece9qm09
[23:30:46] <coolace> во разобрался
[23:32:17] <coolace> значит там лежит код пользовательского обработчика типа открывающего окно, он нигде не используется ибо код устарел но выглядит это именно так
[23:32:57] <coolace> в качестве тела такой вещи пишется любой пользовательский код вобщем
[23:33:13] <coolace> все это оформляем в макрос
[23:33:36] <coolace> для компактности так сказать
[23:34:24] <coolace> вот на чем я остановился
[23:36:12] <coolace> так вот приходят сообщения
[23:37:04] <coolace> раньше они передавались по дереву контролов пока не будут обработаны и всплавали
[23:37:30] <coolace> контролы организованы как composite
[23:37:54] <coolace> пришел к выводу что такой метод передачи лажа полная
[23:38:59] <coolace> сейчас все по другому, в случае пользовательского сообщения мы его отправляем по имени либо по указателю
[23:39:15] <coolace> имена могут быть не уникальны
[23:39:51] <coolace> поэтому иногда лучше по указателю, хотя это доступно только на низком уровне
[23:40:21] <coolace> в случае с инпутом все интереснее
[23:40:39] <coolace> мы их отправляем "по координатам" :)
[23:41:25] <coolace> конечно не прямо так, а находим самый верхний приемщик инпута и ему по указателю флем сообщение
[23:42:16] <coolace> это можно кешировать так что время приема сообщения именно тем кто его должет принять станет константным
[23:43:10] <coolace> раньше сообщения были асинхронными те складывались в очередь а потом вся очередь обрабатывалась
[23:43:38] <coolace> опыт показал что лажа это...
[23:44:05] <coolace> непонятно откуда пришло битое сообщение например
[23:44:30] <coolace> вот теперь сообщения синхронны
[23:44:48] <coolace> обрабатывается сразу после закрытия
[23:45:27] <coolace> и записывать их можно а потом проигрывать
[23:45:36] <coolace> так же как и раньше
[23:46:18] <coolace> + временные задержки равномерно распределены а не так что пришло 1000 сообщений и игра подвисла
[23:46:35] <coolace> только из за цикла :)

[23:47:23] <coolace> вопросы по поводу сообщений есть? я щас код покажу
[23:49:53] <coolace> http://www.everfall.com/paste/id.php?6o6fceispxkz
[23:49:57] <coolace> вот пример
[23:51:43] <coolace> это на самом деле обернутое сообщение на изменение свойств
[23:52:02] <coolace> но смысл всегда такой же
[23:52:43] <coolace> те открыли сообщение - набили его параметрами - закрыли сообщение
[23:53:18] <coolace> в момент закрытия оно обрабатывается
[23:54:11] <coolace> http://www.everfall.com/paste/id.php?kw5zqcvfw11b
[23:54:27] <coolace> это сообщение от мыши в чистом виде
[23:55:20] <coolace> пауза 3 мин перекур, дальше про свойства подробно

[23:55:44] <Zeux> вопросы, пожелания
[23:58:05] <coolace> ну если нет вопосов то продолжаем
[23:59:30] <coolace> свойства содержит в себе значение, имя, и связи с другими свойствами других контролов
[00:00:30] <coolace> с именем и значением все понятно, а вот зачем нужны связи и динамическое добавление совйств хотябы в редакторе рассморю подробно
[23:57:14] <coolace> значит классическая проблема всех систем с которыми я работал до этого (3 штуки)
[23:57:58] <coolace> это то что программисту игровому нужно знать тип контрола и метод для задания того или иного параметра
[23:59:16] <coolace> а это значит тесное переплетение вобщем то низкоуровнего кода GUI в стиле FindContol("label_armor")->SetCaption(armor)
[23:59:40] <coolace> с игровым
[00:00:07] <coolace> вот чтобы решить проблему сделал так
[00:00:40] <coolace> в данном примере еще и имя окна надо знать
[00:02:24] <coolace> в моем случае тоже имя окна и имя свойства которое представляет собой игровой термин добавляется и связывается с низкоуровневым именетм свойства конкретного контрола ужее в редакторе
[00:03:21] <coolace> можно написать его описание и генерить документацию и код полной поддержки окна останется только параметры передать и все
[00:04:23] <coolace> они сами попадут куда нужно, а куда нужно может меняться часто и меняет это сборщик окон без какого бы то нибыло вмешательства программиста
[00:04:43] <coolace> главное чтобы имена и типы совпадали
[00:05:13] <coolace> хотя типы могут и не совпадать а связь идти через какой либо фильтрл
[00:07:20] <coolace> вот пример сгенереного кода
[00:07:21] <coolace> http://www.everfall.com/paste/id.php?015r8okp7m88
[00:08:21] <coolace> это облегчило жизнь просто охренеть как если честно
[00:08:56] <coolace> еще больше облегчило жизнь когда это заработало в связке с шаблонами
[00:09:27] <coolace> шаблон - готовая сборка компонент которая много где используется
[00:10:05] <coolace> те у шаблона есть связанные свойства с его внутренними компонентами, которые тоже могут быть шаблонами
[00:10:26] <coolace> и свзь может быть с из связанными свойствами :)
[00:10:56] <coolace> все это в конечном итоге выводится в свойства окна
[00:11:43] <coolace> про шаблоны интересно послушать или и так все ясно?
[00:13:36] <coolace> ладно пока расскажу про абстрагирование от движка и локализацию, потом про шаблоны если кого заинтересует
[00:14:56] <coolace> значит абстрагирование это нужно понятно зачем... вобщем хотел вытянуть из прошлого проекта некий код гуя и понял что это невозможно из за дикого переплетения
[00:15:13] <coolace> его с низкоуровневым кодом рендера и инпута
[00:15:38] <coolace> значит абстрагироваться решил так..
[00:15:52] <coolace> паттерн bridge
[00:16:35] <coolace> + пустые реализации интерфейсов задаваемые по умолчанию
[00:17:07] <coolace> для того чтобы если вдруг нету звуковой реализации то подсовывалать пустышка

Страницы: 1 2 3 Следующая »

13 мая 2006

Комментарии [1]