DelphiX: Загрузка и вывод спрайтов
Приступим. Для начала выложим на форму все необходимые компоненты: TDXTimer, TDXImageList и TDXDraw. Названия компонентов изменять не будем. TDXTimer - это таймер. Нужен он для того, чтобы экран обновлялся. TDXImageList это коллекция загруженных спрайтов. А на TDXDraw будет вся выводимая графика отображаться.
Создайте событие onInitialize у DXDraw1:
procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
{тут будут загружаться спрайты}
DxImageList1.Items.MakeColorTable;
DXDraw1.ColorTable:=DxImageList1.Items.ColorTable;
DXDraw1.DefColorTable:=DxImageList1.Items.ColorTable;
DXDraw1.Cursor:=CrNone;
DXTimer1.Enabled:=True;
end;
Теперь создайте событие onFinalize у того же компонента:
procedure TForm1.DXDraw1Finalize(Sender: TObject); begin DXTimer1.Enabled:=False; DXImageList1.Free; end;
Теперь необходимо связать между собой DXImageList1 и DXDraw1. Для этого у DXImageList1 свойство DXDraw устанавливаем в DXDraw1.
Дальше реализуем процедуры загрузки спрайтов и их вывода на экран.
Procedure TForm1.LoadSprite(Var DXList: TDXImageList; Name: String;
TransparentIMG: boolean);
Begin
DXList.Items.Add;
if TransparentIMG then
DXList.Items[DXList.Items.Count-1].TransparentColor:=ClLime;
DXList.Items[DXList.Items.Count-1].Picture.LoadFromFile(Name);
End;
Разберемся со входными параметрами процедуры. DXList – указание в какой TDXImageList будет загружаться спрайт. Name – путь к файлу. TransparentIMG – будет ли использоваться прозрачный спрайт. Если да то весь полностью зеленый цвет не будет виден.
Далее реализуем загрузку части картинки. Зачем это нужно? Например, существует анимация, но все кадры расположены в одном файле. Каждый следующий кадр правее предыдущего. Т.к. все кадры одного размера, то их можно загрузить в цикле. Это намного удобнее.
Procedure TForm1.LoadSpritePos(Var DXList : TDXImageList; Name : String; X1,Y1,X2,Y2: integer; TransparentIMG : boolean); Var BmLoad, BmPos : TBitMap; Begin BmLoad:=TBitMap.Create; BmPos:=TBitMap.Create; BmPos.Canvas.Create; BmPos.Width:=x2-x1; BmPos.Height:=y2-y1; BmLoad.LoadFromFile(Name); BmPos.Canvas.CopyRect(Rect(0,0,x2-x1,y2-y1),BmLoad.Canvas,Rect(X1,Y1,X2,Y2)); DXList.Items.Add; If TransparentIMG then DXList.Items[DXList.Items.Count-1].TransparentColor:=ClLime; DXList.Items[DXList.Items.Count-1].Picture.Bitmap:=BmPos; End;
С загрузкой разобрались, теперь реализуем процедуру вывода:
Procedure TForm1.PutImage(DXList : TDXImageList; X, Y, X2, Y2, Index : Integer); Begin DXList.Items[Index].StretchDraw(DXDraw1.Surface, Rect(X, Y, X+X2, Y+Y2), 0); End;
Index – номер выводимого спрайта в DXImageList1.
Теперь во время инициализации нужно загрузить спрайты. В процедуре DXDraw1Initialize вместо ремарки «тут будут загружаться спрайты» вставим:
LoadSprite(DXImageList1, 'Images\FONE.JPG' ,False); LoadSprite(DXImageList1, 'Images\mouse.bmp' , True);
Так как файлов не существует, то будет происходить ошибка. Разместите эти файлы [288 кб] в папке Images.
Загрузили. Осталось только вывести. Создайте событие onTimer у DXTimer1:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit;
DXDraw1.Surface.Fill(0);
PutImage(DxImageList1, 0, 0, DXDraw1.Display.Width, DXDraw1.Display.Height, 0);
PutImage(DxImageList1, Xm, Ym, 32, 32,1);
// Вывод FPS
with DXDraw1.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clWhite;
Font.Size := 12;
Textout(0, 0, 'FPS: '+inttostr(DXTimer1.FrameRate));
Release;
end;
DXDraw1.Flip;
end;
Переменные Xm и Ym нужно объявить глобальными. И создать событие onMouseMove у DXDraw1. Там пишем:
Xm:=X; Ym:=Y;
Осталось только настроить разрешение. У компонента DXDraw1 измените свойство Display как вам нужно.
Вот и все. Все остальное дело Вашей фантазии.
Комментарии