Разработка игры Fly (часть 2)

Опубликовал – 10.06.2010

Если вы не читали вступительную и первую части и, так как эта статья основывается на первых двух, я рекомендую Вам это сделать. А для всех остальных, пожалуй, начнем наш урок.

Сегодня я вам расскажу, как организовать объектно-ориентированную модель нашей игры.

В среде Delphi в нашем проекте мы будем использовать из доступных VCL компонентов только TForm - это форма, она создается по умолчанию при создании нового проекта. И добавим новый компонент на нашу форму  TApplicationEvents (найти его можно во вкладке Additional),

который перехватывает все события нашего приложения. Нам понадобится только один из его обработчиков, OnIdle (процессор освобожден и не поступает никаких сообщений от пользователя) в этом событии мы будем рисовать сцену, считать AI, и так далее – это и будет нашим жизненным циклом. Можно, конечно, использовать альтернативные компоненты, например TTimer, но он совсем неточный и срабатывает, порой, когда ему вздумается, для игр он не подходит. Собственно, для больших игр писать приложение стоит только на чистом API, без использования VCL компонентов, в пользу скорости и адекватности поведения приложений.

Давайте немного настроим форму и наш единственный компонент на ней. Во-первых, найдем среди инструментов Delphi окошко Object Inspector:

Во-вторых, выбираем нашу форму Form1 ищем свойства и изменяем:

  • Name: frmMain – имя формы в нашей программе
  • Caption: «Fly» – лучшая игра Российской Федерации - заголовок на самой форме
  • ClientWidth: 400 - ширина формы
  • ClientHeight: 360 - высота формы
  • BorderStyle: bsSingle - форма не может растягиваться пользователем
  • BorderIcons->biMaximize: false - отключаем возможность раскрытия окна на полный экран

Далее выбираем в Object Inspector компонент ApplicationEvents1 и изменяем одно свойство:

  • Name: appEvent - имя перехватчика событий

Теперь сохраним проект File->Save All и откомпилируем Ctrl+F9.

Практика

Итак, хватит вступлений, приступим к реализации нашего основного класса игры, который будет отвечать за основной цикл игры и обработку действий пользователя. Добавим в наш проект Unit - это можно сделать в меню File->New->Unit. У нас открылся новый модуль с именем Unit1, сразу нажимаем меню File->Save All, откроется диалоговое окно, которое предложит нам сохранить новый модуль, назовем его uGame.pas. Таким же образом создадим еще один файл Constants.pas, в нем будут храниться наши константы всевозможных настроек игры. Сразу запишем в него две константы (ширина и высота игрового пространства):

unit uConstants;

interface

const
  FieldHeight   = 360;
  FieldWidth    = 400;

implementation

end.

Далее подключим модуль uContants в модуль uGame, чтобы uGame мог видеть наши константы:

unit uGame;

interface

uses
  uConstants;

implementation

end.

Так выглядит наш модуль uGame на данном этапе. Точно так же подключаем модуль uGame к нашему основному модулю с формой main, добавив в uses, через запятую, uGame. У меня это выглядит так:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AppEvnts, uGame;

Теперь создадим класс TGame. Описание класса в Delphi происходит перед ключевым словом implementation и после ключевого слова type, а после implementation - его реализация. Значит описываем класс TGame:

unit uGame;

interface

uses
  Windows, uConstants;

type
  TGame = class //наш движок
  private //видимы только в данном классе..
    LastTime: DWORD; //время, которое нам понадобится, чтобы засекать равномерные интервалы перед обработкой жизненного цикла игры
    procedure ProcessKey(); //процедура обработки нажатия клавиш пользователя
  public // публичные методы
    procedure MainLoop(); //главный цикл программы
    constructor Create(); //инициализация нашего движка
    destructor Destroy(); override; //перед закрытием формы, мы будем удалять из памяти все объекты которые создали.
  end;

implementation

end.

Просто, не так ли? Дальше опишем реализацию класса TGame после ключевого слова implementation:

constructor TGame.Create();
begin
  //тут будем инициализировать наши игровые объекты
end;

destructor TGame.Destroy();
begin
  //тут чистить их
end;

procedure TGame.ProcessKey();
begin
  //обработка клавиатуры
end;

procedure TGame.MainLoop();
begin
  //главный цикл
end;

Теперь сохраним наш проект и попробуем откомпилировать. На сегодня у меня все.  Если есть вопросы, пишите в комментариях, постараюсь ответить всем! Успехов! Продолжение следует…

Исходные коды к данной статье fly (part 2).

Рассказать друзьям:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • Яндекс.Закладки
  • В Живую Ленту Google
  • Сто закладок
Комментарии (4) - Разработка игры Fly (часть 2)

Ответ

  1. Саня:

    выбивало ошибку и жаловалось на TGame.ProcessKey(), вы забыли добавить эту процедуру после приват, ну…а так вроде все нормально пока, идём дальше)

    Thumb up Thumb down +2

    • доброжелатель:

      9 TGame = class
      10 private
      11 LastTime: DWORD;
      12 procedure ProcessKey();
      13 public
      14 procedure MainLoop();
      15 constructor Create();
      16 destructor Destroy(); override;
      17 end;

      11 procedure TGame.ProcessKey();
      12 begin
      14 end;
      15

      Thumb up Thumb down 0

  2. SerjiMix:

    uses
    06 Windows, uConstants;

    сдесь нужно убрать «u» перед Constants; т.к. изначально название в уроке Constants…сам только что попался на этом)))

    Thumb up Thumb down 0

Ответить

Comments

Перед отправкой формы: