Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание ролевой компьютерной игры 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 клеток, а полный размер увеличим в два раза. Такое решение, отметим, повлияет на игровой баланс, но в нашу задачу сейчас входит демонстрация способа переноса исходных текстов на другую платформу, а не игровые настроечные аспекты:

   const

  {$IFDEF DOS_GAME}
         LOCAL_MAP_WIDTH = 8;
         LOCAL_MAP_HEIGHT = 8;

         MAP_WIDTH = 28 + LOCAL_MAP_WIDTH*2;
         MAP_HEIGHT = 28 + LOCAL_MAP_HEIGHT*2;
  {$ENDIF}

  {$IFDEF WIN_GAME}
         LOCAL_MAP_WIDTH = 20;
         LOCAL_MAP_HEIGHT = 16;

         MAP_WIDTH = 64 + LOCAL_MAP_WIDTH*2;
         MAP_HEIGHT = 64 + LOCAL_MAP_HEIGHT*2;
  {$ENDIF}

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

Следующей ошибкой станет ссылка на какую-нибудь текстовую константу. Исправить данный момент несложно - достаточно перекодировать с помощью любой общедоступной утилиты код модуля Texts - все символы из DOS-кодировки в Windows-кодировку. Текст в новом формате вставляется в препроцессорное условие определения константы RUSWIN_GAME:

  {$IFDEF RUSWIN_GAME}

  const STR_HERO_DIED = ' Герой погиб! ' ;
          STR_HERO_HP = ' Здор/Макс.Здор: ' ;
          STR_HERO_ITEMS = ' Вы несете: ' ;
          STR_HERO_MANA = ' Мана/Макс.Мана: ' ;
          STR_HERO_XY = ' Координаты: ' ;
  ...

  {$ENDIF}

Правда, в моем варианте кода содержимое 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):

  implementation uses

  {$IFDEF WIN_GAME}
    SysUtils,
  {$ENDIF}

  Hero, Monster, Map, LowLevel, GameItem, Texts;

...Game (не забывая про defines.inc):

    implementation uses

  {$IFDEF WIN_GAME}
    SysUtils,
  {$ENDIF}

    Map, LowLevel, Hero, Monster, Texts, GameItem,
                   Combat, Quest;

...Hero:

    implementation uses

  {$IFDEF WIN_GAME}
    SysUtils,
  {$ENDIF}

    Tables, Map, LowLevel, Game, Combat;

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


(c) 2004-2007 Сергей Бобровский : bo собака russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Мои книги (учебные курсы) "Технологии Delphi / C++ / C#. Разработка приложений для бизнеса".
http://shop.piter.com/display.phtml?a_id=17681&web_ok=all

Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книгах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.

Мои книги, которые пока доступны в продаже:


Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное