![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#31 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Гром, из темки про игры в дельфи перешёл сюда, странно, но, не довелось эту тему читать, хотя раздел вроде как весь прошерстил.
Игра понравилась, интересно сделан антураж, да и исполнение на высоте (конечно, учитывая, что в графике Ваш уровень невысок, но сделано с душой: полутона, мелочи), хелпник доставляет. В темке уважаемые программисты обсуждают на мой взгляд несущественные программные моменты (физмодель перемещения, отрисовку, таймеры), меня же заинтересовал самый, на мой взгляд, существенный - попиксельная интеракция в движке (это легко заметить по кнопочкам стрелок-меча, она подсвечивается именно в месте соприкосновения курсора с картинкой меча, а не ректом или какой другой вычисляемой областью). Поскольку делано на канве, то я предположу, что сделано руками, а не движком. Интересно как Вы это сделали (я сам такое сделал у себя в проекте), обменяться так сказать премудростями. Я могу пока что предположить 2 варианта, первый - по ректу (полный цикл по объектам на экране с перебором координат) вычисляется над каким объектом сейчас мышь и для картинки объекта производится проверка на цвет пикселя - "прозрачный" или нет (по координатам мыши и ректу объекта сопоставляя с картинкой или её маской в памяти), если нет то активируется действие. Второй вариант - для кадра заготавливается маска кадра, где некий буфер размером с экран хранит индексы объектов согласно маске картинки, т.е. на итоговом буфере каждая точка соответствует координатам на кадре и если на данных координатах лежит "непрозрачная" точка объекта, то храним индекс объекта и к нему обращаемся для интеракции. Вот такие у меня мысли, прошу рассказать как оно по факту. |
![]() |
![]() |
![]() |
#32 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
phomm, да, все сделано вручную, наведение курсора на объект меню осуществляется по первому варианту (только в противоположном порядке). Проверяется цвет пикселя под курсором (прозрачный или нет), если непрозрачный - проверяем, над каким объектом курсор находится (по прямоугольной области) и запоминаем это. При рисовании или нажатии кнопки мыши учитываем.
Еще, кстати, в недрах соответствующих функций происходит проверка необходимости перерисовки (если курсор только что был над элементом, а теперь - нет; и наоборот), и рисуем только если картинка должна быть изменена.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#33 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
У меня ближе ко второму варианту.
Весь кадр представляет из себя буфер куда рисуется иерархия объектов, послойно (одна группа из иерархии - это бэки - они рисуются на самый нижний слой и из этого слоя производится вырезка подложек для изменившихся объектов), остальные объекты маскируются попиксельно и записываются ссылками в объект контейнер, при изменениях перерисовываются. При взаимодействии объектов с мышкой или друг с другом они получают оповещение и как-то реагируют, согласно своему классу. Плюс ещё на объекты можно подвязать реакцию на клавиатуру. Плюс есть реакции на таймер и т.п. подсистемы. Таким образом строится пиксельно-активный интерфейс, который имеет разнообразное поведение, но все обрабатывается в контейнере, получается очень малый клиентский код. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Pacman | Merkator | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 13 | 12.02.2011 13:58 |
Прошу чуточку помочь. пишу игру Pacman на Turbo C++... | Олегус | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 4 | 20.05.2009 23:57 |
Пишу Pacman. Нужна помощь. | AngelOfDeath | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 12 | 07.10.2008 14:34 |