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;
|