7/14/2011

Homework#2 Developing

การบ้านครั้งที่ 2 (เวอร์ชั่น พัฒนาแล้ว)

 เป็นการบ้านที่กลุ่มได้พัฒนาเพิ่มเติมจากการ Animate ครั้งแรก

ScreenShot


Start  Game



Play Game


You Win


You Lose


อธิบายการทำงานของโปรแกรม



Play in simulator


Play in PSP


Code Program

#include <cdx_app_wiz.h>
#include <time.h>

// ------------------------------------------------------------------
// CDX Objects
// ------------------------------------------------------------------
CDXScreen   *Screen     = 0;    // The screen object, every program must have one
CDXInput *Input = 0;
FPSmanager *Fps = 0;
CDXSprite * BG = 0;
CDXSprite * pac = 0;
CDXSnd* bgsound;
int x, y, i, j;
int score = 0;
int countcarrot = 0;
int Frame=0;
//int twinkle = 0;
//////////////
int MaxFrameCar=4;
int MinFrameCar=0;
int ZeroFrameCar =MinFrameCar;
int delayCar,delayBG=0;
int MaxFrameBG=12;
int MinFrameBG=1;
int ZeroFrameBG=MinFrameBG;
///////////////
double playtime=30, remaining_time=30;
time_t start, end;
typedef struct
{
int x, y;
CDXSprite* carrot;
bool Active;
//int animate;
}BALLINFO;
BALLINFO mycarrot[10][8]; 

void PlayFrame(int s,int e)
{
 Frame++;
if(Frame>e)
{
Frame=s;
}
pac->SetFrame(Frame);
}

// ------------------------------------------------------------------
// cdx_Init - handles initialization of the CDX objects
// ------------------------------------------------------------------
BOOL cdx_Init()
{
Screen = new CDXScreen();
Screen->Create( );
Screen->CreateWindowed( 480, 272, 32, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_INIT_TIMER );

Input = new CDXInput( );
Input->Create( );

Fps = new FPSmanager( );
SDL_initFramerate( Fps );
SDL_setFramerate( Fps, 30 );

// TODO: Initialize your own CDX objects here

BG = new CDXSprite( );
BG->Create( "bgR.pcx",480,270,12);
pac = new CDXSprite( );
pac->Create( "rabbit.png",50,50,1);
bgsound = new CDXSnd();
bgsound->Create();
bgsound->Play("road to myself.ogg");

time(&start);

for( i = 0; i < 10; i++ )
for( j = 0; j < 8; j++ )
{
mycarrot[i][j].carrot = new CDXSprite( );
mycarrot[i][j].carrot->Create( "ani_car.png",22,28,4 );
mycarrot[i][j].x = 40*(i+1);
mycarrot[i][j].y = 25*(j+1);
mycarrot[i][j].carrot->SetPos( mycarrot[i][j].x+15, mycarrot[i][j].y );
//mycarrot[i][j].animate = rand()%20;
mycarrot[i][j].Active = true;
}
return TRUE;
}

// ------------------------------------------------------------------
// cdx_DeInit - handles cleanup of CDX objects
// ------------------------------------------------------------------
void cdx_DeInit( void )
{
// TODO: Destroy your CDX objects here

for( i = 0; i < 10; i++ )
for( j = 0; j < 8; j++ )
SAFEDELETE( mycarrot[i][j].carrot );
SAFEDELETE(pac)
        SAFEDELETE( BG );
SAFEDELETE( Fps );
SAFEDELETE( Input );
SAFEDELETE( Screen );
}

// ------------------------------------------------------------------
// cdx_DoFrame - performs drawing of the current frame
// ------------------------------------------------------------------
void cdx_DoFrame()
{
Input->Update( );

Screen->GetBackEx()->Fill(0);

// TODO: Add code to draw your objects during each frame
//////////PlayBG////////////

delayBG++;
            if(ZeroFrameBG<=MaxFrameBG){
                  BG->SetPos(0,0);
                  BG->Draw(Screen->GetBack(),0,0,CDXBLT_TRANS);
                  BG->SetFrame(MinFrameBG);
                  if(delayBG==2){
                        MinFrameBG++;
                        delayBG=0;
                        if(MinFrameBG>=12){
                              MinFrameBG=1;
                        }
                  }
            }

//////////Ctrl&Play pac////////////
if (remaining_time > 0 && countcarrot < 80) {
if( Input->GetKeyState(SDLK_RIGHT)||
Input->GetKeyState(CDXKEY_JOYBUTN9)){
x += 5;
PlayFrame(0,3);}
if( Input->GetKeyState(SDLK_LEFT)||
Input->GetKeyState(CDXKEY_JOYBUTN7)){
x -= 5;
PlayFrame(4,7);}
if( Input->GetKeyState(SDLK_UP)||
Input->GetKeyState(CDXKEY_JOYBUTN8)){
y -= 5;
pac->SetFrame(9);}
if( Input->GetKeyState(SDLK_DOWN)||
Input->GetKeyState(CDXKEY_JOYBUTN6)){
y += 5;
pac->SetFrame(8);}
}
//BG->SetFrame(0);
//BG->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
if (x<0)x=0;
if (x>=440)x=440;
if (y<0)y=0;
if (y>=220)y=220;

pac->SetPos( x, y );
pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );

