Создание ролевой компьютерной игры 48) Переходим в Windows
Школа программирования
48) Программирование ролевой игры: Начинаем перенос в Windows
Процесс переноса игры в Delphi не составит особого труда. Ведь на самом деле нам придется видоизменить лишь модули LowLevel и Main, а весь остальной код должен поо идее скомпилироваться без каких-либо проблем. Определенлные усилия потребуются лишь при формировании красивой картинки игрового пространства - пещеры, героев, монстров и других элементов, а также по адаптации цикла обработки клавиатуры в Main к интерфейсу взаимодействия с пользователем Windows. Мы не будем подробно останавливаться на способах создания
и использования быстрых графических интерфейсов, вы можете выбрать соответствующую технологию самостоятельно, будь то DirectX, OpenGL или бесплатная графическая библиотека G32.org для обычного оконного режима Windows. В нашу задачу входит демонстарция работоспособности нашей архитектуры в разных операционных системах и гибкости при использовании принципиально различающихся методов взаимодействия с человеком-игроком.
Перенос начнем с транспортировки всех файлов в новую среду. Создадим в Delphi (далее рассказывается об использовании версии Delphi 7) стандартный пустой проект (File - New - Application), сохраним в некотором каталоге, после чего перенесем в этот же каталог все текущие файлы нашего проекта (все *.pas файлы за исключением Main.pas, а также прихватим defines.inc). Далее включим все эти добавленные файлы (кроме defines.inc) в текущий проект Delphi командой Project - Add To Project.
Теперь выполним модификацию файла definec.inc, где хранятся препроцессорные константы, связывающие настройки нашего кода с целевой платформой. Отключим константу DOS_GAME и включим WIN_GAME:
{ $DEFINE DOS_GAME} // в начале перед $ добавлен пробел:)
{$DEFINE WIN_GAME}
Аналогично поступим и с определениями констант кодировки русских текстов (для DOS или Windows):
{ $DEFINE RUSDOS_GAME} // в начале перед $ добавлен пробел:)
{$DEFINE RUSWIN_GAME}
Запустим компилятор - он должен показать немало ошибок, ведь Delphi умеет анализировать модули целиком, выявляя несколько ошибок сразу. Порядок ошибок зависит от порядка добавления существующих модулей к проекту,
у меня первой ошибкой стало напоминание компилятора о том, что в модуле Map не определен размер карты.
Так как у нас карта будет графическая, то прикинув возможный размер экрана, выберем размер одной клетки-тайла - допустим, 32*32 пиксела. Тогда исходя из минимального размера экранного разрешения, на который стоит ориентироватсья (пускай 800*600) остановимся на размере видимой части 20*15 клеток, а полный размер увеличим в два раза. Такое решение, отметим, повлияет на игровой баланс, но в нашу задачу сейчас входит демонстрация способа переноса исходных текстов на другую платформу, а не игровые настроечные аспекты:
Прежний код для DOS мы, конечно, не удаляем. В дальнейшем всегда будет подразумеваться, что часть кода, заданная препроцессорными настройками для DOS_GAME, остается без изменений.
Следующей ошибкой станет ссылка на какую-нибудь текстовую константу. Исправить данный момент несложно - достаточно перекодировать с помощью любой общедоступной утилиты код модуля Texts - все символы из DOS-кодировки в Windows-кодировку. Текст в новом формате вставляется в препроцессорное условие определения константы RUSWIN_GAME:
Правда, в моем варианте кода содержимое Texts.pas для наглядности уже было написано в Windows-кодировке :) , поэтому достаточно просто сделать копию существующих констант и заменить препроцессорную константу.
Следующая ошибка, которую, к сожалению, часто допускают, переходя из Turbo/Borland Pascal в Delphi - это использование новых ключевых слов в качестве идентификаторов. Так, слово Class, которое мы задействовали в описании класса персонажа (тип THero), в компиляторе Delphi, где существенно улучшена работа с классами и объектами, является активно применяемым.
Выход - в уточнении слова Class в качестве названия поля. Укажем вместо него HeroClass:
type THero = record
Chars : array[1..MaxChars] of Integer;
Skills: array[1..MaxSkills] of Integer;
Items : array[1..MaxHeroItems] of TGameItem;
Slots : array[1..MaxSlots] of TGameItem;
x,y,
HP, MaxHP,
Mana, MaxMana,
Exp, MaxExp, Fatigue,
Level, VisLong: Integer;
HeroClass, Race: Integer; // исправили class на HeroClass
Name: String[20]; end;
После этого запустим компилятор и исправим все обращения к этому полю, на которые сразу обратит внимание компилятор - в модуле Hero.
Очередная ошибка - отсутствие функции IntToStr в модуле Combat и ряде других. Эта функция в версии для Доса была реализована вручную, теперь же достаточно подключить к списку модулей стандартный модуль SysUtils. Только делать это надо аккуратно - по-прежнему с использованием препроцессора:
implementation uses
{$IFDEF WIN_GAME}
SysUtils,
{$ENDIF}
Game, LowLevel, Texts, Monster, Map;
В начало модуля Combat также добавим команду подключения настроек:
{$I DEFINES.INC} unit Combat;
...
Аналогичную операцию проделаем и с модулями Quest (с добавлением в первую строчку подключения defines.inc):
И наконец компилятор показывает ошибки только для модуля LowLevel, где сообщает об отсутствии в разделе реализации всех необходимых процедур и функций. С ним будем разбираться в следующем занятии.
(c) 2004-2007 Сергей Бобровский : bo собака russianenterprisesolutions.com
Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книгах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.