การบ้านครั้งที่ 2 (เวอร์ชั่น พัฒนาแล้ว)
เป็นการบ้านที่กลุ่มได้พัฒนาเพิ่มเติมจากการ Animate ครั้งแรก
เป็นการบ้านที่กลุ่มได้พัฒนาเพิ่มเติมจากการ 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;
}