ПрограммированиеФорумОбщее

Смена экранов игры (комментарии) (6 стр)

Страницы: 15 6 7 810 Следующая »
#75
22:24, 26 янв 2013

s.o.v.a
> говономенеджер сосет уже в статье

Это на основе своего опыта ?

#76
22:26, 26 янв 2013

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 игры настолько продвинут, что в нем есть своя оконная система, то твои модули там тоже не впились, потому что оконная система обычно сильно сложнее этой херопени и дает больше фич. Например, сама рисует эти самые окна.

#77
22:34, 26 янв 2013

Wraith
> Если UI игры настолько продвинут, что в нем есть своя оконная система, то твои
> модули там тоже не впились,

Э...  Очень спорный вопрос :)

> > 5) инструментарий из игры. ... Мне не надо комментировать огромные куски кода
> > отвечающие за редактор
> Ты не поверишь! #define NDEBUG изобрели более 30 лет назад, а мужики-то не
> знают!

NDEBUG и EDITOR - очень даже разные вещи ...

#78
23:24, 26 янв 2013

innuendo
> NDEBUG и EDITOR - очень даже разные вещи ...

Могу процитировать эпичнейшую фразу, прозвучавшую здесь полтора года назад:

  "...вот беда - я не знаю, что делать когда со мной пытается общаться говорящий анальный зонд"

Если у тебя есть что-то рассказать о проблемах применения конструкции switch() в казуальных играх, так говори, не томи. А если нет - ... .

#79
23:27, 26 янв 2013

Wraith
> Могу процитировать эпичнейшую фразу, прозвучавшую здесь полтора года назад:

Странно, как только ловят товарища на подтасовке фактов - сразу следует слова про анальный зонд ... помнится, этот проктолог сдулся на вопросе об моих коллегах по работе ...
Могу только ещё раз напомнить, что EDITOR и NDEBUG - сильно не одно и тоже :)

> Если у тебя есть что-то рассказать о проблемах применения конструкции switch()
> в казуальных играх, так говори, не томи. А если нет - ... .

Про казуалочки не скажу - врать не буду, а выше уже сказал про опыт ...

#80
1:36, 27 янв 2013

innuendo
> Это на основе своего опыта ?
Пятый проект на кейсах.
Основное время потрачено на графику, эффекты, терраморфинг, физику, скелетную анимацию, распознавание жестов... в общем на мозголомку.
А вертеть жопой изобретая какой-то хитрый менеджер состояний и запутывая простой понятный код - это тупо.

Надо сказать у нас есть товарищ, который сделал стейты с интерфесом, но его уровень такой, что ему можно)

#81
3:49, 27 янв 2013

s.o.v.a
> Основное время потрачено

> Надо сказать у нас есть товарищ, который сделал стейты с интерфесом

И сколько времени он потратил ?

#82
4:32, 27 янв 2013

innuendo
> И сколько времени он потратил ?
не суть важно.
его код остался читаем, в отличие от мусора из статьи.

#83
5:16, 27 янв 2013

s.o.v.a
> не суть важно.

Стейты с интерфейсом делаются за 10-15 минут. Какой % это от 
> Основное время потрачено на графику, эффекты, терраморфинг, физику, скелетную
> анимацию, распознавание жестов...

?

> его код остался читаем, в отличие от мусора из статьи.

И что не читаемого в статье ?

#84
6:24, 27 янв 2013

s.o.v.a
> > И сколько времени он потратил ?
> не суть важно.
Порой время основной ресурс, которого всегда не хватает.

#85
8:40, 27 янв 2013

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. Так вот, мне на все это надо написать одну строчку

#86
8:53, 27 янв 2013

Вот покажу как это выглядит в реальном законченном проекте.

Проект вот:
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).

#87
9:41, 27 янв 2013

  Свитч лучше, чем менеджер.
Есть много программ на WinAPI со свитчем,
а как только туда пытаются запихать менеджеры
сообщений в стиле MFC - то получается БУЕЕЕ-:((

#88
12:46, 27 янв 2013

Свитчи и менеджеры говно

у меня переход между сценами сделан на основе блокирующего кода и стека, никаких менеджеров нет, есть функции типа:

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);
}
#89
13:58, 27 янв 2013

RenGD
> Есть много программ на WinAPI со свитчем,
> а как только туда пытаются запихать менеджеры
> сообщений в стиле MFC - то получается БУЕЕЕ-:((
Ты не поверишь, но я в своем движке (Sapphire3D) юзаю голый WinAPI (как минимум обработка ввода, сеть, потоки, окна), и данная система модулей идеально работает с ним

Страницы: 15 6 7 810 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.