#ifdef_cpulsplus
#include
#else
#include
#endif
#ifdef_APPLE_
#include
#else
#include
#endif
#include
const int lebar_layar=640;
const int tinggi_layar=480;
/*membuat fungsi untuk memeriksa terjadinya tabrakan(collision)
antara kotak pertama(A)dengan kotak kedua(B)
*/
bool f_PeriksaTabrakan(SDL_RectA,SDL_RectB)
{
int kiriA,kiriB;
int kananA,kananB;
int bawahA,bawahB;
kiriA=A.x;
kananA=A.x+A.w;
atasA=A.Y;
bawahA=A.y+A.h;
kiriB=B.x;
kananB=B.x+B.w;
atasB=B.y;
bawahB=B.y+B.h;
if(bawahA<=atasB)return false;
if(atasA>=bawahB)return false;
if(kananA<=kiriB)return false;
if(kiriA>=kananB)return false;
return true;
}
//clskotak=class kotak
class clskotak
{
SDL_Rect kotak;
int red,green,blue;
int kecX,kecY;
public:
clskotak(int,int,int,int,int);
SDL_rect getkotak();
void bergerak(int,SDL_RectO_[]);
void tampil(SDL_surface*_O);
};
//konstruktor kelas kotak
clsKotak::clsKotak(int_red,int_green,int_blue,int_X,int_Y)
{
//variabel red,gereen,blue(rgb)untuk
//membedakan warna dengan kotak yang lain
red=_red;
//diperiksa nilainya jika ada kesalahan
if(red<0)red=0;
else if(red>255)red=255;
green=_green;
if(green<0)green=0
else if(green>255)green=255;
blue=_blue;
if(blue<0)blue=0;
else if(blue>255)blue=255;
kecX=5+_X%3;
kecY5+_Y%3;
kotak.x=_X;
kotak.y=_Y;
kotak.w=20;
kotak.h=20;
}
SDL_Rect clskotak::getkotak()
{
return kotak;
}
void clskotak::bergerak(int banyakkotak,SDL_Rect kotaklainnya[])
{
//menggerakan kotak dengan sumbu x
kotak.x+=kecX;
//memeriksa apakah sih kotak masih ada dilyar
//atau sudah keluar dari layar
if(kotak.x=0;
kotak.x=0;
kecX=-kecx;
}
else if9kotak.x+kotak.w>lebar_layar){
kotak.x=lebar_layar-kotak.w;
kecX=-kecX;
}
//pemeriksaan terhadap kotak lainnya
for(int c=0;
{
if(f_PeriksaTabrakan(kotak,kotaklainnya[c]))
{
kecX=-ecX;
kotak.x+=kecX;
break;
}
}
//kali ini bergerak searah dengan sumbu Y
kotak,y+=kecY;
if(kotak.y<0){
kotak.y=0;
kecX=-kecY;
}
else if(kotak.y+kotak.h>tinggi_layar){
kotak.y=tinggi_layar-kotak.h;
kecY=-kecY;
}
//pemeriksaan trhadap kotak lainnya
for(intc-0;
{
if(f_PriksaTabrakan(kotak,kotaklainnya[c]))
{
kecY=-kecY;
kotak.y+=kecY;
break;
}
}
}
void clskotak::tampil(SDL_Surface*_scean)
{
red+=rand()%5;
if(read>220)red=0;
green+=rend()%7;
if(green>220)green=0;
blue+=rand()%9;
if(blue>220)blue=0;
//warna diisi sesuai dengan variabel red,green,blue
SDL_FillRect_screen,&kotakSDL_MapRGB(_screen->format,red,green,blue));
}
int main(intargc,char**argv)
{
srand((usingned)time(NULL));
//initialize SDL vidio
if(SDL_init(SDL_INIT_VIDIO)<0)
{
printf("Unable to init SDL:%s\n",SDL_GetError());
return 1;
}
//make sure SDL cleans up before exit
atexit(SDL_Quit)
//create a neu window
SDL_surface*screen=SDL_setVidioMode(lebar_layar,tinggi_layar,16,
SDL_HWSURFACE|SDL_DOUBLEBUF);
if(iscreen)
{
printf("Unable to set 640x480 vidio:%\n",SDL_GetError());
retrun 1;
}
//bykkotak=banyak kotak
const int bykkotak=50;
clskotak*kotakku[bykkotak];
for(intc=0;c
intX=c*30%(lebar_layar-40);
kotakku[c]=new clskotak(c*200%255,150,c*100%255,X,c*2);
}
//membuat variabel fps(fremer per second)
//dan jumlah frame setiap detiknya adalah 24
int fps=0;
const int freme_per_second=24;
//program main loop
bool done=false;
while(idone)
{
//memperoleh sekian milidetik dari SDL_GetTicks()
fps=SDL_pollevent(&event))
{
//check for massages
switch(event.type)
{
//exit if the wondow is closed
case SDL_QUIT:
done=true;
break;
//check for keypresses
case SDL_KEYDOWN
{
//exit if ESCAPE is pressed
if(event.key.keysym.sym==SDLK_ESCAPE
done=true;
break;
}
}// end switch
}//end of massage processing
0 komentar:
Posting Komentar