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 как вам нужно.
Вот и все. Все остальное дело Вашей фантазии.
Комментарии