4.10 Спрайтовая графика

Спрайты - движущиеся картинки небльшого размера, являются одной из главных частей любого игрового или обучающего пакета программ. Рассмотрим несколько примеров использование спрайтов MChSprite из линейки Samples

Компонента MchSpriteBgr.

Данная компонента представляет собой фон на котором происходит движение спрайтов. Одним из основных свойств MchSpriteBgr является свойство Picture – загрузка bmp или gif изображения.

Компонента MchSprite.

Компонента представляет собой собственно спрайт- небольшое bmp -изображение. Для загрузки изображения используется свойство SprSpriteBitmap.

Основные свойства MchSprite:

SprHideAfter – виден или нет спрайт после окончания движения (MChSprite1->SprHideAfter=True - не виден);

SprSetScaleX – масштаб спрайта по оси Х;

SprSetScaleY – масштаб спрайта по оси Y;

Пример – изменение масштаба спрайта при приближении:

Form1->MChSprite2->SprSetScaleX(1+1.0*sin(alpha)); (где alpha - переменная типа double);

SprPosFunc – функция пользователя – закон движения спрайта (возвращает координаты движения спрайта) – пример:

//функция пользователя для движения спрайта N 2

TPoint __fastcall Sprite2PosFunc(TDateTime AtTime)

//AtTime – время от начала движения спрайта в секундах

