пятница, 16 марта 2012 г.

Давайте сделаем рогалик. Глава 21: Прокачка персонажа

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

четверг, 15 марта 2012 г.

Давайте сделаем рогалик. Глава 20: Суть отдыха

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

Давайте сделаем рогалик. Глава 19: Ближний бой

Сейчас мы достигли точки, где уже возможно участвовать в ближнем бою. Чтобы атаковать, мы просто врезаться в монстра, в результате чего, нападаем на него с тем, что у нас есть под рукой в данный момент. Реализовано все это в подпрограмме MoveChar.

Давайте сделаем рогалик. Глава 18: Движение монстров

Сейчас у нас уже есть монстры в игре, но это не очень интересно, если они будут все время стоять на месте, пока игрок не запинает их досмерти. Монстры должны двигаться, преследовать персонажа, атаковать его и отступать в случае необходимости. В этой главе мы научим их догонять персонажа и убегать от него.

среда, 14 марта 2012 г.

Мультиязычное приложение на gcc при помощи gettext

Сделать приложение многоязычным, с неограниченным количеством поддерживаемых локалей, без изменения кода логики программы не просто, а очень просто!

Рассмотрим локализацию приложения пр помощи GNU утилит gettext на конкретном примере. В качестве препарируемого приложения я выбрал roguelike игру Cataclysm (git-hub: https://github.com/Whales/Cataclysm, forum: http://whalesdev.com/forums/). Код написан на c++ и открыт. Текстовые сообщения в ней безобразно размазаны по всему коду, так что код отлично подойдет для примера :)

среда, 7 марта 2012 г.

Давайте сделаем рогалик. Глава 17: Монстры

Теперь у нас есть броня и оружие и, для того чтобы сражаться, осталось только добавить некоторое количество монстров. Мы добавим в проект новый файл monster.bi, который будет содержать весь код связанный с монстрами.

Первое что нужно сделать, это определить идентификаторы монстров.

вторник, 6 марта 2012 г.

Давайте сделаем рогалик. Глава 16: Оружие

Прежде чем перейти к реализации оружия, давайте взглянем на некоторые изменения в коде. Вместе с последним обновление появилась странная ошибка, в результате которой на карте появлялись фантомные предметы. На карту добавлялся идентификатор предмета и ничего больше. Глядя на код генерации предметов питания я обнаружил, что перечисление, используемое в генераторе случайных чисел, было изменено. Вместо того, чтобы верхняя граница задавалась supBottleOil (бутылка с маслом), почему то была указана броня armPlate. Я не знаю как это произошло, но это и являлось причиной создания фантомных предметов. Я исправил эту проблему и добавил в нескольких местах кода проверки, чтобы сразу знать что происходит нечто странное, если такая же ситуация повторится. (Примечание: бутылка масла была удалена из кода последующих глав, так как у нас не будет темных подземелий. Смотри раздел примечаний, где описаны идеи того, как можно добавить темные подземелья в игру).

воскресенье, 4 марта 2012 г.

Давайте сделаем рогалик. Глава 15: Броня и щиты

Следующим нашим шагом будет добавление в игру предметов брони и щитов. Также, чтобы они у нас работали, нам необходимо реализовать команду инвентаря «Взять в руки/Одеть». Тут мы сталкиваемся с небольшой проблемой, так как нам нужно уметь не только одевать предметы, но и снимать их. Так как мы имеем дело с двумя действиями, то имеет смысл реализовать для них две команды: «Взять в руки/Одеть» и «Снять». Этим мы и займемся в этой главе.

суббота, 3 марта 2012 г.

Давайте сделаем рогалик. Глава 14: Инвентарь персонажа, ч. II

В этой главе мы закончим код обработки наших предметов питания. Так что можно будет отбросить команды «Съесть/Выпить» и «Осмотреть». До этого момента, различные участки кода нашей программы работали, в основном, в изоляции. Теперь мы подошли к моменту, где участки кода, начинают взаимодействовать друг с другом, особенно в команде «Съесть/Выпить». Употребление лечащих трав вылечит персонажа, кусок мяса добавит здоровья и, возможно, даст временный бонус к атрибуту силы, а у хлеба есть возможность вылечить отравление ядом. С этой точки зрения, различные модули программы будут начинать все больше взаимодействовать друг с другом, по мере того, как мы будем развивать динамическую систему описывающую наш игровой мир. Это захватывающая часть процесса программирования, когда вы будете видеть, как различные модули начинают работать вместе, и мир, который мы создали, начинает оживать.

Давайте сделаем рогалик. Глава 13: Инвентарь персонажа

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

Давайте сделаем рогалик. Глава 12: Генерация вещей

Теперь у нас есть структура данных для инвентаря и мы можем создать некоторое количество предметов и разместить их на карте подземелья, чтобы игрок смог их найти. Для того, чтобы иметь предметы на карте, нам нужно добавить к описанию уровня подземелья нашу структуру данных предмета инвентаря.

Давайте сделаем рогалик. Глава 11: Устройство инвентаря

Создание модели структуры данных для рогалика, или любой другой игры, которая должна манипулировать с различными предметами, представляет интересную задачу для программиста. Структура данных должна быть в состоянии хранить предметы обладающие различными свойствами и характеристиками, сохранять эти элементы в коллекции и давать возможность легко всем этим управлять на протяжении всего игрового процесса. Также нам необходима эффективная и самодостаточная структура данных, которая могла бы содержать в себе и манипулировать совершенно разными структурами данных — для организации списков предметов разных типов. Задача кажется почти невозможной, но на самом деле все достаточно просто. Мы создадим составной тип данных, в котором будем хранить информацию о различных параметрах различных предметов используя определения типов Type Defs и объединения Union.

Давайте сделаем рогалик. Глава 10: Главный интерфейс

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

Давайте сделаем рогалик. Глава 09: Бродим

Мы достигли важного момента в жизни нашего Подземелья Судьбы, а именно, добавление кода передвижения нашего персонажа. Мы сможем передвигаться по уровню, открывать двери и даже спуститься по лестнице на новый уровень подземелья и исследовать его. Конечно, на данном этапе, подземелье пустынно, но это уже начинает напоминать игру.

Давайте сделаем рогалик. Глава 08: Подземелье

Поскольку мы разобрались с основной идеей создания уровня подземелья, то пришло время запустить редактор и добавить код в нашу игру. На изображении выше, можно увидеть результат наших трудов по отображению карты подземелья. Вы уже видели некоторые куски кода, но уровнем подземелья у нас будет объект, поэтому нам нужно будет добавить кое какие изменения. Весь код, связанный с картой будет находится в файле map.bi, а начнем мы, пожалуй, с рассмотрения определений и значений констант.

Давайте сделаем рогалик. Глава 07: Строим подземелье

Подземелье, это место где будет происходить все действие игры. Персонаж должен исследовать подземелье, сражаться с монстрами, находить различные предметы, а также, может найти лестницу, ведущую вниз для перехода на более глубокий уровень. В конечном счете, целью является спуститься на последний уровень, забрать «интересующие предметы» и вернуться назад, на поверхность мира. Для рогаликов принято, чтобы каждый уровень подземелья генерировался случайным образом, так что каждый уровень будет уникальным. Это подымает шанс реиграбельности на достаточно высокий уровень, и отличает жанр от игр других типов. Для того, чтобы создать подземелье, мы должны знать элементы, из которых они строятся.

Давайте сделаем рогалик. Глава 06: Вступление

Хотя это и не является обязательным — добавить в игру экран с вводной информацией, но это добавит изюминку в нашу игру, и вы можете его использовать для того, чтобы рассказать немного об игре. Что можно ожидать от игры, какие цели преследует персонаж, что случиться если персонаж проиграет или выиграет. Это не должно быть описанием реализованных в игре возможностей, вступление должно быть интересным для игрока и передавать некоторую информацию о игре. Если вы прочитали текст на изображении выше, то вы видите, что это предшествующая игре история оформленная в виде письма персонажу, которое рассказывает игроку о том, почему он собирается в Подземелье Судьбы, и что случиться если он потерпит неудачу или справится со всеми испытаниями.

Давайте сделаем рогалик. Глава 05: Генерация персонажа

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

Давайте сделаем рогалик. Глава 04: Ролевая система

Большинство рогаликов реализуют в игре ту или иную ролевую систему. Это позволяет игроку отыгрывать роль своего персонажа, а не только бегать и убивать монстров. Хотя, если вы хотите, то никто не мешает вам создать рогалик, где только и нужно, что бегать и всех убивать.

Давайте сделаем рогалик. Глава 03: Главное меню

Следующее, что мы можем добавить в программу, это главное меню. Как и с заставкой, мы не должны соглашаться только на старый добрый ASCII. Мы можем подойти творчески, и немного оживить меню. Как вы видите на изображении выше, мы создали еще одно битмап изображение и превратили его в карту цветов, используя тот же метод, как и для экрана заставки. Это хорошо выглядит и добавляет нашей программе особую изюминку.

Давайте сделаем рогалик. Глава 02. Улучшаем код

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

Давайте сделаем рогалик. Глава 01. Титульный экран

Создание рогалика предполагает некоторое планирование, но есть одна вещь, которую мы можем сделать в самом начале: создать титульный экран. Это позволит нам начать проект, что иногда, бывает очень трудно. Легко застопориться на шаге «С чего же мне начать?», но кодирование экрана заставки позволит сдвинуться с мертвой точки. Делается это просто, позволит создать нам несколько файлов для будущего проекта, а также, настроит наше мышление на дальнейшее программирование.