Понедельник, 21.05.2018, 09:08
Мир Irrlicht
Главная | Форум | Статьи | Файлы | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Irrlicht » Обсуждение движка » Переключение состояний Irrlicht
Переключение состояний Irrlicht
ShadoWalkeRДата: Вторник, 25.05.2010, 18:50 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Такой вопрос - кто нибудь уже пытался реализовать на Irrlicht переключение состояний - Главное меню, Игра, Пауза и тд? И если пробовали, то хотелось бы узнать о том что именно пробовали сделать
 
greenyaДата: Среда, 26.05.2010, 18:34 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 32
Репутация: 1
Статус: Offline
Сам я не занимался этой задаче, не приходилось.
Но думается, по простому можно закодировать это флагами и ветвлениями, НО я вот хорошая тему на офф сайте о менеджере состояний (http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=19949). "Плюс" такого подхода будет в том, что добавление новго состояния будет простым.

П.С.: если не знаешь английского, то хотябы посомтри исходный код который есть в сообщении первом.

 
RAngerДата: Понедельник, 31.05.2010, 15:59 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 13
Репутация: 0
Статус: Offline
Самое простое переключение состояний - в техдемке иррлихта)) Я дорабатывал эту систему и пользовался. В сущности получалось, что каждое состояние - класс - наследник от IEventReceiver))) Просто и понятно.
EventReceiver лихта - штука очень гибкая, благодаря возможности обработки пользовательских сообщений ( на этом всё переключение и реализовано ).
Главное меню, пауза и игра отличаются друг от друга только начинкой - начинку можно менять хоть между каждыми 2-мя кадрами, так что вбрасываем сообщение, останавливающее главный цикл, меняем начинку, вбрасываем сообщение на запуск ( уже в другой обработчик событий ),- например так. Архитектурных вариантов масса. Отличное поле для творчества ( в самом запущенном случае создавали на каждое состояние по /*движку*/ девайсу и рулили этим извращением biggrin ) ))


Сообщение отредактировал RAnger - Понедельник, 31.05.2010, 16:00
 
ShadoWalkeRДата: Вторник, 01.06.2010, 20:38 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Я сейчас через EventReceiver меняю переменную GameState, которая отвечает за состояние. Но отрисовка идет с косяками - главное меню если его создаю - рисуется всюду. Городить огород с проверкой состояния и видимостью элементов - не хочется. А создавать элемент внутри функции - не хочу - получается, что он в каждом кадре будет пересоздаваться. Хотя щас в голову идея пришла - создаем меню в глобальных переменных, а потом присваиваем их локальным - по идее внутри функции должны существовать, а вне не отрисовывааться.

К примеру:
GameEngine.cpp
как глобальные переменные файла - элементы меню и прочее
Внутри функций существуют в виде локальных переменных с областью видимости только внутри функций
main.cpp
Вызов функций GameEngine.cpp - Пока состояние Главное меню и вызвана функция, на экран выводится главное меню, переходим в другое состояние, оно не существует

Сообщение отредактировал ShadoWalkeR - Вторник, 01.06.2010, 20:38
 
greenyaДата: Вторник, 01.06.2010, 21:05 | Сообщение # 5
Admin
Группа: Администраторы
Сообщений: 32
Репутация: 1
Статус: Offline
ShadoWalkeR,
если тебе нужно быстро спрятать какуюто часть ГУИ или нодов сцены, то просто группируй их характерно. потом просто родительский нод (или ГУИ элемент) прячешь простым setVisble(false) и все. Когда надо, назад отображаешь аналогично.
 
ShadoWalkeRДата: Среда, 02.06.2010, 15:56 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Я пробовал - дочерние элементы отказываются напрочь прикрепляться к родительскому - их ID элемента не устраивает
 
RAngerДата: Четверг, 03.06.2010, 23:32 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 13
Репутация: 0
Статус: Offline
Не может такого быть))
Если у тебя код подобен коду ниже ( как greenya тебе советовал ), то всё должно работать как часы.

Code
par = guienv->addWindow ( core::recti ( 1,1,400,400 ), false, 0, 0, 100 );
par->setDrawTitlebar ( false );
par->setDraggable ( false );
par->getCloseButton()->setVisible ( false );
guienv->addButton ( core::recti ( 5,5,140,50 ), par, 101, L"BUG1", L"UGOG1" );
guienv->addButton ( core::recti ( 5,55,140,100 ), par, 102, L"BUG2", L"UGOG2" );
guienv->addButton ( core::recti ( 5,105,140,150 ), par, 103, L"BUG3", L"UGOG3" );

проверяй)
 
ShadoWalkeRДата: Пятница, 04.06.2010, 17:26 | Сообщение # 8
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Спасибо - понял почему не прикреплялось - у тебя имя родительского объекта - объявленная переменная, а я вешал на его ID в инициализации - в туториале упустил этот момент
 
RAngerДата: Понедельник, 07.06.2010, 00:45 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 13
Репутация: 0
Статус: Offline
А если отжигать с id, то довольно громоздко выходит:
Code
#define GUIENV_SEARCH( a ) guienv->getRootGUIElement()->getElementFromId ( a, true )
#define GUIENV_SEARCH_DEF( a ) guienv->getRootGUIElement()->getElementFromId ( a )
  guienv->addWindow ( core::recti ( 1,1,400,400 ), false, 0, 0, 100 );
  static_cast < gui::IGUIWindow* > ( GUIENV_SEARCH_DEF ( 100 ) )->setDrawTitlebar ( false );
  static_cast < gui::IGUIWindow* > ( GUIENV_SEARCH_DEF ( 100 ) )->setDraggable ( false );
  reinterpret_cast < gui::IGUIWindow* > ( GUIENV_SEARCH_DEF ( 100 ) )->getCloseButton()->setVisible ( false );
  guienv->addButton ( core::recti ( 5,5,140,50 ), GUIENV_SEARCH_DEF ( 100 ), 101, L"BUGOGA1", L"UGOGOGA1" );
  guienv->addButton ( core::recti ( 5,55,140,100 ), GUIENV_SEARCH_DEF ( 100 ), 102, L"BUGOGA2", L"UGOGOGA2" );
  guienv->addButton ( core::recti ( 5,105,140,150 ), 0, 103, L"BUGOGA3", L"UGOGOGA3" );
  GUIENV_SEARCH_DEF ( 100 )->addChild ( GUIENV_SEARCH ( 103 ) );

Но иногда приходится делать именно так))
 
Форум » Irrlicht » Обсуждение движка » Переключение состояний Irrlicht
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2018 Создать бесплатный сайт с uCoz