Код против конфигурации для библиотеки игровых объектов - PullRequest
3 голосов
/ 23 июня 2010

Я работаю над небольшой онлайн-игрой, в которой необходимо хранить разумное количество информации о множестве (более 100) различных типов игровых объектов.

Я пытаюсь решить, будут ли эти данные сгенерированы кодом или сохранены в каком-либо файле конфигурации.

Подход к генерации данных будет выглядеть примерно так (в псевдокоде java-ish):

(within a set of functions executed once at program startup)
....
// create grass terrain
grass=new GameObject();
grass.inheritProperties(generic_terrain);
grass.set(NAME,grass);
grass.set(MOVEABLE,true);
grass.set(MOVECOST,10);
grass.set(IMAGE_INDEX,1);
....

Принимая во внимание, что подход с использованием файла конфигурации, вероятно, просто использует формат типа XML, например

(within terrain.xml file)
....
<terrain name="grass">
    <inherit class="generic_terrain"/>
    <property key="NAME" value="grass"/>
    <property key="MOVABLE" value="true"/>
    <property key="MOVECOST" value="10"/>
    <property key="IMAGE_INDEX" value="1"/>
</terrain>
....

Некоторые важные моменты:

  • Эта информация является статической каждыйвремя запуска игры (т.е. не изменяется во время выполнения)
  • Имена свойств (NAME, MOVECOST и т. д.) представляют собой сравнительно небольшой список, но со временем могут быть добавлены дополнительные
  • ЭтоМожно с уверенностью предположить, что он будет изменен только командой разработчиков (т.е. нет необходимости управлять конфигурацией вне процесса сборки).
  • Его необходимо будет корректировать во время разработки по причинам балансировки игры (например, сделать юниты менее / более мощными)
  • Существует определенное количество "наследования" свойств, т.е.В приведенном выше примере трава должна иметь все стандартные свойства, определенные generic_terrain, а также несколько новых дополнений / изменений.

Какой подход лучше всего подходит для этой ситуации?Еще важнее почему?

Ответы [ 5 ]

5 голосов
/ 23 июня 2010

Лично мне нравится нажимать как можно больше настроек.Причина этого в том, что в какой-то момент я могу захотеть использовать код, написанный для игры, совершенно по-другому.Если исходный код изобилует ссылками на детали реализации, это становится намного сложнее.

Один интересный недостаток подхода к конфигурации возникает, когда вы хотите начать описывать поведение объектов в дополнение к их значениям.Рассмотрим простой пример, где у вас есть кубковый объект, который должен «ловить» шариковые объекты.Вы можете выразить их как:

<object name="ball">
    <property key="shape" value="circle"/>
    <property key="movable" value="true"/>
    <property key="speed" value="10"/>
</object>

<object name="cup">
    <property key="shape" value="rectangle"/>
    <property key="movable" value="true"/>
    <property key="speed" value="6"/>
    <property key="catches" value="ball"/>
</object>

Проблема здесь в том, что где-то вам еще нужно определить, что "ловит", что делает внутри вашего кода.Если вы используете интерпретируемый язык, вы можете сделать что-то вроде:

<object name="cup">
    <property key="shape" value="rectangle"/>
    <property key="movable" value="true"/>
    <property key="speed" value="6"/>

    <oncollision>
      if (collided.getName() == "ball") {
        collided.destroy();
        points++;
      }
    </oncollision>
</object>

Теперь вы получили возможность описать, как объект ведет себя , а также то, чем он является .Единственная проблема здесь заключается в том, что если вы не работаете на интерпретируемом языке, вы не можете позволить себе определять код во время выполнения.Это одна из причин, по которой Lua стал настолько популярным в разработке игр.Он хорошо работает как декларативный и процедурный язык, и его легко встроить в скомпилированное приложение.Таким образом, вы можете выразить эту ситуацию как:

object {
  name='ball';
  movable=true;
  speed=10;
}

object {
  name='cup';
  movable=true;
  speed=6;
  oncollision=function(collided)      
     if collided:getName() == "ball" then
        collided:destroy();
        points++;
     end
  end;
}
2 голосов
/ 24 июня 2010

Если вы решите использовать XML, по крайней мере, попытайтесь использовать разумную схему. Нет смысла встраивать вашу собственную маленькую схему («объект», «свойство», «ключ», «значение») в XML, если она предназначена для непосредственного представления только этого материала. Как насчет:

<ball>
    <shape>circle</shape>
    <movable>true</movable>
    <speed>10</speed>
</ball>

<cup>
    <shape>rectangle</shape>
    <movable>true</movable>
    <speed>6</speed>
    <catches>ball</catches/>
</cup>
2 голосов
/ 23 июня 2010

Многие игровые движки используют скриптовые языки по многим причинам, которые вы упомянули. Lua - это действительно отличный, довольно быстрый и легкий скриптовый движок, который с большим успехом используется во многих играх. Вы можете легко использовать синтаксический анализатор, чтобы выполнить простую настройку конфигурации и оставить все как есть, или добавить больше функциональности и позволить фактическому коду записываться в файл. Ваш пример в lua может выглядеть примерно так:

grass = {
    NAME = "grass",
    MOVEABLE = true,
    MOVECOST = 10,
    IMAGE_INDEX = 1
}

setmetatable(grass, generic_terrain)
2 голосов
/ 23 июня 2010

Это не зависит от языка.

Если вы используете скомпилированный язык, используйте файл конфигурации, чтобы вам не приходилось принудительно перекомпилировать каждый раз, когда вы что-то настраиваете.

Если вы используете язык, где вам не нужно выполнять явный процесс компиляции / компоновки, делайте это в коде, чтобы вам не приходилось иметь дело с анализом и загрузкой. (Но делайте это в одном месте, чтобы можно было полностью поменять функциональность, если это понадобится в будущем).

Основная философия здесь заключается в том, что код - это данные, но иногда код-как-данные мучительно трудно изменить; в таких случаях (например, в случае скомпилированного языка) напишите его в виде кода, который легче модифицировать. (Ваш интерпретированный язык конфигурации.)

2 голосов
/ 23 июня 2010

Отделение данных от кода - это ВСЕГДА хорошая идея.Даже если данные статичны во время выполнения, это не во время процесса проектирования.Игра с жестко запрограммированными данными гораздо менее гибкая, чем игра, в которой данные собираются из легко изменяемого конфигурационного файла.

Хранение данных в отдельных файлах, например, xml, позволяет быстро и просто изменятьразличные ценности, которые, как вы говорите, важны.

...