скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Система рационального создания спрайтов



Оформил: XVeL
Автор: Daddy

B примере мы рассмотрим Четыре способа создания спрайтов:
1. Аркадный
2. Нерациональный
3. Рациональный
4. Рациональный два
Итак способ первый - Аркадный. Его смысл заключается в том, что процедура создания спрайта описывается в коде заранее, а значит параметры спрайта определены ещё до его появления. Вот пример:
constructor TPlayerSprite.Create(AParent: TSprite);
begin
   inherited Create(AParent);
   Image := MyForm.ImageList.Items.Find('PlayerScate');
   Width := Image.Width;
   Height := Image.Height;
   X := 20;
   Y := 240-Height div 2;
   Z := 2;
   PixelCheck:=true;
   AnimCount := Image.PatternCount;
   AnimLooped := True;
   AnimSpeed := 0/1000;
end;
Минус сей идеи в том, что каждый раз спрайт будет появлятся в одном и том же месте (в примере по Икс=20 и по Игрик=240 минус половину высоты картинки). Такой способ хорош только для аркад - где главный герой появляется строго в заданном месте. Второй способ - нерациональный. Каждому спрайту придумать свое имя (не путать с классом). Покажу на примере как это:
procedure TMainForm.FormCreate(Sender: TObject);
var MASHINA : TplayerSprite; //Вот оно имя спрайта - MASHINA
begin
   mashina:=TplayerSprite.create(spriteengine.engine);
   with TplayerSprite(mashina) do
   begin
      Image := MyForm.ImageList.Items.Find('PlayerScate');
      Width := Image.Width;
      Height := Image.Height;
      X := 20;
      Y := 240-Height div 2;
      Z := 2;
      PixelCheck:=true;
      AnimCount := Image.PatternCount;
      AnimLooped := True;
      AnimSpeed := 0/1000;
   end;
end;
Минус этой идеи в том, что спрайтов можно использовать ограниченное количество (только те которые так описаны и имеют свое имя), таким образом чтобы создать 100 спрайтов надо 100 раз написать эту функцию и придумать 100 разных имен! И вот наконец 3-й - Рациональный способ. Его идея состоит в том, чтобы создать TList добавить в него нужное кол-во спайтов и обработать их в нем. Вот пример для создания сотни спрайтов класса TPlayerSprite стоящих в ряд:
Procedure TMainForm.StartGameScene;
var
   i:integer; //Переменная счета
   List : Tlist;
begin
   List:=Tlist.create;
   for i:=1 to 100 do
   begin
      list.add(TPlayerSprite.create(spriteengine.engine));//Создаем спрайт и добавляем его в TList
      with TplayerSprite(list.items[0]) do //Устанавливаем его характеристики
      begin
         Image := MyForm.ImageList.Items.Find('PlayerScate');
         Width := Image.Width;
         Height := Image.Height;
         X := 20+width*i; //Ставим его на место в ряд по номеру
         Y := 240-Height div 2;
         Z := 2;
         PixelCheck:=true;
         AnimCount := Image.PatternCount;
         AnimLooped := True;
         AnimSpeed := 0/1000;
      end;
      list.clear; //Спрайт готов, и в TList он больше не нужен
   end;
   list.free; //Спрайты созданы и Tlist нам больше не нужен
end;
У этого варианта нет минусов. Именно "мутации" этой идеи используются в большинстве проффесиональных игр. Совсем забыл вот ещё четвертый:
Type
   TOrc = class(TImageSprite) //Орк становится подклассом
   public
      constructor Create(AParent: TSprite;nx,ny:double);
   end;

//А вот сама процедура:
constructor TOrc.Create(AParent: TSprite;nx,ny:double);
begin
   inherited Create(AParent);
   image:=myform.il.Items.Find('stand'); //Ну или свою картинку
   width:=image.Width;
   height:=image.Height;
   x:=nx;
   y:=ny;
   //Тут чего нить свое
end;
Работает как часы! Орк(в примере) создается командой:
Torc.create(spriteengine.engine, *Ваши координаты*);


Надеюсь то что написано в этой статье вам поможет.





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook