(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

DelphiX: Загрузка и вывод спрайтов

Источник: delphidevelop
Борисов Сергей

Итак, научимся загружать и выводить спрайты на экран. Спрайты, проще говоря, это обычные картинки. Например, анимация идущего человека состоит из нескольких кадров, вот каждый кадр это и есть спрайт.

Приступим. Для начала выложим на форму все необходимые компоненты: TDXTimerTDXImageList и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 как вам нужно.

Вот и все. Все остальное дело Вашей фантазии. Скачать исходник [295 кб]

 

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 13.07.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Delphi Professional Named User
Enterprise Connectors (1 Year term)
Allround Automation PL/SQL Developer - Annual Service Contract - Unlimited
VMware Workstation 14 Player for Linux and Windows, ESD
Oracle Database Personal Edition Named User Plus License
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Мир OLAP и Business Intelligence: новости, статьи, обзоры
Краткие описания программ и ссылки на них
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100