Итак, научимся загружать и выводить спрайты на экран. Спрайты, проще говоря, это обычные картинки. Например, анимация идущего человека состоит из нескольких кадров, вот каждый кадр это и есть спрайт. Приступим. Для начала выложим на форму все необходимые компоненты: 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 как вам нужно. Вот и все. Все остальное дело Вашей фантазии.
|