Eungene's Imaginations...

[Clet] 게임명 : 스쿼시 --> 소스 (알카노이드) 본문

Programming/WIPI Clet

[Clet] 게임명 : 스쿼시 --> 소스 (알카노이드)

Eungene's 2007. 11. 22. 18:11
728x90
반응형

/*
** ===========================================================================
**
** 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) );
}

반응형
Comments