Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 16.05.2024, 12:03
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Графика

Как строить тайловые миры? Игровой клеточный мир как двухмерная карта.

Как строить тайловые миры? Игровой клеточный мир как двухмерная карта.

 

 

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

 

Карта из тайлов имеет как преимущества так и недостатки. Обычно подобные карты используются в стратегиях и РПГ играх, также можно использовать в играх с видом сверху. Хотя мастера могут применить подобные тайловые карты в любом жанре игр.

 

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

 

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

 

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

 

Предлагаю рассмотреть простой вариант с двух уровневой картой. Первый уровень будет содержать номера земельных покрытий. Второй (более высокий уровень) будет содержать номера обьектов (деревья, камни, здания и другое). Для такой карты нужно создать трехмерный массив Map. Первая цифра будет означать координату Х, вторая цифра – координату У, а третья цифра – номер уровня карты. Размер карты возьмем равный 20х20 клеточек. Нумерация клеток будет с нулевой начинаться (для удобства расчетов клика по карте и так далее). Обьявляем массив карты так:

 

Var

Mas:array[0..19,0..19,0..1] of integer;

 

После того как массив объявлен, его нужно заполнить информацией. В нашем случае – это номера земель и номера объектов. Можно делать это вручную так:

 

Mas[0,0,0]:=0;

Mas[0,1,0]:=0;

Mas[0,2,0]:=0;

Mas[19,19,1]:=0;

 

Этот вариант очень время затратен, поэтому предлагаю заполнить его в цикле, и при этом еще и цифрами, случайными заполнять. Для начала определимся, у нас будет 4 вида земель:

 

0 – вода

1 – песок

2 – земля (трава)

3 – глина

4 - снег

 

Игровых объектов, пускай, будет четыре:

 

0 – объектов нет в клеточке

1 – дерево

2 – здание

3 – камень

4 – костер

 

Начинаем заполнение случайными числами наш массив карты:

 

Randomize;

For i:=0 to 19 do

For j:=0 to 19 do

For k:=0 to 1 do

Mas[I,j,k]:=random(5);

 

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

Mas: array[0..9, 0..9] of integer =

( (2, 2, 2, 2, 2, 2, 2, 2, 2, 2),

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

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

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

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

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

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

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

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

(2, 2, 2, 2, 2, 2, 2, 2, 2, 2));

 

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

 

 

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

 

Var

Ground:array[0..4] of TBitmap;

Objects:array[1..4] of TBitmap;

 

Objects начинается с единицы, потому как если нет объекта в клеточке значит ничего и рисовать не нyжно. А с землей все наоборот – пустого места на карте быть не может какая-то земля все равно быть должна. Также не забывайте что самый первый уровень (в нашем случае земля) загружается без прозрачности, так как под ним ничего не будет и прозрачных дыр в карте быть не должно. А вот остальные уровни нужно загружать, делая фон картинок прозрачным, так мы получим эффект того, что обьекты стоят именно на нужном виде земли.

 

В более ранних статьях я уже писал как узнань путь к папке с игрой. Допустим наша игра находится на локальном диске D:\. Объекты находятся в папке objects, а земель – в папке Ground. Каждая картинка названа номером вида земли или номером обьекта. Программно это выглядит так:

 

For i:=0 to 4 do

Begin

Ground[i]:=TBitmap.Create;

Ground[i].LoadFromFile(‘D:\Game\ground\’+inttostr(i)+’.bmp’);

End;

 

For i:=1 to 4 do

Begin

Objects[i]:=TBitmap.Create;

Objects[i].Transparent:=true;

Objects[i].LoadFromFile(‘D:\Game\objects\’+inttostr(i)+’.bmp’);

End;

 

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

 

Итак картинки загружены, причем объекты загружены с прозрачным фоном (то есть фона видно не будет вообще вокруг картинки). Все, что нужно сделать дальше – это проверка какую картинку в каких координатах рисовать. Делаем это в компоненте таймер. Причем рисовать всю картинку мы будем не сразу на форме. Иначе при прорисовкекартинка будет мигать, а это очень неприятно для глаз. Чтобы мигания не происходило нужно все сначала прорисовывать на графическую переменную типа TBitmap, которая сыграет роль графического буфера. Когда все картинки будут прорисованы, только тогда будет прорисован и сам буфер. Создаем графический буфер:

 

