Dobro, možda je ovo teže razumljivo onima koji nikad nisu radili na igricama ili multimedija
aplikacijama.Ideja je da programeri koji su uključeni u ovo shvate princip i posle toga puste
mašti na volju.
Možemo da počnemo od nekog statičnog objekta npr. kako da napravimo dugme koje se stavlja na
ekran sa izborom igre.SDL ima svoj game loop koji se sastoji od provere ulaznih uređaja,logike
i rendera na ekran:
Code:
...
cGameEngine igra;
while ( igra.Radi() )
{
igra.HandleEvents();
igra.Update();
igra.Draw();
}
...
Svaka tabla i objekat imaju handleevent(),update() (ili logic()) i draw().U suštini da bi
nešto postojalo na ekranu mora stalno da se iscrtava nekim framerate-om.
Kada stavljamo neki objekat na tablu,njegove metode stavljamo u odgovarajuće metode table:
handleevent() objekta u handleevent() table itd.Vidi sliku:
pravimo dugme u Init() metodu table:
Da bi objekat reagovao na akcije miša ključna stvar je struktura SDL_Rect(angle).To je kao
pravougaonik u odnosu na koji se proverava kolizija,prelazak miša preko objekta itd.On je,uz
bitmapu,pridružen svakom objektu na tabli.Ovu strukturu ima svaki objekat kao private član.
Opciono se mogu praviti get i set metode za nju i smesiti u public.Evo kako on radi:
Code:
...
void cDugmeIzbor::HandleEvents(SDL_Event event, cGameEngine* game)
{
int x = 0, y = 0;
if( event.type == SDL_MOUSEMOTION )
{
x = event.motion.x;
y = event.motion.y;
//proveri dal je strelica miša unutar bounding box-a (m_Box)
if( ( x > m_Box.x ) && ( x < m_Box.x + m_Box.w ) && ( y > m_Box.y ) && ( y < m_Box.y + m_Box.h ) )
{
m_Clip = &m_Clipovi_dugme_izbor[ CLIP_MISHIZNAD ];//postavi odgovarajući clip
game->g_PrikaziNazivIgre = true;//prikaži naziv igre
}
...
Sledeće uzimamo ikonicu tj. bitmapu i napravimo tri kopije recimo u GIMP-u.Ovo mogu i ja da
radim jer je dosadno al nije mnogo komplikovano.Treba dodati ivice da izgleda izdignuto kad je
miš preko njega i spušteno kad se klikne.Vidi sliku:
Koordinate se računaju relativno u odnostu na gornju levu ivicu ekrana.w i h su hvala bogu ši-
rina i visina.Sad...da bi dobili klipove za odgovarajuće evente moramo da razložimo ovu sliku
na tri dela,tj. da je klipujemo kako se to kaže.Ovo važi za sve objekte ako im se menja izgled
ili su animirani.Klipove smeštamo u niz (SDL_Rect m_Clipovi_dugme_izbor[ 3 ]) koji je private
član klase cDugmeIzbor (jedan clip je SDL_Rect struktura koja sadrži x,y,w,h):
Code:
const int CLIP_MISHIZVAN = 0;
const int CLIP_MISHIZNAD = 1;
const int CLIP_MISHDOLE = 2;
...
m_Clipovi_dugme_izbor[ CLIP_MISHIZVAN ].x = 0;
m_Clipovi_dugme_izbor[ CLIP_MISHIZVAN ].y = 0;
m_Clipovi_dugme_izbor[ CLIP_MISHIZVAN ].w = 47;
m_Clipovi_dugme_izbor[ CLIP_MISHIZVAN ].h = 37;
m_Clipovi_dugme_izbor[ CLIP_MISHIZNAD ].x = 47;
m_Clipovi_dugme_izbor[ CLIP_MISHIZNAD ].y = 0;
m_Clipovi_dugme_izbor[ CLIP_MISHIZNAD ].w = 47;
m_Clipovi_dugme_izbor[ CLIP_MISHIZNAD ].h = 37;
m_Clipovi_dugme_izbor[ CLIP_MISHDOLE ].x = 94;
m_Clipovi_dugme_izbor[ CLIP_MISHDOLE ].y = 0;
m_Clipovi_dugme_izbor[ CLIP_MISHDOLE ].w = 47;
m_Clipovi_dugme_izbor[ CLIP_MISHDOLE ].h = 37;
//postavi podrazumevani klip, miš nije iznad dugmeta
m_Clip = &m_Clipovi_dugme_izbor[ CLIP_MISHIZVAN ];
...
pošto smo to rešili,stavićemo akciju dugmeta kada se klikne i otpusti levo dugme miša:
Code:
void cDugmeIzbor::HandleEvents(SDL_Event event, cGameEngine* game)
{
int x = 0, y = 0;
if( event.type == SDL_MOUSEBUTTONUP )
{
if( event.button.button == SDL_BUTTON_LEFT )
{
x = event.button.x;
y = event.button.y;
//proveravamo dal je strelica miša unutar bounding box-a (m_Box)
if( ( x > m_Box.x ) && ( x < m_Box.x + m_Box.w ) && ( y > m_Box.y ) && ( y < m_Box.y + m_Box.h ) )
{
game->ChangeState( cNovaTabla::Instance() );//uđi u novu tablu
m_Pritisnuto = false;
m_Clip = &m_Clipovi_dugme_izbor[ CLIP_MISHIZVAN ];
Mix_PlayChannel( -1, game->klik, 0 );//pustimo zvuk
}
}
}
...
Tako smo ugradili naše dugme u prozor za izbor nove table tj. igrice.Za ostalo možete
pogledati u code.
Šta ako imamo više objekata,ako im se menja broj ili moramo da menjamo njihove osobine?
Možemo da ih stavimo u neki STL kontejner,npr. std::list ili std::vector,odredimo da je
privatni član klase table (list<cObjekat*> m_ListaObjekata),ovako:
Code:
m_ListaObjekata.push_back( new cKorpa(207, 318, 215, 102, NULL) );
m_ListaObjekata.push_back( new cCvet( 0, 0, NULL, NULL ) );
...
m_ListaObjekata.push_back( new cOvo( 0, 0, NULL, NULL ) );
m_ListaObjekata.push_back( new cOno( 0, 0, NULL, NULL ) );
...
zato su klase objekata nasleđene iz apstraktne klase cObjekat kako bi mogli da ih stavljamo u
isti kontejner.Sada treba da ih rukujemo,obradimo logiku i crtamo iteracijom kroz listu:
Toliko za sad,ako sam negde zabrljao ispravite me.Jbg počeću i tutorijale da pišem...
Ag + Na -> Xe