Главная » 2D графика » Создание карты в игре методом спрайтов

RSS

Создание карты в игре методом спрайтов

Не нравитсяНравится   Рейтинг +6

По поводу Table – я использовал TList вместо Array т.к. при создании мы можем не знаем, какого размера карту будем делать. В игре создавая один TFlur можно подгружать туда новые карты динамически, при переходе на новый уровень ( зону, город … ), без замедления.
Рассмотрим процедуру Draw, т.к. все остальное достаточно понятно :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Procedure TFlur.Draw(DestHandle:TCanvas;X,Y:Integer;SourceRect:TRect);
var
  I,J:integer;
  dx,dy:integer; // для смещений в пикселях
  TableIndex:^integer; // указатель на элемент Table
begin
  // Делаем проверку
  if SourceRect.Left<0 then exit;
  if SourceRect.Top<0 then exit;   if SourceRect.Left+SourceRect.Right>Heigth-1 then exit;
  if SourceRect.Top+SourceRect.Bottom>Width-1 then exit;
  dx:=0;dy:=0;// обнуляем смещение
  // зададим цикл по области карты для показа
for I:=SourceRect.Left to SourceRect.Left+SourceRect.Right do
begin
  for J:=SourceRect.Top to SourceRect.Top+SourceRect.Bottom do
  begin
    TableIndex:=(Table.Items[Width*J+I]);
    // Уже знакомой прцедурой копируем один спрайт на экран
    BitBlt(DestHandle.Handle,dx+X,dy+Y,SpriteWH,
    SpriteWh,Resource.Canvas.Handle,TableIndex^*SpriteWh, 0,SRCCopy);     inc(dy,SpriteWH);// увеличиваем смещение dy на SpriteWH
  end;
  Inc(dx,SpriteWH);dy:=0;// увеличиваем смещение dx на SpriteWH, обнуляем dy
end;
end;

Достанем элемент из списка с координатами I,J

Так, в принципе класс написан, это даже не класс а некое подобие ENGINE :) Что можно добавить, изменить и т.д. Все зависит от конкретной задачи:

  1. Если вы хотите сделать что-то подобное Color Lines, шахмат, морского боя и т.д. вам совсем не обязательно вводить Table – поле всегда имеет одинаковые размеры.
  2. При выполнении Flur.Draw неплохо ввести проверку на значения SourceRect ( я сделал ее внутри процедуры обработки клавиатуры).
  3. Все объекты карты – дома, леса, юниты, технику и д.р. желательно привязывать к координатам пиксельным ( да и вообще скроллинг карты надо делать то же пиксельным – но об зтом позже ).
  4. Дописать загрузку Table из файла.
  5. При выводе графики на в окно происходит мерцание курсора. Это связано с тем, что обновление курсора намного медленнее, чем вывод графики. Исправить это можно следующим способом. С формы убирается курсор ( Form1.Cursor:=crNone; ). Координаты курсора запоминаем в двух переменных. При от рисовки делаем так : создаем буфер, рисуем Flur в буфер, далее туда пихаем картинку из ImageList’а. И выводим буфер на экран.Плюсы этого метода: можно сделать курсор любой формы и менять его по ходу игры, ну и избавимся от дрожания.

Вроде все, исходник тут.

Страницы : 1 2 3 4 5