LECKÉK:              

Saját ablak
Directdraw1
Directdraw2
Directdraw_3
Sprite_1

Sprite 2
Sprite 3

Üdvözöllek!
Most az ütközésekről, és a mozgatásról lesz szó!
Mivel a progi folyamatosan rajzolja ki a sprite- okat, ezért csak annyi a dolgunk,hogy változtatjuk az x és y koordinátáikat. Most, hogy csak egyféle van egy ciklussal megoldjuk, de csak 24 -et rajzolunk.
A 0.  lesz a billentyűvel mozgatott bábunk. A csillagok addig mozognak a képernyőn,amíg el nem érik a szélét,és akkor irányt vált.Azaz a SP_X_IRANY előjelet vált ha x irányban elérte a szélt. Az y szintén.
Fontos a jelen progi a sprite-okat a tömbben elfoglalt helyük szerinti sorrendben rajzolja ki, tehát a 0. sprite- ot mindegyik letakarja, és a 24.-et egyik sem.ennek akkor van jelentősége,ha egymást átfedik, és fontos lenne, hogy melyik legyen felül ....
Tehát dekraláció: void sp_mozgat();
A megvalósítása:
/**/
void SPRITE::sp_mozgat()
{
for(int i=1;i<25;i++) //csak 24 db-ot mozgatunk az első a mi bábunk lesz a billentyűzet
{ // irányítja később
LPSP mut=&sp[i]; // átadjuk az aktuálisat nem kéne,de könnyebb gépelni...
mut->SP_X+=mut->SP_X_IRANY; //x helyzet + sebesség= uj helyzet
if((mut->SP_X < 0) |( mut->SP_X > 752))mut->SP_X_IRANY= - mut->SP_X_IRANY;
// ha elérte a bal oldalt vagy a jobb oldalt, akkor a sebesség
//átvált ellenkező előjelűvé
mut->SP_Y+=mut->SP_Y_IRANY; //ugyanaz csak y-ra
if((mut->SP_Y <= 0) | (mut->SP_Y > 552))mut->SP_Y_IRANY= - mut->SP_Y_IRANY;

}
}
Használata:
A frissít() függvényben : sp_mozgat();
Fordít- futtat....  
Elég látványos,de nem kellett sokat gépelgetni.Könnyen lehet többféle függvényt írni a többféle sprite mozgatásához,de az legyen a ti gondotok, ez alapján már könnyű!

Ütközések:

Mondhatni hála a struktúrának, csak összekell hasonlítani az x és y koordinátákat, Ha egy intervallumon belül van, akkor ütközött! Azonban mégsem ilyen egyszerű,mert az egyik lehet 18pixel, a másik meg 48( a mi példánkban) és lehet teljesen más méret is. Azért,hogy a program meg tudja állípítani az ütközést, inicializálni kell a sprite adatai között a forrópontokat. Most a forrópont a golyónál 9 pixel és a csillagnál 24 pixel  x és y irányban is. A sprite x és y helyzetéhet képest ennyivel van eltolva a forrópontjuk (közép)
A sp_init() ben:
mut->SP_FX=mut->SP_FY=24; //forrópontok a sprite-nak.
Az ütközéshez kell mostmár a golyó, tehát a 0. sprite-ot is inicializáljuk:
mut->SP_FX=mut->SP_FY=24; //forrópontok a sprite-nak
}
sp[0].SP_X=391; //0.sprite init
sp[0].SP_Y=291;
sp[0].SP_AN=0;
sp[0].SP_ANMAX=1;
sp[0].SP_KEP_X=sp[0].SP_KEP_Y=0;//balfelső sarok piros golyó
sp[0].SP_SZ=sp[0].SP_M=18;
sp[0].SP_KEPE=1; //az atom bmp ről vesszük

Az üközésvizsgálathoz pedig segítségünkre van az abs(...)függvény, mert igy a relatív távolságot kapjuk,és nem az abszolútat. A függvényt úgy írom meg,hogy két akármelyiket összehasonlítsa, vagy mindet! ezt úgy érhető el,hogy a függvényt már dekralációkor feltöltjük értékkel,és ha bemenő adat nélkül "üresen" hívjuk meg, akkor mindet végignézi,amúgy csak 2- őt vizsgál. Ha nem adunk meg szórást,akkor a két forrópontnak 5 pixelen belül kell lennie.
dekraláció:
bool sp_utk( int melyik,int melyikkel=-1,int szoras=5);
Megvalósítás:

   bool SPRITE::sp_utk(int melyik,int melyikkel,int szoras)
{

LPSP M=&sp[melyik];LPSP M1=&sp[melyikkel];//átvesszük a két sprite mutatóját
if(melyikkel ==-1)
{
for(int i=0;i<25;i++)
{
M1=&sp[i];
if(melyik==i)continue;//saját magával nem vizsgáljuk
if( (abs(M->SP_X+M->SP_FX-(M1->SP_X+M1->SP_FX))< szoras) & //ha az x helyzetek különbsége kisebb mint 5
(abs(M->SP_Y+M->SP_FY-(M1->SP_Y+M1->SP_FY))< szoras)) // és az y is kisebb,
return true;
}
return false;
}
if( (abs(M->SP_X+M->SP_FX-(M1->SP_X+M1->SP_FX))<szoras) & //ha az x helyzetek különbsége kisebb mint szoras
(abs(M->SP_Y+M->SP_FY-(M1->SP_Y+M1->SP_FY))<szoras)) // és az y is kisebb,
return true;
return false;
}

A használata a frissít függvényben:

void SPRITE::frissit()
{
rajz.rajzol(0,0,0,800,600,-1,0,0);//háttér
sp_rajz();
if(sp_utk(0))rajz.kiirbetu("ÜTKÖZÉS TÖRTÉNT",10,10);//golyót vizsgáljuk az összessel
rajz.flip();
anim();
sp_mozgat();
}
Látható nem kell második,és harmadik paraméter, ekkor mindet végignézi,és akkor jelez,ha a két
forrópont 5 pixelen belül van . Más értékkel 20 pixelhez így kell meghívni:

sp_utk(0,-1,20);

fordít futtat......Futás közben némi adatot ki tudunk íratni mindig, csak lényeg,hogy a flip() függvény

előtt tegyük pl. írassuk ki a 10. sprite x és y adatait:

void SPRITE::frissit()
{
rajz.rajzol(0,0,0,800,600,-1,0,0);//háttér
sp_rajz();
if(sp_utk(0))rajz.kiirbetu("ÜTKÖZÉS TÖRTÉNT",10,10);//golyót vizsgáljuk
rajz.kiirbetu("10.sprite x",10,30);rajz.kiirszam(sp[9].SP_X,100,30);
rajz.kiirbetu("10.sprite y",10,50);rajz.kiirszam(sp[9].SP_X,100,50);


rajz.flip();
anim();
sp_mozgat();
}

Az elmaradhatatlan    kód:

Vissza

A következő a billentyűzet, hogy mozgathassuk a golyónkat.