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

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

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

Главная » Статьи » Игровые алгоритмы

Процедура генерирования (создания) игровой карты
После долгих попыток сделать процедуру генерирования игровых 2д карт универсальной, я ее таки довел до ума. Итак для начала обьявляем процедуру таким образом:

Procedure GenerateMap(xKarti,yKarti,MinTekstur,MaksTekstur:integer; var Yacheyka:array of integer);

Слово var является обязательным. Если его не написать то наш массив для карты будет заполняться внутри процедуры, а за ее пределами оставаться пустым.

Далее вставляем код, непосредственно самой процедуры.

Procedure GenerateMap(xKarti,yKarti,MinTekstur,MaksTekstur:integer;
var Yacheyka: array of integer);
var
i:integer;
begin
randomize;
for i:=0 to xKarti*yKarti-1 do
Yacheyka[i]:=random(MaksTekstur)+MinTekstur;
end; 

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

Рассмотрим параметры процедуры:
xKarti - ширина карты в клеточках
yKarti - высота карты в клеточках
MinTekstur - минимальный номер текстуры или бьекта
MaksTekstur - максимальный номер текстуры или обьекта
Yacheyka - заполняемый массив.

Теперь рассмотрим примеры использования готовой процедуры:
1. GenerateMap(33,22,1,10,map.textures);
2. GenerateMap(33,22,1,10,massiv);

Массиві должні быть обьявлены заранее. Можно использовать как статические так и динамические массивы. При использовании динамических массивов, нужно перед использование процедуры задать размер заполняемого массива.

И в итоге пример отображения текстур на графическом буфере:

procedure MapDraw(xKarti,yKarti,xTile,yTile:integer; buf:Tbitmap);
var
i,x,y:integer;
begin
  x:=0;
  y:=0;
  //prorisovka tekstur
  for i:=0 to xKarti*yKarti-1 do
  begin
    if i>0 then x:=i mod xKarti;
    if (x=0) and (i>0) then y:=y+1;
    buf.Canvas.Draw(x*xTile,y*yTile,Pic.Textures[ map.textures[i] ]);
  end;
end;

Не забудьте итоговый буфер на чем-то прорисовать.

На этом все. Дерзайте!
Категория: Игровые алгоритмы | Добавил: Armageddets (11.07.2012)
Просмотров: 1276 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Где Вам удобнее оставлять коментарии и задавать вопроссы?
Всего ответов: 24
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

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