Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Система рационального создания спрайтов

Оформил: XVeL
Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru

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, *Ваши координаты*);


Надеюсь то что написано в этой статье вам поможет.
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay