Решил написать вот такую вот заметку. Игровые данные обычно выносят за пределы кода в специальные текстовые скрипты. Это понятно - не нужно при каждом изменении пересобирать весь проект. Но я тут потихоньку начал делать roguelike и мне было нужно скрыть всю эту логику от игроков. Вариант паковать их в архив не подходит - слишком муторно в данном проекте. поэтому я решил писать скрипты прямо в код. Но и недостаток, когда данные и код перемешиваются и превращаются в кашу, меня не устраивает. И тут я вспомнил об одном свойстве #include. Ведь это является подстановкой файла в данное место. Вот как я набросал первый пример:
Грузим данные:
Сами данные (то есть файл MoneyItemDesc.inl) - это весь файл на текущий момент, ничего не удалил:) :
Как вы видите - все очень просто. Плюсы:
intellisence не работает:) оказывается работает и еще как:)
Теперь самое няшное - можно сделать редактор объектов для стороних разработчиков, который будет генерировать такой код, в таком случае вообще никакой разницы между внешними скриптами и такими.
Второй момент - вы вполне можете писать не только заполнение кода, но и полные скрипты поведения - например функции.
Вот, а то c++'о ненавистники считают эту вещь недостатком:)
Грузим данные:
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++;
Как вы видите - все очень просто. Плюсы:
- при изменении компилируется только один файл
- данные и код не смешиваются, и вам не придется перелопатить кучу кода чтобы подправить характеристику предмету
- вы защищены от ошибок в скриптах компилятором (!!!), то есть если напишите с ошибкой - компилятор вам об этом скажет.
- Никто никогда не залезет в ваши данные
Теперь самое няшное - можно сделать редактор объектов для стороних разработчиков, который будет генерировать такой код, в таком случае вообще никакой разницы между внешними скриптами и такими.
Второй момент - вы вполне можете писать не только заполнение кода, но и полные скрипты поведения - например функции.
Вот, а то c++'о ненавистники считают эту вещь недостатком:)
Комментариев нет:
Отправить комментарий