воскресенье, 20 мая 2012 г.

Игровые данные в коде

Решил написать вот такую вот заметку. Игровые данные обычно выносят за пределы кода в специальные текстовые скрипты. Это понятно - не нужно при каждом изменении пересобирать весь проект. Но я тут потихоньку начал делать roguelike и мне было нужно скрыть всю эту логику от игроков. Вариант паковать их в архив не подходит - слишком муторно в данном проекте. поэтому я решил писать скрипты прямо в код. Но и недостаток, когда данные и код перемешиваются и превращаются в кашу, меня не устраивает. И тут я вспомнил об одном свойстве #include. Ведь это является подстановкой файла в данное место. Вот как я набросал первый пример:

Грузим данные:

uLLong MoneyItemMgr::Load(uLLong nextid)
{
 _nextid = nextid;
 uLLong id = 0;
 
#include "MoneyItemDesc.inl"
 
 id+=_nextid;
 
 return id;
}

Сами данные (то есть файл MoneyItemDesc.inl) - это весь файл на текущий момент, ничего не удалил:) :

// медная монета
_data[id].SetName("Медная монета");
_data[id].SetCost(1);
_data[id].SetRarity(IR_POOR);
_data[id].LoadImg("money/copper_coin.png");
id++;
 
// серебряная монета
_data[id].SetName("Серебряная монета");
_data[id].SetCost(10);
_data[id].SetRarity(IR_UNCOMMON);
_data[id].LoadImg("money/silver_coin.png");
id++;
 
// золотая монета
_data[id].SetName("Золотая монета");
_data[id].SetCost(100);
_data[id].SetRarity(IR_RARE);
_data[id].LoadImg("money/gold_coin.png");
id++;

Как вы видите - все очень просто. Плюсы:
  • при изменении компилируется только один файл
  • данные и код не смешиваются, и вам не придется перелопатить кучу кода чтобы подправить характеристику предмету
  • вы защищены от ошибок в скриптах компилятором (!!!), то есть если напишите с ошибкой - компилятор вам об этом скажет.
  • Никто никогда не залезет в ваши данные
Минус я вижу только один - intellisence не работает:) оказывается работает и еще как:)

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

Вот, а то c++'о ненавистники считают эту вещь недостатком:)

Комментариев нет:

Отправить комментарий