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

Как заработать в интернет

  Все выпуски  

От идеи до игры Выпуск 6


От идеи до игры

Выпуск 6

 

Загружаем карту

 

Скачать пример

 

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

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

Теперь немного о модуле map.pas. Что бы не изобретать велосипед заново, данный модуль бессовестно взят из игры Diamond Fighter, эту игру и многие другие Вы можете скачать с сайта автора движка Омега (http://onedgames.mirgames.ru).

А теперь можно переходить к описанию модуля map.pas

 

unit Map;

 

interface

 

procedure LoadMap(FileName : String);

procedure DrawMap;

 

type TClassicMap       = array[0..18, 0..24] of Byte;

type TClassicGroundMap = array[0..12, 0..12] of Byte;

 

type TMapHeader = record

  Name    : String[25];

  Time    : Integer;

  ECreate : Byte;

end;

 

var

  ClassicMap  : TClassicMap =

(

  (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),

  (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

);

 

ClassicMapGround  : TClassicGroundMap =

(

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72),

  (72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72)

);

 

  MapHeader : TMapHeader;

  BaseFrame    : Single = 1;

 

implementation

uses OMEGA, PRESENT, SysUtils;

 

procedure LoadMap(FileName : String);

  var

    F : File;

Begin

Assign( F, FileName );

Reset ( F, 1        );

BlockRead( F, MapHeader, sizeof( TMapHeader ) );

BlockRead( F, ClassicMap,       sizeof( ClassicMap       ) );

BlockRead( F, ClassicMapGround, sizeof( ClassicMapGround ) );

CloseFile(F);

End;

 

procedure DrawMap;

  var

    i, j : integer;

Begin

Tex_SetFramesSize(TexGround, 64, 48);

Tex_SetFramesSize(TexBricks, 32, 32);

Tex_SetFramesSize(TexBase, 64, 64);

 

for i := 0 to 12 do

  for j := 0 to 12 do

    ASprite_Draw(TexGround, j * 64, i * 48, 64, 48, ClassicMapGround[i, j], 255, 0);

 

  for i := 0 to 18 do

    for j := 0 to 24 do

      begin

       if (ClassicMap[i, j] < 64) and (ClassicMap[i, j] > 0) and ( ClassicMap[i, j] <> 55 ) Then

         ASprite_Draw(TexBricks, j * 32, i * 32, 32, 32, ClassicMap[i, j], 255, 0);

        if ClassicMap[i, j] = 65 Then

          ASprite_Draw(TexBase, j * 32, i * 32, 32, 32, M_Round( BaseFrame ), 255, 0);

      end;

 

  for i := 0 to 18 do

    for j := 0 to 24 do

      if ClassicMap[i, j] = 55 Then

        ASprite_Draw(TexBricks, j * 32, i * 32, 32, 32, ClassicMap[i, j], 255, 0);

End;

 

end.

 

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

 

TClassicMap – это двухмерный массив, содержащий в себе кирпичики карты из которых она строится. 18 – по вертикали и 24 – по горизонтали.

 

TClassicGroundMap – это тоже двухмерный массив, только содержит он кирпичики из которых строится «земля» карты. 12 – по вертикали и горизонтали.

 

TMapHeader – содержит в себе параметры карты, а именно:

Name – имя карты

Time – время через которое появляется новый монстр

 

Далее переменным ClassicMap и ClassicMapGround присваиваются соответствующие типы и заполняются пустотой с кирпичами по краям.

 

MapHeaderпеременная в которую будет записываться все параметры карты.

 

Затем идет процедура загрузки карты LoadMap:

 

Assign( F, FileName ); - переменной F задается тип файла, FileName – имя файла

 

Reset ( F, 1 ); - открытие файла если он существует

 

BlockRead( F, MapHeader, sizeof( TMapHeader ) ); - чтение данных из файла в переменную MapHeader, размером равным размеру типа TMapHeader

 

BlockRead( F, ClassicMap,       sizeof( ClassicMap) ); - аналогично предыдущему

 

BlockRead( F, ClassicMapGround, sizeof( ClassicMapGround) ); - аналогично предыдущему

 

CloseFile(F); - закрытие файла

 

И, наконец, процедура рисования игрового уровня:

 

Здесь задается размер фрейма в текстуре, т.е. большая текстура делится на несколько маленьких текстур одинакового размера, на фреймы

Tex_SetFramesSize(TexGround, 64, 48);

Tex_SetFramesSize(TexBricks, 32, 32);

Tex_SetFramesSize(TexBase, 64, 64);

 

В этом цикле рисуется «земля» уровня

for i := 0 to 12 do

  for j := 0 to 12 do

    ASprite_Draw(TexGround, j * 64, i * 48, 64, 48, ClassicMapGround[i, j], 255, 0);

 

А здесь уже интереснее, в данном цикле рисуются «кирпичики» из которых строится уровень, что касается чисел 64, 0, 55 и т.д., то это номера текстур из которых строится уровень

  for i := 0 to 18 do

    for j := 0 to 24 do

      begin

       if (ClassicMap[i, j] < 64) and (ClassicMap[i, j] > 0) and ( ClassicMap[i, j] <> 55 ) Then

         ASprite_Draw(TexBricks, j * 32, i * 32, 32, 32, ClassicMap[i, j], 255, 0);

        if ClassicMap[i, j] = 65 Then

          begin

          ASprite_Draw(TexBase, j * 32, i * 32, 32, 32, M_Round( BaseFrame ), 255, 0);

          end;

      end;

 

И наконец здесь тоже рисуются «кирпичики»

  for i := 0 to 18 do

    for j := 0 to 24 do

      if ClassicMap[i, j] = 55 Then

        ASprite_Draw(TexBricks, j * 32, i * 32, 32, 32, ClassicMap[i, j], 255, 0);

 

Не знаю на сколько понятно я Вам все объяснил, но судя по тому, что писем мне приходит не так уж много, то будем считать, что все всё поняли.

 

Теперь, что касается процедуры ASprite_Draw, про нее ничего не было сказано на протяжении всего урока. Сейчас я объясню ее смысл. По сути эта процедура нужна для анимации спрайтов, но в дано случае она выводит только нужный нам кадр. Первый ее параметр это переменная текстуры, которую нужно обрабатывать, затем две переменные это координаты текстуры по XY, далее идет размер текстуры, точнее фрейма текстуры, затем номер фрейма, альфа-канал и угол поворота текстуры.

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

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

Пишите мне все туда же, на мыло rain.zero@mail.ru или на форум, там будем отвечать всем коллективом. Сайт наш прежний http://mgteam.fasttech.ru. Буду надеется, что ремонт закончу уже на этой неделе и задержек больше не будет!

 

До скорой встречи!


В избранное