s.o.v.a
> говономенеджер сосет уже в статье
Это на основе своего опыта ?
war_zes
> 1) переходы между главным меню и игрой - банально и описано в статье
Да ну, максимум три строчки:
extern void st_start(); // 'entry state' extern void ( *g_next_state)( ) = &st_start; // assign new state and issue return to switch to it int main( ) { while( g_next_state ){ g_next_state( ) } };
Свич еще проще.
> 2) большое число экранов что хорошо например для РПГ, в которой начало игры
> может состоять из нескольких экранов - меню, создания партии, создания героя
> которое в свою очередь также может состоять из экранов и т.д. Описано в
> предыдущем посте.
Не вижу проблемы сделать "с возможностью вызова команды ..." в виде вызова функции.
> Вот вздумалось издателю казуала собрать все свои игры в один сборник - благо
> движок у них один, игр допустим штук пятьдесят
У вас отменный рояль в кустах! Все эти игры, конечно, используют одну и ту же версию движка, никак не модфицированную. Ресурсы у них не текут, глобальных статиков нет, и все шестьдесят игр реентерабельны.
Даже в нашей Стране Эльфов такого не бывает.
> вы такого вообще не сможете сделать
> вам скорее всего придется их писать в файлы
доооо, ну ты прям д'Артатьян. Какие-то дичайшие спекуляции о несбыточном. В духе "Морковка полезна для зрения! Я ем морковку, а у вас всех вывалятся глаза!"
> 4) дебаг. ...
> 5) инструментарий из игры. ... Мне не надо комментировать огромные куски кода отвечающие за редактор
Ты не поверишь! #define NDEBUG изобрели более 30 лет назад, а мужики-то не знают!
Очевидно, что нужны не рантайм-модули, а разные билды игры. В релизе редактор с его ресурсами в игре никому не впился - зачем его там оставлять?
Отладка в духе "запусти-ка мне миссию сразу" делается с командной строки, потому и так что очень полезно.
> Подмодули. никто не обратил на это внимание, а зря. Давайте посмотрим на
> скайрим. В игре вы можете вызвать окно инвентаря, окно квестов, окно навыков,
> карту. При этом нельзя открыть сразу два окна.
Кааанешна, погромисты из беседки ниасилили! А то, что окнами квестов, навыков и карты вообще нереально управлять с гейпада - это как бы мы вообще не учитываем. Собственно, скайрим ругают как раз за это - за гейпадоориентированный UI даже на PC. Как по мне, так это вопрос дизайна и ROI, а не погромистского ниасиляторства.
Если UI игры настолько продвинут, что в нем есть своя оконная система, то твои модули там тоже не впились, потому что оконная система обычно сильно сложнее этой херопени и дает больше фич. Например, сама рисует эти самые окна.
Wraith
> Если UI игры настолько продвинут, что в нем есть своя оконная система, то твои
> модули там тоже не впились,
Э... Очень спорный вопрос :)
> > 5) инструментарий из игры. ... Мне не надо комментировать огромные куски кода
> > отвечающие за редактор
> Ты не поверишь! #define NDEBUG изобрели более 30 лет назад, а мужики-то не
> знают!
NDEBUG и EDITOR - очень даже разные вещи ...
innuendo
> NDEBUG и EDITOR - очень даже разные вещи ...
Могу процитировать эпичнейшую фразу, прозвучавшую здесь полтора года назад:
"...вот беда - я не знаю, что делать когда со мной пытается общаться говорящий анальный зонд"
Если у тебя есть что-то рассказать о проблемах применения конструкции switch() в казуальных играх, так говори, не томи. А если нет - ... .
Wraith
> Могу процитировать эпичнейшую фразу, прозвучавшую здесь полтора года назад:
Странно, как только ловят товарища на подтасовке фактов - сразу следует слова про анальный зонд ... помнится, этот проктолог сдулся на вопросе об моих коллегах по работе ...
Могу только ещё раз напомнить, что EDITOR и NDEBUG - сильно не одно и тоже :)
> Если у тебя есть что-то рассказать о проблемах применения конструкции switch()
> в казуальных играх, так говори, не томи. А если нет - ... .
Про казуалочки не скажу - врать не буду, а выше уже сказал про опыт ...
innuendo
> Это на основе своего опыта ?
Пятый проект на кейсах.
Основное время потрачено на графику, эффекты, терраморфинг, физику, скелетную анимацию, распознавание жестов... в общем на мозголомку.
А вертеть жопой изобретая какой-то хитрый менеджер состояний и запутывая простой понятный код - это тупо.
Надо сказать у нас есть товарищ, который сделал стейты с интерфесом, но его уровень такой, что ему можно)
s.o.v.a
> Основное время потрачено
> Надо сказать у нас есть товарищ, который сделал стейты с интерфесом
И сколько времени он потратил ?
innuendo
> И сколько времени он потратил ?
не суть важно.
его код остался читаем, в отличие от мусора из статьи.
s.o.v.a
> не суть важно.
Стейты с интерфейсом делаются за 10-15 минут. Какой % это от
> Основное время потрачено на графику, эффекты, терраморфинг, физику, скелетную
> анимацию, распознавание жестов...
?
> его код остался читаем, в отличие от мусора из статьи.
И что не читаемого в статье ?
s.o.v.a
> > И сколько времени он потратил ?
> не суть важно.
Порой время основной ресурс, которого всегда не хватает.
s.o.v.a
> говономенеджер сосет уже в статье
О, да здесь оОотец гаймдева... Ну давай, расскажи в чем там говнокод? А то ведь за слова надо отвечать
Wraith
> Да ну, максимум три строчки:
А ресурсы ты как создаешь/очищаешь? Или у тебя в каждой функции свой цикл? А данные у тебя в глобальных переменных? Или пишешь функции с 20 входящими параметрами? Потому что так и так, для инвентаря/окна статистики/прочего придется писать свой класс. так почему же этот же класс не юзать и в качестве модуля?
Wraith
> Все эти игры, конечно, используют одну и ту же версию движка, никак не
> модфицированную. Ресурсы у них не текут, глобальных статиков нет, и все
> шестьдесят игр реентерабельны.
Вот как-то же сделали в игре Alice Madness Returns возможность запустить предыдущую версию игры сделанную на другом движке и намного лет раньше. В DirectX SDK вон есть SampleBrowser, через него можно запускать примеры, и не важно - DX9, DX10 или DX11. Я помню что в третьих героях во времена хроник тоже было можно запускать разные игры друг из друга. А в Might and Magic 5, ее можно было объединить с 4 версией и получить одну целую игру (а ведь графически отличались)
И же студии клепающие по Hidden Object в месяц больше не знают чем заняться и для каждой HO пишут новый движок (я ведь про казуал говорил)
Ну и конечно же ты не знаешь, что любой маломальски хороший движок умеет рисовать в чужом окне, так что даже разные движки (или GAPI) не проблема
Ну и совсем хардкор - просто закрыть одно приложение и запустить другое.
А мои модули позволяют чуть упрощают это дело, позволяя при должном подходе не писать отдельный лаунчер
Wraith
> Ты не поверишь! #define NDEBUG изобрели более 30 лет назад, а мужики-то не
> знают!
Ага, весело наверное работать с файлом из 4000 строк кода, из которых 3000 - для разных дефайнов и неактивны. А то у тебя наверное это выглядит в лучшем случае так:
void MainLoop() { #ifdef EDITOR ... #elif DEBUGTOOL ... #elif TEST ... #elif GAME ... #else # error "" #endif }
Мне всего лишь не надо регистрировать в менеджере данные классы, и компилятор их скорее всего сам выбросит
Для прикола, у меня это будет вот так:
void Init()
{
mgr->SetActiveModule("GAME");
}
void MainLoop()
{
mgr->Frame();
}
У кого из нас меньше кода? И если мне надо редактор, я напишу mgr->SetActiveModule("TOOL") И Даже несколько билдов можно сделать, в каждом указывая активный модуль, это будет всего пять строчек в одном месте, и не засорит код кучей проверок дефайнов
Wraith
> Отладка в духе "запусти-ка мне миссию сразу" делается с командной строки,
> потому и так что очень полезно.
И как это избавит от интро и меню?
Wraith
> А то, что окнами квестов, навыков и карты вообще нереально управлять с гейпада
А че? Консоли уже умерли и ПК снова в моде? Я ни слова не говорил про неосиляторство. Я привер реальный пример (сейчас все игры состоят из одного окна). И тебе точно также придется думать о геймпадах, и точно также делать одно окно. Так зачем мучаться свитчами, проверками того кто сейчас ввод обрабатывает (а то ведь зайдешь в инвентарь, нажмешь стрелочку, а герой свалится в пропасть потому что ввод обрабатывает теперь и игра и окно, а программист забыл проверку вставить), проверками того, что должно работать а что нет, если моя система все это дает вообще бонусом
Wraith
> Если UI игры настолько продвинут, что в нем есть своя оконная система, то твои
> модули там тоже не впились,
И в чем связь интерфейса и моей системы? И при чем тут "оконная"? У тебя будет теже три действия - Инициализация, Кадр, Завершение, значит придется писать три кейса свитча чтобы инвентарь показать? Потом нужно еще написать чтобы игра работала но не обрабатывала ввод. И сколько это строчек кода? А если ты не любитель глобальных переменных, у тебя скорее всего есть класс Inventory. Так вот, мне на все это надо написать одну строчку
Вот покажу как это выглядит в реальном законченном проекте.
Проект вот:
http://falcoware.com/MagnetGame.php
Сразу, то что это треш, я и без вас знаю, я на этом проекте смотрел как хорошо box2d интегрируется с моим движком, а не игру делал
Там было три экрана - главное меню, редактор и собственно игра.
IScene этот тотже IModule
Каждый модуль, это не только экран, он хранит еще и данные. Вам все равно бы пришлось писать данные три класса, а потом сверху еще и свитч. Мне этого не нужно.
То есть весь игровой цикл:
void Game::_run() { while ( _scenemgr.Run( )); }
Run, это метод Frame из статьи. Его код
bool IModule::Frame() { if ( !m_isinit || m_isexit) return false; else return doRun( ); } bool ModuleMgr::Frame( ) { if ( !m_currmodule) return false; return m_currmodule->Frame( ); }
doRun пишется отдельно для каждого модуля.
Чтобы все это заработало, надо модули зарегистрировать и выбрать стартовую.
_scenemgr.AddScene(GS_MAINMENU, MMscene); _scenemgr.AddScene( GS_GAME, GScene); _scenemgr.AddScene( GS_EDITOR, EScene); // выбираем стартовую сцену _scenemgr.SetScene( GS_MAINMENU);
И как видите, я написал меньше кода, чем даже при банальном свитче - ведь и при свитче нужен игровой цикл (метод _run) и нужен кадр (метод Frame).
Свитч лучше, чем менеджер.
Есть много программ на WinAPI со свитчем,
а как только туда пытаются запихать менеджеры
сообщений в стиле MFC - то получается БУЕЕЕ-:((
Свитчи и менеджеры говно
у меня переход между сценами сделан на основе блокирующего кода и стека, никаких менеджеров нет, есть функции типа:
transitionShowAsDialog(spFrame next); transitionReplace( spFrame next); transitionNext( spFrame next); transitionRestore( spFrame next); пример использования if ( transitionShowAsDialog( someDialog) == "btn_ok") { //show game, change scene transitionReplace( someScene); //returned back to previons scene //show eng game dialog spFrame endGameDialog = someScene->isWon( ) ? wonFrame:loseFrame; transitionShowAsDialog( endGameDialog); }
RenGD
> Есть много программ на WinAPI со свитчем,
> а как только туда пытаются запихать менеджеры
> сообщений в стиле MFC - то получается БУЕЕЕ-:((
Ты не поверишь, но я в своем движке (Sapphire3D) юзаю голый WinAPI (как минимум обработка ввода, сеть, потоки, окна), и данная система модулей идеально работает с ним
Тема в архиве.