Суббота, 23.11.2024, 11:12
Приветствую Вас Гость | RSS

Кузница миров

Меню сайта
Категории раздела
Мои статьи [2]
Курс : "Основы С++ для начинающих программистов игр." [25]
WindMill Engine [3]
XNA4 RPG [0]
Перевод туториалов но созданию RPG на C# c XNA4.
C# & Leadwerks [5]
Программирование Leadwerks Engine на языке С# с помощью врапера Le.NET.

Каталог статей и уроков

Главная » Статьи » Мои статьи

Как разработать RPG-игру за неделю с нуля и без бюджета.
Как разработать RPG-игру за неделю с нуля и без бюджета. 

RPG за неделю? С нуля? Это вообще возможно?
Я рискнул, и я сделал это.

В интернете полно информационных ресурсов, доступных мелким, независимым (indi) разработчикам игр . На одном таком общественном форуме, в процессе спора, я имел неосторожность ляпнуть, что, если мне дадут неделю времени, компьютер со свежеустановленной Windows, и хорошее соединение с Интернет, я смогу создать достойную игру, не потратив на это ни цента. Нет, она конечно же не сможет конкурировать с Halo 2 или чем-то такого же уровня(если бы я мог создать такую игру за неделю, я бы давно бросил работу), но она будет достаточно интересной и играбельной.

Tom Bampton, автор ежемесячных обзоров игр в номинации «Игра на день» (www.gameinaday.com), сказал: "Дерзай!" Затем он добавил дополнительное условие - я должен сделать это, не используя существующие игровые движки. Мне можно использовать только основные библиотеки / API.

Сначала я отказался от этой идеи. У меня не было лишнего времени, чтобы на неделю отстранится от разработки текущего игрового проекта на работе. Но потом я подумал: да черт с ним, ведь что такое неделя? В типичной компании, например в Е.А., рабочая неделя составляет 40 часов. Так почему бы не сделать игру не за календарную неделю, а за 40 чистых часов? Это уже реальнее, - но я не хотел создавать очередной тетрис или арканоид. А как насчет ролевой игры - одного из самых сложных игровых жанров? Это возможно?

Я знал, что это будет чрезвычайно трудно. Но я принял вызов.

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

Так вот, как я создал игру в течение одной недели с нуля, и без бюджета. Если вам лень читать, и вы хотите побыстрее заглянуть в конец повествования, чтобы узнать, как выглядит конечный продукт, посмотреть все его баги, вы можете скачать версию игры для Windows здесь : http://www.rampantgames.com/hackenslash.html

ПЛАНИРОВАНИЕ
Цель
Создать олдскульную RPG в стиле старых игр начала 80-х, с видом "сверху вниз", например как The Temple of Apshai, Ultima III, и Telengard. Игрок будет двигаться через комнаты в типичном подземелье, сражаясь с различными монстрами с помощью «меча и магии». Постепенно он будет совершенствовать свои возможности получая опыт, повышая уровень, приобретая магическое снаряжение.

Однако, игра будет состоять не только из самого ведение боевых действий. Игрок также будет иметь возможность прокрасться мимо монстров, или вступить с ними в переговоры. Будут запертые двери и сундуки, и уникальные особенности подземелья, имеющие неожиданные эффекты. В игре не будет длинных описаний или диалогов, - в основном это будет типичный hack & slash. Вы будете двигаться по пути, пока не станете достаточно сильным, чтобы встретится лицом к лицу с финальным боссом, выполнить квест, и благополучно вернуться домой (в вашу стартовую комнату).

Правила разработки

Правило № 1: Время разработки ограничено одной неделей (включающей 40 часов)
На разработку игры должно быть потрачено в сумме не более 40 часов. Они будут включать время, потраченное на непосредственную работу над игрой и на ее обдумывание. Перерывы в разработке больше, чем десять минут, не будут учитываться. Это будет "идеальная" рабочая неделя из 40 высокопроизводительных часов.

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

Правило № 2: Использовать только бесплатные инструменты
За исключением программного обеспечения, которое поставляется с установкой Windows, используется только свободный софт, по возможности с открытым исходным кодом. Смысл этого - показать, что не нужны дорогие (или пусть даже дешевые) инструменты для разработки игры. На оборудование, такое как сканер, микрофон и цифровая фотокамера, данное правило не действует - если у вас их нет, будем считать, что их можно у кого-то одолжить.