Var

Buf:TBitmap;

 

Теперь в таймере делаем проверку какую картинку с какими координатами рисовать и рисуем все на буфер. Затем рисуем буфер на самой форме с нулевыми координатами – верхнего левого угла формы. Предположим клеточки у нас размером 32х32:

 

For i:=0 to 19 do

For j:=0 to 19 do

Buf.Canvas.Draw(i*32,j*32, Ground[ Map[I,j,0] ] );

 

For i:=0 to 19 do

For j:=0 to 19 do

Buf.Canvas.Draw(i*32,j*32, Objects[ Map[I,j,1] ] );

 

Form1.Canvas.Draw(0,0,Buf);

 

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

 

For i:=0 to 4 do

Begin

Ground[i]:=TBitmap.Create;

Ground[i].Width:=32;

Ground[i].Height:=32;

Ground[i].LoadFromFile(‘D:\Game\ground\’+inttostr(i)+’.bmp’);

End;

 

For i:=1 to 4 do

Begin

Objects[i]:=TBitmap.Create;

Objects[i].Transparent:=true;

Objects[i].Width:=32;

Objects[i].Height:=32;

Objects[i].LoadFromFile(‘D:\Game\objects\’+inttostr(i)+’.bmp’);

End;

 

Этот пример построения миров довольно легок и прост. Как раз для новичков очень и очень понятен должен быть. В моем примере я использовал картинки формата .BMP. С ним легче всего работать. Если Вы хотите работать с форматом JPG или JPEG, то нужно в месте объявления модулей добавить формат:

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, JPEG;

 

Переходим к следующему этапу. Вы ведь понимате, что хранить массивы карт внутри программы не удобно? Тогда можно их хранить в текстовых файлах. К примеру наш созданный массив можно занести в компонент Memo. А затем данные из мемо сохранить в любой текстовый файл, даже если его еще нет (он будет создан). Можно конечно сохранять массивы напрямую в текстовый файл, но это немножко сложнее.

 

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

 

Memo1.ScrollBars:=ssBoth;

Memo1.Lines.Clear;

Memo1.Visible:=false;

 

А теперь заполняем мемо нашим игровым массивом карты, переменная Levels содежит количество уровней карты (в нашем случае 2), а переменная Level содежит текущий уровень (минимальный уровень - нулевой):

 

while (Level<=Levels-1) do

  begin

    for j:=0 to 19 do

    begin

      MAPS.Lines.Add('');

      for i:=0 to 19 do

      begin 

        Memo1.Lines.Strings[Memo1.Lines.Count-1]:= Memo1.Lines.Strings[MAPS.Lines.Count-1]+'00'+inttostr(Map[i,j,Level]);

      end;

    end;

    Level:=Level+1;

  end;

 

Когда мемо заполнен, то указываем путь куда сохранять и как назвать файл с картой:

 

Memo1.Lines.SaveToFile(‘D:\Game\maps\map1.txt’);

 

Для того, чтобы в нужный момент загрузить карту, нужно загрузить ее в мемо:

 

Memo1.Lines.LoadFromFile(‘D:\Game\maps\map1.txt’);

 

Добавляем две переменные: одна будет содержать строчки с цифами из файла, а вторая показывать текущую строку для считывания из мемо.

 

Var

Stroka:String;

Strok:integer;

 

А затем заполнить массив данными мемо:

 

 

  while (Level<=Levels-1) do

  begin

    for j:=0 to 19 do

    begin

      Strok:=Strok+1;

      Stroka:=Memo1.Lines.Strings[Strok];

      for i:=1 to 19 do

      begin

        Map[i-1,j,Level]:= StrToInt( Stroka[i*3-2]+Stroka[i*3-1]+Stroka[i*3] );

      end;

    end;

    Level:=Level+1;

  end;

 

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

 

Источник: delgame.at.ua

Категория: Графика | Добавил: Armageddets (29.08.2013) | Автор: Как строить тайловые миры? Игровой
Просмотров: 2937 | Теги: игровая карта на делфи, как создать тайловый мир, тайловая карта, Тайлы в делфи, карта из тайлов | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Оцените мой сайт
Всего ответов: 103
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

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