โจทย์ จงเขียนเกม PACMAN โดยมีรายละเอียดดังนี้
1. มีลูกบอลทั้งหมด 80 ลูก
2. มีการเก็บคะแนนและแสดงคะแนนด้านซ้ายบน
3. หากกินลูกบอลหมดจะขึ้นคำว่าYOU WIN
Run on PSP
อธิบาย Code
Capture screen shot
Code game
#include <cdx_app_wiz.h>
// ------------------------------------------------------------------
// CDX Objects
// ------------------------------------------------------------------
CDXScreen *Screen = 0; // The screen object, every program must have one
CDXInput *Input = 0;
FPSmanager *Fps = 0;
CDXSprite * pac = 0;
CDXSprite* mu = 0;
CDXSnd* g_snd;
int x, y, i, j;
int score;
typedef struct
{
int x, y;
CDXSprite* ball;
bool Active;
}BALLINFO;
BALLINFO myball[10][8]; // สร้าง อาเรย์ขนาด 8x10
// ------------------------------------------------------------------
// cdx_Init - handles initialization of the CDX objects
// ------------------------------------------------------------------
BOOL cdx_Init()
{
score=0;
x=0;
y=0;//ตั้งแค่า x y และ score =0 เพื่อให้วนกลับมาแล้วทุกอย่างเริ่มเต้นใหม่
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
g_snd = new CDXSnd();
g_snd->Create();
g_snd->Play("start.ogg");
mu = new CDXSprite( );
mu->Create( "bg.jpg", 1 );
pac = new CDXSprite( );
pac->Create( "pac.png", 1 );
for( i = 0; i < 10; i++ ) {
for( j = 0; j < 8; j++ ) {
myball[i][j].ball = new CDXSprite( );
myball[i][j].ball->Create( "ball.png", 1 );
myball[i][j].x = 40*(i+1);//ระยะห่าง ในแกน x
myball[i][j].y = 34*(j+1);//ระยะห่าง ในแกน y
myball[i][j].ball->SetPos( myball[i][j].x, myball[i][j].y-26 );//ตำแหน่งของ ball แต่ละลูก (x,y)
myball[i][j].Active = true;
}
}
return TRUE;
}
// ------------------------------------------------------------------
// cdx_DeInit - handles cleanup of CDX objects
// ------------------------------------------------------------------
void cdx_DeInit( void )
{
// TODO: Destroy your CDX objects here
SAFEDELETE( g_snd );
SAFEDELETE( mu );
for( i = 0; i < 10; i++ ){
for( j = 0; j < 8; j++ ){
SAFEDELETE( myball[i][j].ball );}}
SAFEDELETE(pac);
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
mu->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
if( Input->GetKeyState(SDLK_RIGHT)||
Input->GetKeyState(CDXKEY_JOYBUTN9))
x += 8;
if( Input->GetKeyState(SDLK_LEFT)||
Input->GetKeyState(CDXKEY_JOYBUTN7))
x -= 8;
if( Input->GetKeyState(SDLK_UP)||
Input->GetKeyState(CDXKEY_JOYBUTN8))
y -= 8;
if( Input->GetKeyState(SDLK_DOWN)||
Input->GetKeyState(CDXKEY_JOYBUTN6))
y += 8;
if(x<0)
x=0;
if(x>448)
x=448;
if(y<0)
y=0;
if(y>240)
y=240;
pac->SetPos( x, y );
pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
for( i = 0; i < 10; i ++ ) {
for( j = 0; j < 8; j++ ) {
if( pac->SpriteHit(myball[i][j].ball) && myball[i][j].Active ) {
myball[i][j].Active = false;
score += 1;
}
if( myball[i][j].Active ) {
myball[i][j].ball->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
}
}// for j
}//for i
TextXY( Screen->GetBack(),416, 10, 255, 28, 7, 134, "SCORE " "%d",score );
if(score==80){
TextXY( Screen->GetBack(), 240,124, 255,28, 7, 134,ETA_CENTER, "::YOU WIN::");
TextXY( Screen->GetBack(), 240,138, 255, 28, 7, 134,ETA_CENTER, "<Press Start To Play Again>");
}
if( Input->GetKeyState(SDLK_SPACE)||
Input->GetKeyState(CDXKEY_JOYBUTN11)){
score = 0;
for( i = 0; i < 10; i++ ) {
for( j = 0; j < 8; j++ ) {
myball[i][j].ball->SetPos( myball[i][j].x, myball[i][j].y-26 );//ตำแหน่งของ ball แต่ละลูก (x,y)
myball[i][j].Active = true;
}
}
}//วน loop
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;
}
// ------------------------------
// CDX Objects
// ------------------------------
CDXScreen *Screen = 0; // The screen object, every program must have one
CDXInput *Input = 0;
FPSmanager *Fps = 0;
CDXSprite * pac = 0;
CDXSprite* mu = 0;
CDXSnd* g_snd;
int x, y, i, j;
int score;
typedef struct
{
int x, y;
CDXSprite* ball;
bool Active;
}BALLINFO;
BALLINFO myball[10][8]; // สร้าง อาเรย์ขนาด 8x10
// ------------------------------
// cdx_Init - handles initialization of the CDX objects
// ------------------------------
BOOL cdx_Init()
{
score=0;
x=0;
y=0;//ตั้งแค่า x y และ score =0 เพื่อให้วนกลับมาแล้วทุกอย่างเร
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
g_snd = new CDXSnd();
g_snd->Create();
g_snd->Play("start.ogg");
mu = new CDXSprite( );
mu->Create( "bg.jpg", 1 );
pac = new CDXSprite( );
pac->Create( "pac.png", 1 );
for( i = 0; i < 10; i++ ) {
for( j = 0; j < 8; j++ ) {
myball[i][j].ball = new CDXSprite( );
myball[i][j].ball->Create( "ball.png", 1 );
myball[i][j].x = 40*(i+1);//ระยะห่าง ในแกน x
myball[i][j].y = 34*(j+1);//ระยะห่าง ในแกน y
myball[i][j].ball->SetPos( myball[i][j].x, myball[i][j].y-26 );//ตำแหน่งของ ball แต่ละลูก (x,y)
myball[i][j].Active = true;
}
}
return TRUE;
}
// ------------------------------
// cdx_DeInit - handles cleanup of CDX objects
// ------------------------------
void cdx_DeInit( void )
{
// TODO: Destroy your CDX objects here
SAFEDELETE( g_snd );
SAFEDELETE( mu );
for( i = 0; i < 10; i++ ){
for( j = 0; j < 8; j++ ){
SAFEDELETE( myball[i][j].ball );}}
SAFEDELETE(pac);
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
mu->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
if( Input->GetKeyState(SDLK_RIGHT)
Input->GetKeyState(CDXKEY_JOYB
x += 8;
if( Input->GetKeyState(SDLK_LEFT)|
Input->GetKeyState(CDXKEY_JOYB
x -= 8;
if( Input->GetKeyState(SDLK_UP)||
Input->GetKeyState(CDXKEY_JOYB
y -= 8;
if( Input->GetKeyState(SDLK_DOWN)|
Input->GetKeyState(CDXKEY_JOYB
y += 8;
if(x<0)
x=0;
if(x>448)
x=448;
if(y<0)
y=0;
if(y>240)
y=240;
pac->SetPos( x, y );
pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
for( i = 0; i < 10; i ++ ) {
for( j = 0; j < 8; j++ ) {
if( pac->SpriteHit(myball[i][j].ba
myball[i][j].Active = false;
score += 1;
}
if( myball[i][j].Active ) {
myball[i][j].ball->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
}
}// for j
}//for i
TextXY( Screen->GetBack(),416, 10, 255, 28, 7, 134, "SCORE " "%d",score );
if(score==80){
TextXY( Screen->GetBack(), 240,124, 255,28, 7, 134,ETA_CENTER, "::YOU WIN::");
TextXY( Screen->GetBack(), 240,138, 255, 28, 7, 134,ETA_CENTER, "<Press Start To Play Again>");
}
if( Input->GetKeyState(SDLK_SPACE)
Input->GetKeyState(CDXKEY_JOYB
score = 0;
for( i = 0; i < 10; i++ ) {
for( j = 0; j < 8; j++ ) {
myball[i][j].ball->SetPos( myball[i][j].x, myball[i][j].y-26 );//ตำแหน่งของ ball แต่ละลูก (x,y)
myball[i][j].Active = true;
}
}
}//วน loop
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;
}
สุดยอดมากครับ
ตอบลบค่ะ ^ ^
ตอบลบ