Правило № 3: Нет движкам, только стандартные библиотеки / API
Игра должна быть создана "с нуля" без использования существующих игровых движков. Никакого обмана, и создания игры или каких-то ее частей с помощью конструкторов игр или использования подобного программного обеспечения.

Инструменты
Код:

• Python 2,3 (http://www.python.org/)
• PythonWin
• PyGame (http://www.pygame.org/)
• Py2exe – чтобы собрать что получится в исполняемый файл для распространения. (http://starship.python.net/crew/theller/py2exe/)

Графика:

• Gimp 2,0 (http://gimp-win.sourceforge.net/)
• MS Paint (тот что идет с Windows) - для вставки скриншотов, захваченных клавишей PrintScreen (GIMP почему-то отказался это делать)
• Бесплатные текстуры были взяты (http://www.textureartist.net/textures/index.htm) и (http://www.mayang.com/textures/)

Звук:

Audacity (http://audacity.sourceforge.net/) плюс мой микрофон или бесплатные.

Расписание (План) работ
Расписания составляют, чтобы их потом нарушать, но все же они нужны, чтобы контролировать прогресс и строки, и вносить коррективы по мере необходимости.

Час 1-10: Базовая архитектура
Проектирование движка и основных компонентов. Получить отображения мира на экране. Я должен реализовать возможность перемещать тестового игрока по всему миру, и смотреть на вещи, а затем превратить то, что получится, в игровой редактор.

Час 11-20: Возможности игрока
Реализация всех основных возможностей для игрока - перемещение, атака, открытие дверей, смерть, подбор вещей и использование инвентаря. Создать каркас представления всех объектов в окружающей среде, для тестирования возможностей игрока во взаимодействии с миром.

Час 21-30: Оживление мира
Добавить искусственный интеллект, игровые события, ловушки, спецэффекты. К концу этого периода я должен иметь достаточно полное техно-демо, включающее все основные особенности игры.

Час 31-40: Добавление контента и правил
Получить из техно-демки полноценную игру. Добавить все дополнительное содержимое. Добиться завершенности и баланса игровой механики. Отшлифовать все, на что хватит времени, добавить спецэффекты, анимацию и т.д.

После 40 часов: Тестирование и релиз игры
Протестировать, и устранить найденные ошибки (не добавляя новые возможности!) Собрать все в кучу, и выложить в интернете. Завершить документацию.

Дневник разработчика Hackenslash: Игра за неделю

Час 1 – Дикое проектирование и базовые классы
Этот час был проведен за созданием некоторых базовых классов для игры - и использования их в дальнейшем проектировании. Мир будет представлен в виде последовательности комнат, соединенных порталом. Все в мире базируется на комнатах, подобно тому, как это было в старых адвенчурах или MUDах. Большинство объектов в игре представлены как " GameObject ", который имеет позицию и содержимое (в том числе может содержать и другие объекты - карта может содержать комнаты, в комнате может быть сундук, в сундуке - меч ... и, я думаю, меч может содержать несколько комнат, но мы так делать не будем.)

• Я создаю объекты creature (существо) и player (Игрок)
• Я генерирую набор атрибутов для существ, и внедряю их в класс. Видимо я задрот, который играет слишком много в РПГ игры. Я пока еще не знаю точно, как будет выглядеть и работать игровая механика.
• Я делаю объект room (комната), наследуемый от GameObject. У комнаты есть ширина, высота, и стены - и на текущий момент больше ничего.

Постепенно я начинаю понимать, как все будет работать, и вношу необходимые исправления. Я даже не пытаюсь использовать PyGame на данном этапе, и программа не показывает ничего, кроме консоли. Но я чувствую, что все что сделано - большой прогресс!

Час 2 - PyGame 101
Цель этого часа - инициализация PyGame, ну и начать хоть что-нибудь рисовать на экране. На самом деле, я провожу большую часть времени за чтением документации PyGame, пытаясь выяснить что там и как, поскольку у меня почти нет опыта использования PyGame или SDL.

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

Час 3 - Если бы стены имели уши, я б их сильно отругал.
Цель этой часа – обозначить контуры комнаты стенами, и отобразить это на все еще черном экране. Чтобы сделать это, мне нужна комната, и мне нужна графика. Приходится много сидеть над GIMPом, правя загруженные из интернета текстуры, так чтобы они превратились в подходящие тайлы. Я создаю класс менеджера текстур. И я заполняю структуру образца комнаты. Я также потратил немного больше времени, просматривая документацию PyGame, чтобы найти что-нибудь еще, что можно использовать, дабы сделать работу легче.

Час прошел. А у меня все тот же черный экран. Стен как не было, так и нет.

Часа 4 – В гостинице появился свободный номер
После борьбы с некоторыми синтаксическими ошибками, я, наконец-то смог добиться появления стен на экране. Правда отображаются они неправильно, находятся не в указанном месте, да еще и со щелями между сегментами. Это ужасно. Но немного настройки и правки, и я получил на экране что-то похожее на комнату, размером 10 на 10 квадратов.

Не имея подробного плана проекта, действительно довольно легко запутаться, когда выполнив определенную работу Вы задаетесь вопросом "Что дальше?" Я решил, что если рисунок одной комнаты хорошо, то нарисовать две – вдвойне лучше.

• Для хранения созданных комнат я создал файл "minidungeon".
• Я начать добавлять логику порталов "portals" - отверстий в стенах, для перехода в другие комнаты (и предоставляющих всю информацию о смещении, необходимую для правильного отображения смежных комнат).

Час 5 - Hackenslash получает больше комнат

• Я изменил название окна на "Hackenslash!". Просто потому, что это круто.
• Я создал карту объектов для хранения комнат, и класс MapMaster содержащий несколько карт.
• Я добавил вторую комнату и подключил к первой через портал.
• Соседние комнаты подключены к текущей через порталы, и теперь отображаются на экране.
• Я исправил некоторые ошибки отсечения, чтобы правильно отображались стены, частично выходящие за пределы окна.

Час 6 - за который мы улучшаем скил рисования

• Добавил класс дверей, а также настроил карты для размещения двери (дверь должна быть общей для двух комнат). (Правка: Жаль, что я никогда это так и не использовал!)
• Я создал еще 3 тайла стен, объединил их в одно изображение.
• Графический вид стен изменяется в зависимости от типа.
• Я делаю простую графику для вида сверху вниз.

Часы 7-8 – Вращения и восклицания!

• Я разобрался, как в PyGame поворачивать растровые изображения.
• Я добился плавного вращения тестового игрока. Много регулировок необходимо для корректировки угла вращения.
• Я узнал, как использовать шрифты в PyGame, и я создаю несколько классов для отображения и анимации текста.
• Добавил класс для автоматической обработки текста, поскольку данная функциональность будет часто использоваться в будущем.

Часы 9-11 – Елементы - бррр!

И вот опять, мне нужно решить вопрос "Что дальше?".

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

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

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

Часы 12 - 13 - Нам нужен Лут!

Я создаю графику и код для вещей. Удивительно, как много времени может отнять рисование. Особенно раздражает, когда изображение имеет вид, будто курица лапой рисовала, сколько бы усилий к этому не прилагалось.

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

Час 14 - Ковры

Я сильно отстаю от графика, что же мне делать?
Черный фон кажется слишком уродливым, поэтому я замостил полы внутри комнаты коврами - отдельными тайлами.

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

Зато уровень теперь выглядит круто. Ну, по крайней мере круче, чем черный.

Часы 15-16 - Click! Click!

• Я занялся управлением мышью и обработкой событий.
• Добавил управление персонажем мышью. Движение пока происходит рывками, нет плавной прокрутки уровня.
• Игрок может выйти за пределы комнаты, отсутствует проверка столкновений.
• Я исправил несколько ошибок.
• Помучил GIMP и создал красивые лестницы.
.
На разработку уже затрачено почти 17 часов, так что я начинаю немного нервничать. Я прошел 2/5 пути создания игры, - закончился второй "рабочий день" разработки. То, что у меня уже сделано впечатляет, но я понимаю, что сделать осталось много больше. У меня есть еще четыре часа, чтобы закончить основные возможности игрока, и вложится в график. Это будет трудно ... но я все равно не жалею, что потратил лишнее время на рисование графики!

Час 17 – Плавно перемещаемся, пока не стукнемся лбом о стену

• Большинство времени потрачено на доводку графики и исправление ошибок.
• Добавлено обнаружения столкновений и плавная прокрутка, при движении игрока.
• Игрок теперь может делать несколько шагов (оборотов) в ответ на действие мыши.

Час 18 - Переступаем пороги

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

Час 19 - Лестница в небо, Адское меню

Мой брат вызвался сделать музыку для игры. Он сделал музыку для Void War, и получилось довольно хорошо. Это напомнило мне, что нужно сделать воспроизведение звука (и музыки). Вроде бы в PyGame это сделать довольно просто, поэтому оно не должно занять слишком много времени. (Правка:. Я так и не нашел для этого времени, к сожалению в Hackenslash вы не услышите ни единого звука.)

Моя следующая цель состоит в обработке взаимодействия с существами и предметами. Мне очень нравится, как это сделано в The Sims и Neverwinter Nights, когда вы хотите взаимодействовать с игровым объектом, появляется контекстное меню. Я планирую реализовать что-то похожее.

• Учу лестницы перемещать игрока в новую комнату.
• Я немного проштудировал Интернет и документацию PyGame, ища, нет ли где открытых исходных кодов подобного меню на PyGame. И не нашел ничего.
• Я начал делать собственное меню.

Часы 20 - 21 - Что там с меню?

• Я продолжаю работать над меню. Меню может быть легко подключено к объекту, точнее объект как бы порождает меню, что позволило легко реализовать обратную связь для обработки выбора игрока.
• Я начал работать над меню вещей. Оно уже появляется в нужном месте, и позволяет выбирать какой-нибудь пункт, но при нажатии пока ничего не делает, работает только кнопка закрытия меню.

Час 22 – Заснуть в процессе

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

Я замечаю, что уже поздно, и что вышел далеко за пределы отведенного на эту работу часа. Если бы я не обращал внимания на общее время разработки – просидел бы, наверное, до утра. Но поскольку я ограничен во времени, потраченный практически впустую час - действительно плохие новости. Интересно, как сдвигаются приоритеты, когда не хватает времени. В общем, я ложусь спать.

Час 23 - Боевые параметры!

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

Час 24 - Меню игрока

• Я завершил оптимизации для окна параметров.
• Создал всплывающее меню, которое появляется, когда игрок кликнет на персонажа.
• Я создал быстрое меню для использования зелий, кастования заклинаний и т. д.
• Я исправил некоторые ошибки в работе меню.

Час 25 – До(раз)пиливаю полы и стены

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

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

Отлаживая код, я обнаружил еще несколько ошибок, связанных с переходом между комнатами.

ПЕРЕРЫВ - Кризис!

Я только что осознал, что прошло больше чем 3/5 отведенного на разработку времени, и что осталось меньше пятнадцати часов, чтобы закончить игру. Посмотрев расписание необходимых функций игры, и прикинув, что на реализацию каждой нужно в среднем час, я понял, что на реализацию всего мне нужно около двадцати пяти часов. На десять часов больше, чем есть. Проект официально под угрозой срыва.

Выйти за пределы лимита времени мне нельзя. Также нельзя привлечь помощника или купить код/ресурсы, поскольку предусмотрено, что игру за 40 часов сделаю я один. Нужно придумать, как работать еще более эффективно – но я и так уже вкалываю на максимуме производительности. Похоже, у меня нет другого выбора, придется пересмотреть функционал, и решить, какие возможности выбросить из игры.

• Двери: Вырезано! Я очень хочу сделать двери в игре. Жалко расставаться с этой функцией - тем более, что я уже некоторое время работал на ней. Но остается еще слишком много работ, например искусственный интеллект. И, наверное, понадобится 2-3 часа, чтобы заставить их работать, а их у меня нет.
• Инвентарь: упростить! Забудьте о дополнительном инвентаре, и возможности смены оружия по желанию. Все, что подобрано и не стало текущим оснащением, будет сразу пересчитано в деньги.
• Ловушки: упростить! Я хотел бы иметь множество ловушек с интересными и разнообразными последствиями их активации. Не судьба. Ловушки будет иметь простой визуальный эффект, наносить урон и временно увеличивать вероятность нарваться на случайного монстра
• Луки (стрелковое оружие): Вырезано! В игре будет только оружие ближнего боя, на расстоянии можно атаковать заклинаниями.
• Сохранение / загрузка игры: упростить! Сохранить можно только персонажа, а не состояние мира. (ПРАВКА: Я и этого не сделал!)
• Система частиц: Отложить! Создание системы частиц перемещено в самый низ списка приоритетов. Я сомневаюсь, что придется их делать. Хотелось бы сделать впечатляющие визуальные эффекты с помощью частиц для заклинаний ... но, скорее всего, этого никогда не будет.
• Заклинания: упростить! У меня была серьезная концепция о заклинаниях: их можно было бы найти в виде свитков, и количество более десятка. Это грустно, но будет всего несколько заклинаний: Лечение, Урон, Ослабление, Усиление, и Восстановление. При повышении уровня, можно позволить игроку усилить заклинания за счет увеличения числа магических очков.
• Анимация монстров и игроков: Вырезано! Я никудышный художник, чтобы сделать это достаточно быстро.

Принимая решение, что я не буду делать (или то, что отложу на после), не менее важно решить, что нужно сделать в первую очередь.

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

Отлично, с приоритетами разобрались, продолжаем разработку.

Час 26 - Бросим кости

Я работаю над механикой «игральных костей», - механизма, с помощью которого в игру будет внесен элемент случайности. Поскольку у нас нет ограничения реальных костей, мы можем получать случайное число любого желаемого диапазона. Например от 1 до 33, или от 6 до 17. Так что я могу бросить кости, сравнить то, что выпало со своей атакой и защитой врага. Если выпавшее число выше защиты, атака удалась.

Например, предположим, что у меня общее значение атаки 15. Я атакую монстра, у которого 10 защиты. Мои шансы 15 из 25 (25 =15 +10), или 3 из 5. Так игра будет генерировать случайное число между 1 и 25, и если оно выше десяти, я выиграю.

Для вычисления нанесенного урона используется немного другой способ. Я добавил защищающемуся параметр «броня», а атакующему "урон". Я генерирую случайное число от 1 до их суммы, а затем вычитаю броню. Если результат меньше единицы, урон не наносится. В противном случае, он равен полученному результату. Таким образом, если монстр, с уроном равным 10 атакует игрока с 5 очками брони, игра будет генерировать число от 1 до 15, из которого вычтет 5, то, что получится, и есть нанесенный урон.

Это объяснение и описание заняло больше времени, чем его реализация.

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

Час 27 – Монстры

Меня беспокоит работоспособность монстров. Я должен изменить систему обновления игры, чтобы сделать ее пошаговой. Игроку нужны различные способы взаимодействия с существами (подкуп, борьба, заклинания). То же самое должны уметь и монстры. Нужен искусственный интеллект, поиск пути . И изображения монстров! Рисовать ли мне монстров в той же самой перспективнее – снизу вверх?

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

• Я создаю класс " monster", производный от существа.
• Я создаю список "ActiveAI", с помощью которого в игровом цикле обрабатываются активные монстры.
• Я работаю над изображениями для монстра, на что затрачивается большая часть этого часа (все равно получается неважно, и приходится использовать вместо монстра изображение смайлика).

Час 28 – Появились монстры. Где мой новый доспех?

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

Час 29 – Время перемен

• Я создаю меню с выбором варианта действий для монстров.
• Игрок может атаковать
• Основной цикл работает, монстров можно убить.
• За убийство монстров даются очки опыта.

Час 30 - С этим мечом, я тебя порублю в капусту

• Я создаю первый настоящий экипируемый предмет (меч с бонусом +1)
• После смерти монстров с них выпадают вещи.
• Игровой цикл разделяется на пошаговый и не пошаговый.
• Большие изменения в логике перемещения/действий игрока, связанные с введением пошаговой архитектуры.

Час 31 – Выход на финишную прямую

• Монстры обрели эмоции - я дал им три "отношения" к игроку, которые могут зависеть от поведения игрока.
• В игру добавлены деньги, в виде серебра.
• Я добавил возможность переговоров, теперь можно подкупить монстра, чтобы он оставил вас в покое, до тех пор, пока вы сами не решите на него напасть.
• Монстр сам атакует игрока, если тот оказывается с ним в непосредственной близости(если его предварительно не подкупили).
• Исправил ошибку, когда при некотором стечении обстоятельств монстр получал возможность атаковать до переговоров.

Час 32 - Почему мы не можем ужиться друг с другом?

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

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

Час 33 – Странствия, рисование

• Когда монстры непосредственно не атакуют игрока, то они просто бродят вокруг.
• Работаю над спрайтами вещей и зелий
• Добавил зелья - они еще не работают, но уже отображаются

Часы 34 - 35 – Выпей меня!

• Зелья добавляются в инвентарь игрока
• При использовании зелья влияют на параметры игрока. Зелье исцеления восстанавливает очки жизни, зелья энергии восстанавливают ману.
• Добавил клад (который будет автоматически пересчитан сразу в серебро) как и вещи.
• Я начал работу по экипировке вещей.

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

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

Я заканчиваю серьезную правку кое-чего из того, что уже сделано, выбрасываю немного кода, упрощая систему.

Час 36 - Hackenslash!

• Я создал логотип "Hackenslash" с мечом на фоне, и прицепил его в панели интерфейса
• Добавил логику для "меню монстра" - панели, отображающей информацию о монстрах при наведении на них курсора мыши.

Час 37 – Нам не нужен никакой Word-Wrap!

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

Некоторые из моих предварительных работ, выполненных еще в первые 20 часов, наконец-то находят применение – становятся основой для расчета бонусов к параметрам, полученным от экипировки. Все вещи помещаются в словарь ('dictionary' – чудесная Python-овская конструкция) бонусов и штрафов к чему-то(имя в реестре). Поэтому, когда мне нужно их применить, скажем, к атаке, я просто задействую список обмундирования и применить все настройки с ключем " attack ". Я сделаю также и с эффектами от заклинаний.

Далее, я работаю над меню для открытия сундуков, и решил максимально его упростить. Будем считать, что игрок всегда будет проверять его на ловушки, и , если закрыто, будет всегда пытаться автоматически его отпереть? Делать что-то еще утомительно, да и нет смысла.

Час 38 – Чуть-чуть магии

Я в отчаянии. Осталось три часа - я должен работать только над тем, что обязательно должно быть в игре.

• Я придумал пять заклинаний - три, которые применяются на игрока, и два - на монстров.
• Добавил дополнительные "уровни" для заклинания, чтобы хоть как-то их разнообразить. Уровни значительно увеличить мощность (и стоимость) заклинаний, и доступны только игрокам с повышенным параметром "магии".
• Я делаю меню игрока не статичным, так что я могу добавить в него пункты, доступные только при определенных обстоятельствах.
• Добавил возможность повышения уровня, при наборе определенного количества опыта. Повышение параметров игрока осуществляется через несколько дополнительных панелей, доступных из меню игрока.

Час 39 – Кризис, часть II

Чего мне не хватает:

• Поиска потайных дверей и вещей
• Квестовых предметов - и места, куда нужно доставить квест, чтобы выиграть игру
• Звуковых эффектов
• Музыки
• Торговцев, у которых можно покупать вещи
• Мест для отдыха
• Случайных вещей с различными бонусами и названиями
• Случайных монстры
• Графики для новых вещей, монстров, торговцев.
• Случайных ловушек и замков
• Кастования заклинаний существами
• Жезлов
• Большого подземелье с квестовым предметом (и, возможно, сильным боссом) в конце.
• Способности красться, чтобы избежать нападения монстров.

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

Вот что я решил:

• Игрок должен иметь возможность отдохнуть, чтобы восстановить здоровье и ману
• Пока игрок отдыхает монстры также восстанавливаются/возрождаются.
• Случайно сгенерированные вещи, и бонусы от них, должны подстраиваться под уровень игрока.
• Сила случайных монстров также должна подстраиваться под уровень игрока.

Начальная комната (первая вверх по лестнице) становится комнатой отдыха. В ней никогда не будет монстров. Добавил новый пункт в меню игрока, появляющийся, когда он находится в зоне отдыха – «другое». Затем я создаю подпрограмму повторной инициализации подземелье, пока игрок отдыхает. Но она пока только заглушка.

Делаю в GIMPе оставшуюся графику для вещей. У меня нет времени сделать их красивыми. Я просто нарисовал их в разрешении 32 х 32, и применил размытие, чтобы хоть как-то скрыть их уродство, а затем добавил подсветку, чтобы добавить четкости после размытия. Теперь они выглядят поплывшими и сильно поношенными.

Генератор случайных вещей умеет создавать для предмета одно или два случайных бонусных свойства, подгонять их к уровню игрока (ПРАВКА: Вы нигде не сможете посмотреть свой уровень. Забыл сделать!). Некоторые вещи имеют обязательное свойство - меч повышает атаку и/или наносимое повреждение, доспехи повышают броню, а щиты – параметр защиты. Я добавляю эти ограничения ... и вот я уже на сороковом часу.

Час 40 - Конец близок

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

Добавил еще пару комнат в подземелье, и все – ВРЕМЯ ВЫШЛО!
.
Завершающие работы

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

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

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

Py2exe позволяет делать вещи до смешного легко, превращая пакет программ Python в исполняемую программу для Windows, и чтобы запустить игру вам не нужно устанавливать Python на своем компьютере. Это все не так просто, как может показаться. Во-первых, он выдал мне, что есть отсутствующие модули и ошибки времени выполнения в коде шрифтов. Я ищу в интернете описание ошибки и узнаю что «отсутствует модулей» не более чем отвлекающий маневр, отсутствует файл шрифтов, который нужно скопировать вручную.

После того как я это сделал, полученная программа падает при запуске. Этот баг уже гораздо труднее отследить. Оказывается, что для окна обязательно нужна иконка– не скомпилированной версии она почему-то не нужна. Как только я его добавляю, все заработало. Я провожу несколько тестов - все отлично. ВОТ ТАК! Я упаковываю программу в ZIP файл (я не собираюсь возиться с инсталлятором программы). Все, Я СДЕЛАЛ.

Мой недельный проект фактически вложился в две с половиной недели в реальном времени, при частичной занятости. Реализовать все, что было задумано, не получилось, но я очень горжусь тем, что мне удалось:
http://www.rampantgames.com/hackenslash.html

Постмортем (послесловие)

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

Урок 10: Делать что-то в этом роде – это огромная польза
Прежде чем начать я сильно сомневался, стоит ли вообще это делать. Но теперь, когда все завершено, я вижу, что не только научился чему-то, но и получил заряд энтузиазма для дальнейшей работы над моим основным проектом. Вы ни за что не подумаете, что после работы над сторонним проектом будете чувствовать себя как после отдыха, но это так. И в конце концов, я потерял не так уж много времени - всего сорок часов. Это был забавный опыт – и я буду рад повторить его еще раз в будущем.

Урок 9: Выбросить что-то не всегда полезно
Некоторые из последних изменений в Hackenslash действительно сломали игровой баланс. Неспособность монстров колдовать превратилась в отсутствие необходимости "сбережения ресурсов", стало легче забредать глубже в подземелья, что сильно упростило некоторые игровые задачи. Убирая данную функцию нужно было серьезно отнестись к изменению баланса, что несомненно улучшило бы игровой процесс. Другими словами, удаление возможностей все равно приводит к дополнительным расходам на разработку игры. Это заставило меня задуматься, сколько игр были выпущены в ужасном состоянии, поскольку у команды разработчиков не было времени, чтобы пересмотреть игровой дизайн после сокращения функционала с целью уложиться в строк.

Урок 8: Делать важные вещи в первую очередь

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

Я думаю, что может работать аналогично со всеми моими будущими проектами: Я собираюсь попробовать разбить время разработки, скажем, на 8-часовые сегменты, и поиграть с самим собой в игру: Если бы у меня было всего 8 часов чтобы сделать игру, что бы я мог сделать уникального за это время? Я не знаю, будет в начале проекта от этого такой же эффект, как и в конце, но попробовать стоит.

Урок 7: Рамки проекта расширяются, угрожая бюджету и планам
Каждому программисту свойственно недооценивать время, необходимое для реализации определенной функции. Добавьте к этому наращивание функциональности, и можно гарантировать, что ваш проект выбьется из графика. Я не из тех парней, которые считают, что изменение функционала всегда плохо. Я даже думаю, что некоторые геймплейные элементы, превращающие игры в настоящие хиты, часто возникали как раз в результате такого неожиданного добавления функционала. Но новые возможности редко бесплатны. Вам придется освобождать для них место в бюджете и графике, для чего, вероятно, придется отказываться от чего-то менее важного. Этот проект научил меня быть безжалостный в сокращении возможностей. На самом деле - если бы у меня был выбор, то я бы лучше добавил к разработке еще десять дополнительных часов, лишь бы сделать игру полной - но все равно после обрезания лишнего (например, дверей, волшебных палочек, и т.д.)

Урок 6: Делайте игру работоспособной как можно раньше
Чем раньше вы сможете увидеть свою игру на экране и дать поиграть в нее другим, тем быстрее вы можете пересмотреть и улучшить ее дизайн, выбросить лишнее, и придумать отличные идеи для улучшения игры. Кроме того вы быстрее найдете ошибки (особенно ошибки в дизайне), и будет проще их исправить. Это также поможет вам правильно расставить приоритеты.

Урок 5: Иногда намного быстрее переписать код сначала
Было такое, что пришлось полностью выбросить некоторый код и начать сначала. Не могу сказать, действительно ли я сэкономил время сделав это, но подозреваю, что пришлось бы мучится с его недостатками до конца проекта. Скорее всего замена кода новым, лучше спроектированным, спасла меня от некоторых неприятностей.

Урок 4: Python рулит!
Я был удивлен, как быстро получилось реализовать некоторые вещи на Python, в отличие от, скажем, C++ или даже Java. Такие вещи, как типизация переменных, словари, списки (с учетом смешивания и соответствия типов объектов) позволили легко создать списки контента, атрибутов, эффектов заклинаний, и так далее. Мне и раньше нравился этот язык, но сейчас перспективность использования Python, если соединить его с каким-нибудь 3D движком, стала для меня очевидной.

Урок 3: Не стоит недооценивать дизайн
Просмотр изображений, графики, подгонка, тестирование и вновь подгонка даже маленьких 32 на 32 пикселя изображений отняли много моего времени – в результате игра получилась не столь удовлетворительной, как если бы я потратил эти часы на программирование.

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

Урок 2: Эффективно используйте время.
Ночь, когда я посвятил четыре часа работе над игрой, часто содержали только часа два (или меньше) времени реальной разработки. Часть времени была затрачена на документирование, но я также иногда терял сосредоточенность, делал перерыв, а потом не мог сразу вернуться к работе. Просчитав свою реальную производительность, я был очень удивлен тем, как же неэффективно я работаю.

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

Урок 1: Нет ничего невозможного!
Хотя Hackenslash в его нынешнем, 40-часовом воплощение, вряд ли может служить эталоном высококачественной продукции, я думаю, что он все же демонстрирует, как много можно сделать, - довольно сложную игру - без бюджета и с малыми затратами времени на одного разработчика. Дайте больше времени, незначительный бюджет, или помощью нескольких друзей, и кто знает, насколько лучше он сможет стать?

Суть заключается в следующем: Если вы хотите сделать свою игру, вам ничто не мешает. Главное время. И не нужен бюджет или волшебные инструменты. Не нужна команда специалистов. Не нужны годы учебы. Все что нужно – ваше желание.

И это самый главный урок из всех.

Об авторе
Jay Barnson пишет компьютерные и консольные игры профессионально и в качестве хобби на протяжении более двадцати лет. Начиная с древних Sinclair ZX80 и Commodore 64. Он участвовал в разработке Twisted Metal, Warhawk, Jet Moto, Animorphs, и Extreme Championship Wrestling. В последнее время он занимается разработкой индиигр для Rampant Games. Первая его игра , Void War, выиграла в номинации Independent Multiplayer Game 2004 года

Опубликовано 6 июля 2005 года. http://www.gamedev.net/reference/articles/article2259.asp

Категория: Мои статьи | Добавил: nilrem (05.07.2012)
Просмотров: 2319 | Теги: Python, PyGame, Java, RPG, C++ | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0