Използване на спрайтове

Използване на компонента TImage

За да формирате изображение, можете да използвате не само набор от такива примитиви като линии и форми, но и изображения. Малки изображения, които се показват върху друго изображение - фон, се наричат ​​спрайтове. Извеждането на спрайт може да се направи по няколко начина. Нека започнем с най-простия от тях - показване на спрайтове с помощта на компонента TImage. Основният проблем при показване на спрайтове е, че растерът, съдържащ спрайта, има правоъгълна форма, а самият спрайт може да има сложна форма. При показване на спрайт върху фоново изображение е необходимо пикселите на растера, съдържащ спрайта, принадлежащ на спрайта, да заменят фоновите пиксели, а останалите пиксели да не променят фона (прозрачни пиксели). В компонента TImage е удобно да използвате свойството Transparent за работа със спрайтове. Ако стойността на свойството е True, тогава всички пиксели, чийто цвят съвпада с цвета на пиксела, разположен в долния ляв ъгъл на растера, ще бъдат прозрачни, т.е. изображенията няма да бъдат копирани по време на извеждане (Фигури 3 и 4).

Създайте нов проект. Поставете компонент TImage (фон) във формуляра frmAirPlane. Заредете свойството Picture с изображение. Задайте стойността на свойството AutoSize=True за компонента Background.

Поставете друг компонент TImage (Sprite) върху формата. Заредете изображение в него и задайте стойността на свойството Transparent на True и стойността (Фигура 4).

Поставете таймер във формуляра, задайте Interval=50 и създайте манипулатор на събития

var frmAirPlane: TfrmAirPlane;

спрайтове

Лабораторни упражнения по информатика за специалност "Моделиране и изследване на операции в системи"

изпълнение var dx:Integer=10;

процедура TfrmAirPlane.TimerTimer(Подател: TObject); започвам

//преместете спрайта надясно

//ако сме достигнали дясната граница, тогава отиваме в началото ако тогава ако Sprite.Left

Фигура 3 - Изход на спрайт, всички пиксели на растера се показват (свойство Transparent=False).

използване

Лабораторни упражнения по информатика за специалност "Моделиране и изследване на операции в системи"

Фигура 4 - Изход на спрайт, показват се само пиксели от растера, принадлежащи на спрайта (свойство

Стартирайте програмата. Недостатъците на този начин за създаване на анимация се виждат веднага, а именно забележимо трептене по време на възпроизвеждане на анимация. Не е възможно да се премахне такова трептене, така че нека да преминем към разглеждане на по-напреднали начини за създаване на анимация.

Използване на спрайт маска

Следващият начин за показване на спрайтове се основава на използването на маска за определяне на тези спрайт точки, които ще бъдат показани, когато спрайтът бъде отпечатан. Маската е изображение на спрайт. Черните точки са в тези места на спрайта, които ще бъдат показани, а белите точки са в "прозрачните" места на спрайта. Алгоритъмът за извеждане на спрайт е както следва:

Показва се маската на спрайта. Изходът се извършва в режим cmSrcAnd canvas (свойство CopyMode). В този режим при копиране се извеждат само черни пиксели. Така във фоновото изображение се изрязва област под формата на спрайт (Фигура 5).

Фигура 5 - Изходна маска на спрайт

Освен това, при същите координати, изображението на спрайта се показва в режим cmSrcPaint. В този режим пикселите на спрайтовете се показват само когато цветът на фоновите пиксели е черен (Фигура 6). Така всеки спрайт се състои от две изображения: маска на спрайт и изображение на спрайт.

спрайтове

Лабораторни упражнения по информатика за специалност "Моделиране и изследване на операции в системи"

Фигура 6 - Заключениеспрайт

Помислете за примерна програма, която използва тази техника за извеждане на спрайт.

Създайте нов проект. Поставете таймер във формуляра frmAirPlane. Задайте интервала на таймера на 50 ms. Програмата анимира движението на изображението на самолета. Движението се извършва по произволна траектория. Алгоритъмът на програмата е много прост и не се нуждае от обяснение. Пълният текст на програмата е даден по-долу.

използва Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Jpeg, ImgList;

TfrmAirPlane = class(TForm) Таймер: TTimer;

процедура FormCreate(Подател: TObject); процедура FormPaint(Подател: TObject); процедура TimerTimer(Подател: TObject); процедура FormDestroy(Подател: TObject);

< Публични декларации >Маска, //маска на спрайт Спрайт, //изображение на спрайт

x, y: цяло число; //текущи координати на спрайт

процедура DrawScene(ACanvas:TCanvas); //рисуване на спрайт

процедура DrawSprite(x, y:Integer; ACanvas:TCanvas); // изчисляване на координати на спрайт

процедура CalcNewCoord(var newX, newY:Integer); //зареждане на изображения

процедура LoadImages; край;

var frmAirPlane: TfrmAirPlane;

процедура TfrmAirPlane.FormCreate(Подател: TObject); започвам

спрайтове

Лабораторни упражнения по информатика за специалност "Моделиране и изследване на операции в системи"

DoubleBuffered:=Вярно; //зареждане на изображения

LoadImages; //изчисляване на координати

CalcNewCoord(x, y); край;

процедура TfrmAirPlane.FormPaint(Подател: TObject); започвам

процедура TfrmAirPlane.DrawScene; започвам

с ACanvas започнете

CopyMode:=cmSrcCopy; //режим на копиране CopyRect(ClipRect, BackGround.Canvas,

BackGround.Canvas.ClipRect); // изходспрайт

DrawSprite(x, y, ACanvas); край;

процедура TfrmAirPlane.DrawSprite(x, y: Integer; ACanvas:TCanvas);

с ACanvas започнете

// показване на спрайт маската CopyMode:=cmSrcAnd; // режим на копиране за маската

CopyMode:=cmSrcPaint; //режим на копиране за спрайт

Draw(x, y, Sprite); край;

процедура TfrmAirPlane.LoadImages; започвам

BackGround:=TBitmap.Create; BackGround.LoadFromFile( 'background.bmp' ); //зареждане на спрайт маска

Маска:=TBitmap.Create; Mask.LoadFromFile( 'Mask.bmp' ); //зареди спрайт

Sprite:=TBitmap.Create; Sprite.LoadFromFile( 'Sprite.bmp' );

процедура TfrmAirPlane.TimerTimer(Подател: TObject); започвам

//изчисляване на следващата позиция на спрайта

CalcNewCoord(x, y); // преначертайте изображението