{

doublex,y,alpha;

alpha=2*3.14*(AtTime-Form1->MChSprite2->SprTimeStarted)* 24.0*60.0100.0/(180.0*3.14);

 x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

 (Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

 y= Form1->MChSpriteBgr1->ClientHeight /2.0 +

 (Form1->MChSpriteBgr1->ClientWidth /3.0)*sin(alpha);

 Form1->MChSprite2->SprSetScale(1+1.0*sin(alpha));

 return(Point(int(x),int(y)));

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

 MChSprite2->SprPosFunc=Sprite2PosFunc;//вызов функции движения

 MChSprite2->SprCruise(-1);

 }

//---------------------------------------------------------------------------

SprSpriteBitmap – изображение спрайта;

SprTrColor – цвет спрайта;

SprDragable – если истина, то спрайт можно премещать мышью;

SprColliding – если истина, то вызывается функция пользовыателя для обработки столкновения спрайтов;

SprRefX, SprRefY –соответственно контрольная точка на растре спрайта по оси X и Y;

SprRadiusX ,SprRadiusY радиус столкновения спрайта по оси X и оси Y соответственно;

Основные методы MchSprite.

Метод SprRun (Point (X1, Y1), Point (X2,Y2), t) –делает спрайт видимым при движении из одной позиции (X1, Y1) в другую (X2, Y2) в течении того или иного времени (t).

Пример: (MChSprite1->SprRun(

 Point (MChSpriteBgr1->ClientWidth, 0),

 Point (0, MChSpriteBgr1->ClientHeight), 3);

Метод SprShowOn (); делает спрайт видимым в текущей позиции.

Метод SprCruise (-1); делает спрайт видимым и его движение задается функцией пользователя SprPosFunc;

Метод SprMoveTo (Point (X, Y); делает спрайт видимым в позиции X, Y.

 Пример:

MChSprite6->SprMoveTo (Point (int ((Form1->MChSpriteBgr1->ClientWidth)/2), int((Form1->MChSpriteBgr1->ClientHeight)/2)));

Метод SprShowAt(Point(X,Y); - делает спрайт видимым в точке X,Y.

Метод SprHide – делает спрайт невидимым;

Метод SprStop – останавливает спрайт;

Метод SprGoTo (Point(X,Y),t); - делает спрайт видимым и перемещает в течении t секунд из текущей позиции в позицию X, Y.

Метод SprGo (Point (X1, Y1), Point (X2, Y2), t); - делает спрайт видимым при движении из одной позиции (X1, Y1) в другую (X2, Y2) в течении того или иного времени (t).

Рассмотрим пример использования спрайтов. На форме расположены 6 спрайтов и 4 кнопки.

В зависимости от нажатия той или иной кнопки происходят события – летит ракета, сверхновая звезда сталкивается с Солнцем и происходит взрыв и т.д.

Листинг программы:

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#include <math.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma link "MChSpBg"

#pragma link "MChSprt"

#pragma resource "*.dfm"

TForm1 *Form1;

bool CollideFlip,Exploding;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//----------------------------------------------------------------------

void __fastcall NoCollide(TDateTime AtTime)

{

 if (CollideFlip) MessageBeep(MB_OK);

 CollideFlip=False;

}

//----------------------------------------------------------------------

void __fastcall OnCollide(TMChSprite *SprCollided ,TDateTime AtTime)

{

if (SprCollided==Form1->MChSprite2)

{

 // MessageBeep(MB_ICONASTERISK);

 if (! CollideFlip)

 {

 MessageBeep(MB_ICONASTERISK);

 CollideFlip=True;

 }

 if (Form1->MChSprite4->SprNextPos.x<int((Form1->MChSpriteBgr1->ClientWidth)/2))

 {

 if (Form1->MChSprite4->SprIndex<Form1->MChSprite3->SprIndex)

 Form1->MChSpriteBgr1->BgrSprIndexExchangeZ(Form1->MChSprite4->SprIndex,

 Form1->MChSprite3->SprIndex);

 }

 else

 {

 if (Form1->MChSprite4->SprIndex>Form1->MChSprite3->SprIndex)

 Form1->MChSpriteBgr1->BgrSprIndexExchangeZ(Form1->MChSprite4->SprIndex,

 Form1->MChSprite3->SprIndex);

 }

 }

}

//--------------------------------------------------------------------

void __fastcall OnExplosion(TMChSprite *SprCollided ,TDateTime AtTime)

{

 if (Exploding)

 {

 // SprCollided->SprStop;

 // SprCollided->SprHide;

 }

 if ((! Exploding) && (SprCollided==Form1->MChSprite1))

 {

 Exploding=True;

 Form1->MChSprite2->SprColliding=true;

 Form1->MChSprite5->SprColliding=true;

 Form1->MChSprite6->SprCruise(20);

 }

 }

//---------------------------------------------------------------------

TPoint __fastcall Sprite6PosFunc(TDateTime AtTime)

{

 Form1->MChSprite6->SprSetScale(1.25*(AtTime-Form1->MChSprite6->SprTimeStarted)

 *24.0*60.0*60.0*5.0);

// if ((AtTime-Form1->MChSprite6->SprTimeStarted)*24.0*60.0*60.0>17.0)

 // Form1->MChSprite6->SprHide;

 return(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

 int((Form1->MChSpriteBgr1->ClientHeight)/2)));

 }

//-----------------------------------------------------------------------

 TPoint __fastcall Sprite4PosFunc(TDateTime AtTime)

 {

 double x,y,alpha;

 alpha =2*3.14*(AtTime-Form1->MChSprite3->SprTimeStarted)*24.0*60.0+(90.0+0.0)/180.0*3.14;

 x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

 (Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

 y= Form1->MChSpriteBgr1->ClientHeight /2.0 +

 - (Form1->MChSpriteBgr1->ClientWidth /3.0)*sin(alpha);

 Form1->MChSprite4->SprSetScale(1-0.9*sin(alpha));

 return(Point(int(x),int(y)));

 }

//-----------------------------------------------------------------------

 TPoint __fastcall Sprite3PosFunc(TDateTime AtTime)

{

double x,y,alpha;

 alpha=-2*3.14*(AtTime-Form1->MChSprite3->SprTimeStarted)*24.0*60.0+(90.0-180.0)/180*3.14;

 x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

 (Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

 y= Form1->MChSpriteBgr1->ClientHeight *0.5 +

 -(Form1->MChSpriteBgr1->ClientWidth *0.55)*sin(alpha);

 if (x>=(Form1->MChSpriteBgr1->ClientWidth)/2)

 Form1->MChSprite3->SprSetScaleX( (1-1.0*sin(alpha)));

 else Form1->MChSprite3->SprSetScaleX(-(1-1.0*sin(alpha)));

 if (y<(Form1->MChSpriteBgr1->ClientHeight)/2)

 Form1->MChSprite3->SprSetScaleY( (1-1.0*sin(alpha)));

 else Form1->MChSprite2->SprSetScaleY(-(1-1.0*sin(alpha)));

 return(Point(int(x),int(y)));

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

 Exploding=false;

 MChSprite2->SprShowAt(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

 int((Form1->MChSpriteBgr1->ClientHeight)/2)));

 MChSprite3->SprPosFunc=Sprite3PosFunc;

 MChSprite4->SprPosFunc=Sprite4PosFunc;

 MChSprite6->SprPosFunc=Sprite6PosFunc;

 MChSprite6->SprHideAfter=true;

 MChSprite6->SprOnCollide=OnExplosion;

 MChSprite4->SprOnCollide=OnCollide;

 MChSprite4->SprNoCollide=NoCollide;

 MChSprite3->SprCruise(-1);

 MChSprite4->SprCruise(-1);

 MChSprite6->SprMoveTo(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

 int((Form1->MChSpriteBgr1->ClientHeight)/2)));

 }

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

 Exploding=false;

 MChSprite6->SprSetScale(0.2);

 MChSprite6->SprMoveTo(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

 int((Form1->MChSpriteBgr1->ClientHeight)/2)));

 Form1->MChSprite1->SprColliding=true;

 Form1->MChSprite6->SprColliding=true;

 Form1->MChSprite1->SprGo( Point(Form1->MChSpriteBgr1->ClientWidth,0),

 Point(int(Form1->MChSpriteBgr1->ClientWidth/2),

 int(Form1->MChSpriteBgr1->ClientHeight/2)), 5 );

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

 MChSprite5->SprColliding=False;

 MChSprite5->SprHideAfter=True;

 MChSprite5->SprGo(Point(Form1->MChSpriteBgr1->ClientWidth,

 Form1->MChSpriteBgr1->ClientHeight),

 Point(0,0), 20);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

 Exploding=false;

 MChSprite1->SprColliding=false;

 MChSprite2->SprColliding=false;

 MChSprite5->SprColliding=false;

 MChSprite6->SprColliding=false;

 MChSprite6->SprHide();

 MChSprite5->SprHideAfter=true;

 MChSprite2->SprShowAt(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

 int((Form1->MChSpriteBgr1->ClientHeight)/2)));

 MChSprite3->SprCruise(-1);

 MChSprite4->SprCruise(-1);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

Используя рассмотренный пример, можно изучить практически все свойства спрайтов.


Информация о работе «Основы C»
Раздел: Информатика, программирование
Количество знаков с пробелами: 200759
Количество таблиц: 5
Количество изображений: 11

Похожие работы

Скачать
20474
0
0

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

Скачать
5443
0
0

... хотя бы стены, чтобы нас не унижали в собственном доме, до конца не растащили наше имущество, нам нужна, обладающая высоким моральным и воинским духом достойно обеспеченная армия. Однако, значение российской армии и в том, что она представляет собой, пожалуй, единственный институт в современной виртуальной России, лишенный симулякров, поскольку ней, по крайней мере, погибают реально - в бою. ...

Скачать
8522
1
2

... важные функции управления предприятием, такие как: определение задач; планирование ресурсов; оценка деятельности и мотивация персонала на основе оценки; контроль исполнения. В целом, бюджетирование решает тактические вопросы и, по существу, для стратегического управления не предназначено. Связь бюджетирования со стратегией Практика стратегического планирования западных компаний ...

Скачать
11185
0
0

... . Для этого достаточно измерить его на карте и знать масштаб карты. Компас. Научиться пользоваться компасом нетрудно. Но компас, как правило, наилучшим помощником в ориентировании становится вместе с картой. В спортивном ориентировании пользуются специальными жидкостными компасами. Они позволяют быстро и просто взять с карты нужное направление и двигаться по местности по выбранному азимуту. ...

0 комментариев


Наверх