Лучше ли жестко кодировать или оставить для внешних XML-файлов?

Я создаю 2D RPG игру. Похоже на Pokemon для Gameboy. По сути, мои игровые карты состоят из ландшафта размером x x x. Существуют также объекты декораций (деревья, кустарники и т. д.), а также труднодоступные объекты (т. е. знаки, двери, предметы и т. д.). В настоящее время я жестко кодирую эти объекты. Проблема в том, что каждый раз, когда я добавляю объект пейзажа, плитку ландшафта или что-то еще, мне нужно пройти и добавить класс для него, указать некоторые другие данные и т. д. По сути, я чувствую, что мне нужно выполнять много повторяющихся задач, чтобы сделать что-то настолько простое.

Я боюсь, что позже мой проект станет неуправляемым. Каждая часть новой местности, пейзажа или другого объекта унаследована от класса, называемого «GridElement».

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

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

Спасибо за помощь!

Ваше здоровье!


person Freesnöw    schedule 14.09.2011    source источник
comment
@Майк Кван, спасибо за редактирование. Я даже не заметил ошибки :)   -  person Freesnöw    schedule 14.09.2011


Ответы (2)


Как правило, вам следует создавать новый класс только тогда, когда вы хотите представить поведение и управлять параметрами этого класса с помощью ваших данных.

В вашем случае вам, вероятно, понадобится один класс декораций для ваших цветов, кустов, стен и тому подобного. Затем вы можете настраивать объекты этого класса, вызывая функции для установки растровых изображений и скорости анимации. Тогда на самом деле не имеет значения, откуда берутся эти данные, они могут быть жестко закодированы, поступать из фабрики объектов или считываться из xml.

Когда вы переходите к интерактивным объектам, вам нужны дополнительные классы, но постарайтесь сделать их более общими, чем конкретными. Поэтому, если вы хотите отображать сообщение, когда ваш пользователь взаимодействует с объектом, у вас есть общий класс взаимодействия, а не класс знака. Затем этот класс можно использовать для вывесок, книжных полок, загадочно выглядящих предметов.

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

person DanDan    schedule 14.09.2011
comment
Так что, кажется, я понимаю, о чем вы говорите. Итак, вы предлагаете мне использовать XML для плиток, объектов декораций и т. д. и использовать язык сценариев (например, Lua) для работы со всеми событиями взаимодействия, анимацией и т. д.? Мне очень нравится эта идея. Я собирался внедрить Lua в более позднюю часть проекта, но мне все еще очень нравится ваша идея. - person Freesnöw; 14.09.2011
comment
Я бы использовал XML или другой формат файла, если вы создаете многоразовый игровой движок, но вам не нужно делать это преждевременно! Сначала убедитесь, что у вас есть хорошее игровое ядро, интересно ли оно, стоит ли его расширять? Пока вы строите это, я бы просто жестко закодировал данные. Если вы абстрагируете весь этот код создания объектов (т.е. фабрику объектов), вы можете легко вырвать его и позже заменить своим синтаксическим анализатором xml. - person DanDan; 14.09.2011
comment
Основная трудность во всем этом заключается в том, что у него есть встроенный редактор карт. Я хочу, чтобы многие вещи были возможны, например, добавление новых вещей и тому подобное. Я, вероятно, продолжу и начну строить такую ​​систему в ближайшее время, пока нет, но скоро. Таким образом, когда придет время, с ним будет намного легче работать. Я продолжу и включу Lua в свою программу. - person Freesnöw; 14.09.2011

Лучше поместить данные в файлы данных и написать свой код для обработки этих файлов данных. Есть несколько причин: вы сослались на одну, что данные более управляемы таким образом (т. е. они будут более четко организованы и их будет легче найти). Еще одним важным преимуществом является то, что это упрощает изменение данных. При работе с другими это имеет ОГРОМНОЕ значение, но даже при индивидуальной работе вам намного проще настроить все параметры игрового процесса, когда они находятся в файлах конфигурации, а не в самом коде.

Ваши предостережения означают, что вам часто придется иметь отдельные классы для отдельных типов элементов, а затем ссылаться на эти классы в XML; Например:

<grid_element>
  <class>GrassElement</class>
  <image>dark_grass.png</image>
  <xpos>10</xpos>
  <ypos>10</ypos>
</grid_element>

но как можно больше отходите от жестко запрограммированных вещей и делайте это в файлах данных. Например, различные вызываемые события могут быть определены в XML:

<step_event>somethingOrOther</step_event>
person jhocking    schedule 14.09.2011
comment
Могу ли я получить объяснение этому. Я не просто ищу ответ, мне нужна причина почему. Извините :) - person Freesnöw; 14.09.2011
comment
Я добавил пару причин. Есть и другие причины, но это самые важные из них, которые только что пришли мне в голову. - person jhocking; 14.09.2011