Pages

Subscribe:

Rabu, 18 Mei 2011

C++ Membuat Kotak

*/
#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

Tuliskan Komentarmu...!!!

Kesegaran Jasmani