Eungene's Imaginations...
[Clet] 게임명 : 스쿼시 --> 소스 (알카노이드) 본문
/*
** ===========================================================================
**
** Project:
** WIPI
**
** File:
** CletModule.c
**
** Description:
** Application Skeleton
**
** ===========================================================================
*/
/*
**----------------------------------------------------------------------------
** INCLUDE FILES FOR MODULE
**----------------------------------------------------------------------------
*/
//For Using WIPI API
#include "WIPIheader.h"
#define Ball_READY 20
#define Ball_PLAY 21
#define Ball_DEAD 22
#define Ball_PN 1
#define Ball_NN 2
#define Ball_NP 3
#define Ball_PP 4
/*
**----------------------------------------------------------------------------
** VARIABLES FOR MODULE
**----------------------------------------------------------------------------
*/
MC_GrpContext GC;
MC_GrpFrameBuffer screenBuffer;
MCTimer g_Time;
M_Int32 bar_x=105, bar_y=300;
M_Int32 bx, by;
M_Int32 BallMove=NULL;
M_Int32 BallState=Ball_READY;
M_Int32 ball_Speed=1;
M_Int32 Life=3;
M_Int32 Stage=1;
M_Int32 Score=0;
M_Char szLife[128];
M_Char szScore[128];
/*
**----------------------------------------------------------------------------
** FUCTION PROTOTYPES
**----------------------------------------------------------------------------
*/
void TimerCallback(MCTimer* pTm, void* parm);
void Ball();
void Hit_Ball();
void Racket();
void DisplayScore();
/*
**----------------------------------------------------------------------------
** LAYOUTS FOR MODULE
**----------------------------------------------------------------------------
*/
/* 이벤트를 처리하는 함수이다.*/
void handleCletEvent( int type, int param1, int param2 )
{
switch( type )
{
// Key press
case MV_KEY_PRESS_EVENT:
{
switch ( param1 ) {
case '4' :
bar_x=bar_x-7;
if(bar_x < 0)
bar_x=0;
break;
case '6':
bar_x=bar_x+7;
if(bar_x > 210)
bar_x=210;
break;
case '2':
ball_Speed--;
if(ball_Speed < 0)
ball_Speed=0;
break;
case'8':
ball_Speed++;
if(ball_Speed > 10)
ball_Speed=10;
break;
case '5':
if(Stage==1)
{
Stage=2;
MC_grpRepaint(screenBuffer, 0, 0, 240, 320);
}
else if(Stage==2)
{
if(BallState == Ball_READY)
{
BallState=Ball_PLAY;
BallMove=Ball_PN;
}
}
else if(Stage==3)
{
Stage=1;
Life=3;
MC_grpRepaint(screenBuffer, 0, 0, 240, 320);
}
break;
}
}
break;
}
MC_knlPrintk( "param1 = %d, param2 = %d\n", param1, param2 );
}
/* 프로그램이 시작될 때 불리는 함수이다. */
void startClet( int argc, char *argv[] )
{
screenBuffer = MC_grpGetScreenFrameBuffer(0);
MC_grpInitContext( &GC );
}
/* 프로그램이 잠시 멈추어 질때 이 함수를 호출해 준다.*/
void pauseClet( void )
{
}
/* 프로그램이 재개될 때 이 함수를 호출해 준다. */
void resumeClet( void )
{
}
/* 프로그램이 종료될 때 불린다. */
void destroyClet( void )
{
}
/*화면의 일부분을 다시 칠해야 하는 경우에 불리는 함수이다./ */
void paintClet( int x, int y, int w, int h )
{
if(Stage==1)
{
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(255,255,255) ); // set white color
MC_grpFillRect( screenBuffer, 0,0,
MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ),
MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer ),
&GC);
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(0,0,0) ); // set black color
MC_grpDrawString(screenBuffer, 85, 100, (const char*)"Start SQUASH", strlen("Start SQUASH"), &GC);
MC_grpDrawString(screenBuffer, 82, 120, (const char*)"Press 5 Button", strlen("Press 5 Button"), &GC);
MC_grpFlushLcd( 0, screenBuffer, 0, 0, MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ), MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer) );
}
else if(Stage==2)
{
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(255,255,255) ); // set white color
MC_grpFillRect( screenBuffer, 0,0,
MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ),
MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer ),
&GC);
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(0,0,0) ); // set black color
Racket(); // 락켓 디스플레이 호출
Ball(); // 공 디스플레이 호출
DisplayScore();
MC_knlDefTimer(&g_Time, TimerCallback);
MC_knlSetTimer(&g_Time, 30, NULL);
MC_grpFlushLcd( 0, screenBuffer, 0, 0, MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ), MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer) );
}
else if(Stage==3)
{
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(255,255,255) ); // set white color
MC_grpFillRect( screenBuffer, 0,0,
MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ),
MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer ),
&GC);
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(0,0,0) ); // set black color
MC_grpDrawString(screenBuffer, 90, 100, (const char*)"Game Over", strlen("Game Over"), &GC);
MC_grpFlushLcd( 0, screenBuffer, 0, 0, MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ), MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer) );
}
}
void TimerCallback(MCTimer* pTm, void* parm)
{
MC_grpRepaint(screenBuffer, 0, 0, MC_GRP_GET_FRAME_BUFFER_WIDTH(screenBuffer),
MC_GRP_GET_FRAME_BUFFER_HEIGHT(screenBuffer));
}
void Ball()
{
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(0,0,0));
if(BallState == Ball_READY)
MC_grpFillArc(screenBuffer, bar_x+10, bar_y-10, 10, 10, 360, 360, &GC);
else if(BallState == Ball_PLAY)
MC_grpFillArc(screenBuffer, bx, by, 10, 10, 360, 360, &GC);
MC_grpFlushLcd( 0, screenBuffer, 0, 0, MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ), MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer) );
Hit_Ball();
}
void Hit_Ball()
{
if(BallState==Ball_READY)
{
bx = bar_x+10;
by = bar_y-10;
}
else if(BallState == Ball_PLAY)
{
if(BallMove == Ball_PN)
{
bx = bx+ball_Speed;
by = by-ball_Speed;
if(bx > 230)
{
bx=230;
Score=Score+10;
BallMove=Ball_NN;
}
if(by < 12)
{
by=12;
Score=Score+10;
BallMove=Ball_PP;
}
}
else if(BallMove==Ball_NN)
{
bx= bx-ball_Speed;
by= by-ball_Speed;
if(bx < 0)
{
bx=0;
Score=Score+10;
BallMove=Ball_PN;
}
if(by < 12)
{
by = 12;
Score=Score+10;
BallMove=Ball_NP;
}
}
else if(BallMove==Ball_PP)
{
bx = bx+ball_Speed;
by = by+ball_Speed;
if(bx > 230)
{
bx=230;
Score=Score+10;
BallMove=Ball_NP;
}
if(by > 310)
{
Life--;
if(Life >= 0)
{
BallState = Ball_READY;
}
else if(Life < 0)
{
Stage=3;
}
MC_knlPrintk("라이프 : %d\n", Life);
MC_knlPrintk("Stage : %d\n", Stage);
}
if(bx > bar_x && bx < bar_x+30 && by > 290)
{
by=290;
Score=Score+20;
BallMove=Ball_PN;
}
}
else if(BallMove==Ball_NP)
{
bx = bx-ball_Speed;
by = by+ball_Speed;
if(bx < 0)
{
bx=0;
Score=Score+10;
BallMove=Ball_PP;
}
if(by > 310)
{
Life--;
if(Life >= 0)
{
BallState = Ball_READY;
}
else if(Life < 0)
{
Stage=3;
Score=0;
}
MC_knlPrintk("라이프 : %d\n", Life);
MC_knlPrintk("Stage : %d\n", Stage);
}
if(bx > bar_x && bx < bar_x+30 && by > 290)
{
by=290;
Score=Score+20;
BallMove=Ball_NN;
}
}
}
else if(BallState == Ball_DEAD)
{
BallState=Ball_READY;
}
}
void Racket()
{
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(0,0,0));
MC_grpFillRect(screenBuffer, bar_x, bar_y, 30, 5, &GC);
}
void DisplayScore()
{
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(0, 0, 0));
MC_grpFillRect( screenBuffer, 0,0,
MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ),
12, &GC);
MC_grpSetContext( &GC, MC_GRP_CONTEXT_FG_PIXEL_IDX, (void*)MC_grpGetPixelFromRGB(255, 255, 255));
MC_knlSprintk( szLife, "Life : %d", Life );
MC_grpDrawString( screenBuffer, 30, 10, (const char *)szLife, strlen(szLife), &GC );
MC_knlSprintk( szScore, "Score : %d", Score );
MC_grpDrawString( screenBuffer, 100, 10, (const char *)szScore, strlen(szScore), &GC );
//MC_grpFlushLcd( 0, screenBuffer, 0, 0, MC_GRP_GET_FRAME_BUFFER_WIDTH( screenBuffer ), MC_GRP_GET_FRAME_BUFFER_HEIGHT( screenBuffer) );
}