////
delayCar++;
////

for( i = 0; i < 10; i ++ ){
for( j = 0; j < 8; j++ )
{
   if( pac->SpriteHit(mycarrot[i][j].carrot) && mycarrot[i][j].Active ) {
      mycarrot[i][j].Active = false;
  score += 20;
  countcarrot++;
}
   if( mycarrot[i][j].Active )
//////
if(ZeroFrameCar<=MaxFrameCar){
                                    mycarrot[i][j].carrot->SetFrame(MinFrameCar);
//////
        mycarrot[i][j].carrot->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );

/////////////////PlayCarrot//////////////////

if(delayCar==6){
                                          MinFrameCar++;
                                          delayCar=0;
                                    }//if delay
                                    if(MinFrameCar>=4){
                                          MinFrameCar=ZeroFrameCar;
                                    }//if reset delay
}
        }
}
///////////Test//////////////
if( countcarrot == 80 ) {
BG->SetFrame(0);
BG->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
pac->SetFrame(0);
pac->SetPos( 210, 70 );
pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
TextXY( Screen->GetBack(), 200, 135, 255, 255, 255, 255,ETA_CENTER,"Congratulation,YOU  WIN" );
TextXY( Screen->GetBack(), 200, 155, 255, 255, 255, 255,ETA_CENTER,"Your Score = %d", score  );
TextXY( Screen->GetBack(), 200, 175, 255, 255, 255, 255,ETA_CENTER,"PRESS START TO PLAY AGAIN" );
}
if( Input->GetKeyState(SDLK_SPACE)||
Input->GetKeyState(CDXKEY_JOYBUTN11)){
bgsound->Stop("road to myself.ogg");
bgsound->Play("road to myself.ogg");

score=0;
countcarrot=0;
x=0;
y=0;
pac->SetPos(x,y);
time(&start);
remaining_time=30;
playtime=30;
for( i = 0; i < 10; i++ ){ 
for( j = 0; j < 8; j++ ){ 
mycarrot[i][j].x = 40*(i+1);
                                                mycarrot[i][j].y = 30*(j+1);
mycarrot[i][j].Active = true; 
}
}
}

//TextXY( Screen->GetBack(), 2, 10, 233, 227, 255, 255, ETA_LEFT ,"Score: %d", score );
if (remaining_time > 0 && countcarrot < 80) {
time(&end);
remaining_time = playtime - difftime(end, start);
} else {
remaining_time = 0;
}

TextXY( Screen->GetBack(), 2, 10, 233, 227, 255, 255, ETA_RIGHT ,"Time: %d", int (remaining_time) );

if ( remaining_time <= 0 && countcarrot != 80 ) {
BG->SetFrame(0);
BG->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
pac->SetFrame(10);
pac->SetPos( 210, 70 );
pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
TextXY( Screen->GetBack(), 200, 135, 255, 255, 255, 255,ETA_CENTER,"Sorry,You Lose" );
TextXY( Screen->GetBack(), 200, 155, 255, 255, 255, 255,ETA_CENTER,"TIME OUT" );
TextXY( Screen->GetBack(), 200, 175, 255, 255, 255, 255,ETA_CENTER,"PRESS START TO PLAY AGAIN" );
//for( i = 0; i < 10; i++ )
//for( j = 0; j < 8; j++ )
}
{
mycarrot[i][j].Active = false;
}
if( Input->GetKeyState(SDLK_SPACE)||
Input->GetKeyState(CDXKEY_JOYBUTN11)){
bgsound->Stop("road to myself.ogg");
bgsound->Play("road to myself.ogg");

score=0;
countcarrot=0;
x=0;
y=0;
pac->SetPos(x,y);
time(&start);
remaining_time=30;
playtime=30;
for( i = 0; i < 10; i++ ){ 
for( j = 0; j < 8; j++ ){ 
mycarrot[i][j].x = 40*(i+1);
                                                mycarrot[i][j].y = 30*(j+1);
mycarrot[i][j].Active = true; 
}
         }
}
/*if (remaining_time < playtime) {

for( i = 0; i < 10; i ++ ) {

for( j = 0; j < 8; j++ ) {

if (mycarrot[i][j].animate == 1 && mycarrot[i][j].Active == true) {

if (twinkle == 5) {

        mycarrot[i][j].carrot->SetFrame(Frame);

mycarrot[i][j].carrot->Draw( Screen->GetBack(), 0, 0,CDXBLT_TRANS );

Frame++;

twinkle = 0;

if (Frame == 7) { Frame = 0;}

} else { twinkle++; }}
}
}

}*/

Screen->Flip( 0, 0, 1 );
SDL_framerateDelay( Fps );
}

int main( int argc, char* args[] )
{
#ifdef _PSP

#ifndef NDEBUG
pspDebugScreenInit( ); 
#endif

SetupCallbacks( );
#endif

cdx_Init();

while(1)
{
#ifdef WIN32
if( Input->GetKeyState(SDLK_ESCAPE) )
break;
#endif
cdx_DoFrame();
}
cdx_DeInit();
return 0;
}