- 음악과 나 -/『 짬 통 』

해와달 1차 코드와 교수님이 살짝 고쳐준거.

noon2dy 2006. 5. 23. 19:09

 

 

//
// Dunkin' Game
//
// team Project
//  : 햇님 달님
//

#include <windows.h>

#define FRAMECOUNT  19  // 총 넘어가는 frame의 개수
#define XPOSITION  10  // 주인공 이미지 기본 좌표
#define YPOSITION  400  // 주인공 이미지 기본 좌표
#define GROUND   580  // 땅의 Y좌표
#define LEFTSIDE  0  // 화면 왼쪽끝
#define RIGHTSIDE  800  // 화면 오른쪽 끝. 799;;
#define UPSIDE   0  // 화면 위쪽
#define BOTTOMSIDE  600  // 화면 아래쪽
#define TOTALDISTANCE 800 * 8 // 맵의 총 길이
#define SMALLMAP_XPOS 500  // 축소맵에서 캐릭터 뿌릴 기준위치
#define SMALLMAP_YPOS 70  // 축소맵에서 캐릭터 뿌릴 위치
#define CLOCK_XPOS  355  // 시간 뿌릴 기준 X 좌표
#define CLOCK_YPOS  65  // 시간 뿌릴 기준 Y 좌표

//변수들///////////////////////////////////////////////////////////////////////////////////////

struct CHARACTER
{
 int nLeftX; 
 int nLeftY;
 int nRightX;
 int nRightY;
 int nSpeed;
 int nJumpSpeed;
 int nJumpHeight;
 int nNumOfItems;
 bool bLife;
};

struct SMALL_CHARACTER
{
 int nLeftX;
 int nLeftY;
 int nRightX;
 int nRightY;
};

// 캐릭터 속성    LX  , LY  , RX, RY, Sp, JumpSp,JumpH, It, Life
CHARACTER OPPA = { XPOSITION , YPOSITION , 0 , 0 , 9 , 10 , 100 , 3 , true };
CHARACTER HORANG = { -200  ,  380 , 0 , 0 , 3 , 3  , 300 , 0 , true };
// 축소맵 캐릭터 위치
SMALL_CHARACTER S_OPPA  = { SMALLMAP_XPOS , SMALLMAP_YPOS , 0 , 0 };
SMALL_CHARACTER S_HORANG = { SMALLMAP_XPOS , SMALLMAP_YPOS , 0 , 0 };
// 시계도 선언하다! -_-.
SMALL_CHARACTER CLOCK  = { CLOCK_XPOS , CLOCK_YPOS , 0 , 0 };

LPSTR  lpszClass = "Dunkin' Game";

bool  g_bOnGaming; // 게임 진행중인가.
bool  g_bOnUpJumping; // 위쪽으로로점프중인가
bool  g_bOnJumping; // 점프중인가
// g_GameState : 게임의 상태를 나타냄
// 0 : Dunkin' Game 로고 , 1 : 게임 메인화면 , 2 : 스토리화면 , 3 : 게임조작법
// 4 : 캐릭터 선택   5 : start .   6 : stage 1 .....
int   g_nLogoState = 0;
int   g_nStage;  // = g_nLogoState - 5 스테이지 번호( g_nLogoState 가 6일때 게임이 시작된다 )
int   g_nMouseMovedToCharacter = 0; // 1 이면 오빠 , 2면 여동생
int   g_nSelectedCharacter = 1;  // 1 이면 오빠 , 2면 여동생
int   g_nGameTime = 99;    // 게임 시간
int   g_nGameTimeOneCount;   // 게임 시간의 일 자리수
int   g_nGameTimeTenCount;   // 게임 시간의 십 자리수

// 비트맵 자료 저장소
HBITMAP  g_arrhBitmap[ FRAMECOUNT + 2 ] , g_hOldMapBitmap; // 배경화면들
HBITMAP  g_hOppaBitmap , g_hOldOppaBitmap ;     // 오빠 관련
HBITMAP  g_hDongsangBitmap , g_hOldDongsangBitmap;   // 동생 관련
HBITMAP  g_hHorangBitmap , g_hOldHorangBitmap;    // 호랑이 관련
HBITMAP  g_hSmallHorangBitmap , g_hOldSmallHorangBitmap;  // 축소맵용 호랑이
HBITMAP  g_hSmallBoyBitmap , g_hOldSmallBoyBitmap;   // 축소맵용 오빠
HBITMAP  g_hSmallGirlBitmap , g_hOldSmallGirlBitmap;   // 축소맵용 동생
HBITMAP  g_hClockBitmap[ 10 ] , g_hOldClockBitmap;   // 시간 표시용 이미지
HBITMAP  g_hMouseMoveToBoyBitmap , g_hOldMouseMoveToBoyBitmap;// 캐릭터 선택시에..
HBITMAP  g_hMouseMoveToGirlBitmap , g_hOldMouseMoveToGirlBitmap;// 마우스움직일때효과이미지

// [ FRAMECOUNT + 2 ] 는 여동생 말하는 화면 두개 까지 더해서
HDC   g_hDC , g_BitmapMemDC[ FRAMECOUNT + 2 ] , g_OppaMemDC , g_HorangMemDC , g_DongsangMemDC;
HDC   g_SmallCharacterMemDC[ 3 ];   // 축소맵용 메모리디씨 ( 0 : 오빠 1 : 호랑 2 : 동생 )
HDC   g_MouseMoveToCharacterMemDC[ 2 ]; // 마우스 움직일때 캐릭터 효과 이미지
HDC   g_ClockBitmapMemDC[ 10 ];   // 시간 표시용

// 사각영역들.. 지정해놓기...
RECT  g_RectItem    = { 20 , 30 , 220 , 90 };
RECT  g_RectTime    = { 355 , 65 , 450 , 130 };
RECT  g_RectSmallMap   = { 510 , 50 , 790 , 110 };
RECT  g_RectPoint    = { 725 , 555 , 770 , 590 };
RECT  g_RectSelectOppa  = { 100 , 100 , 350 , 400 };
RECT  g_RectSelectDongsang = { 450 , 100 , 700 , 450 };
//RECT  g_RectHorang = {  };
//RECT  g_RectOppa = {};
//RECT  g_RectMovingItem = {};

HINSTANCE g_hInstance;
HWND  g_hWnd;
HANDLE  g_hTimerHorang , g_hTimerTime , g_hTimerOppa;
DWORD  g_dwOldTime , g_dwNowTime;

//함수들///////////////////////////////////////////////////////////////////////////////////////

LRESULT WINAPI WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
int  GameInit(); 
int  GameMain();
void GameShutdown();
void MapRead();
void MapRendering();
void CharRead();
void CharacterRendering();
void EffectRead();
void EffectRendering();
// void SmallMapRendering(); // 축소맵은 이펙트에 포함
void KeyProcessing( HWND , WPARAM );
void ChangeScreenMode();
void CollisionCheck();


///////////////////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
 HWND hWnd;
    WNDCLASSEX wcx;

    wcx.cbSize   = sizeof( wcx );
    wcx.cbClsExtra  = wcx.cbWndExtra = 0;
    wcx.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH );
    wcx.hCursor   = ( HCURSOR )LoadCursor( hInstance , NULL );
    wcx.hIcon   = LoadIcon( NULL, NULL );
    wcx.hIconSm   = LoadIcon( NULL, NULL );
    wcx.hInstance  = hInstance;
    wcx.lpfnWndProc  = WndProc;
    wcx.lpszClassName = lpszClass;
    wcx.lpszMenuName = NULL;
    wcx.style = 0;
 
    RegisterClassEx( &wcx );
 
    g_hWnd = hWnd = CreateWindowEx( 0, wcx.lpszClassName, "해와달", WS_POPUP | WS_VISIBLE,
         0, 0, 800, 600, NULL, NULL, hInstance, 0 );
 
    if( !hWnd )
    {
        MessageBox( NULL, "창만들기 쫑", 0, 0 );
        return 0;
    }
 
    if( !GameInit() )
    {
        MessageBox( NULL, "초기화 쫑", 0, 0 );
        return 0;
    }
 
    MSG msg;    

 ZeroMemory( &msg, sizeof( MSG ) ); 

 //
 
    while( 1 )
    {
  GameMain();

        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            if( msg.message == WM_QUIT )
                break;
 
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }

  // 현재시간 구해서 ( g_dwOldTime - g_NowTime ) 구하기.. 
        g_dwNowTime = GetTickCount();
    }
 
    GameShutdown();

    return 0;
}

// WndProc
LRESULT WINAPI WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
 //
 PAINTSTRUCT ps; 
 static char str[20];
 static char str1[20];
 static char str2[25];
 static char strTime[10];
 static char strStage[10];
 static char strMouseMovedToCharacter[ 30 ];
 RECT rt = { 10 , 60 , 160 , 80 };

 // 마우스 위치
 static int nX;
 static int nY;

 switch( Msg )
    {
  case WM_CREATE :
   // 게임 초기화
   GameInit();
   break;

  case WM_TIMER :   
   switch( wParam )
   {
    case 1 :  // 호랑이 달리기
     HORANG.nLeftX += HORANG.nSpeed;
     InvalidateRect( hWnd , NULL , true );
     break;

    case 2 :  // 게임 시간 1초단위로
     if( ( g_dwOldTime - g_dwNowTime ) > 1000 )
     {
      // 전위 연산자로 --g_nGameTime 해줘야 시간 이미지 출력과 차이가 없다.
      wsprintf( strTime , " Time = %d " , --g_nGameTime );
     }     
     InvalidateRect( hWnd , &g_RectTime , true );
     break;

    case 3 :  // 주인공 점프할때 움직임     
     // 땅과 주인공의 바닥 사이의 차가 점프가능높이 보다 작고 플래그가 참
     if( ( GROUND - ( OPPA.nLeftY + OPPA.nRightY ) <= OPPA.nJumpHeight ) &&
      ( g_bOnUpJumping == true ) )
     {
      OPPA.nLeftY -= OPPA.nJumpSpeed; // 위로
     }
     else if( ( OPPA.nLeftY + OPPA.nRightY ) <= GROUND )
     {
      g_bOnUpJumping = false;
      OPPA.nLeftY += OPPA.nJumpSpeed; // 아래로
      
      // 주인공의 밑면이 땅보다 더 밑으로 내려갔으면
      if( ( OPPA.nLeftY + OPPA.nRightY ) >= GROUND )
      {
       g_bOnJumping = false;   // 점프가 끝났다 다시 점프 할 수 있게.
       OPPA.nLeftY = GROUND - OPPA.nRightY;
      }
     }     
     break;
    // 
   }
   break;

  case WM_LBUTTONDOWN :
   // 캐릭터 선택 화면에서
   if( g_nLogoState == 4 )
   {
    nX = LOWORD( lParam );
    nY = HIWORD( lParam );
    // 오빠 그림 영역 : ( 100 , 100 , 350 , 400 )    
    if( ( nX > 100 && nX < 350 ) && ( nY > 100 && nY < 400 ) )
    {
     // 오빠 그림을 밝게보여준다..??? 선택한효과 내기..
     g_nSelectedCharacter = 1; // 오빠 선택
     MessageBox( hWnd , "sdfsdf" , "오빠선택" , MB_OK );
     g_nLogoState++;     
    }
    // 동생 그림 영역 : ( 450 , 100 , 700 , 400 )
    if ( ( nX > 450 && nX < 700 ) && ( nY > 100 && nY < 400 ) )
    {
     // 동생선택한효과 내기..
     g_nSelectedCharacter = 2; // 동생 선택
     MessageBox( hWnd , "sdfsdf" , "동생선택" , MB_OK );
     g_nLogoState++;     
    }
    //    
   } 
  
  case WM_MOUSEMOVE : 
   // 캐릭터 선택 화면에서
   if( g_nLogoState == 4 )
   {
    nX = LOWORD( lParam );
    nY = HIWORD( lParam );

    // 오빠 그림 영역 : ( 100 , 100 , 350 , 400 )    
    if( ( nX > 100 && nX < 350 ) && ( nY > 100 && nY < 400 ) )
    {
     // 마우스를 위에 갖다대면 그림을 밝게보여준다..? 등의 선택한효과 내기..      
     g_nMouseMovedToCharacter = 1; // 1이면 오빠
     InvalidateRect( hWnd , &g_RectSelectOppa , false );
    }
    // 동생 그림 영역 : ( 450 , 100 , 700 , 400 )
    else if ( ( nX > 450 && nX < 700 ) && ( nY > 100 && nY < 400 ) )
    {
     // 마우스 갖다댄 효과 내기..
     g_nMouseMovedToCharacter = 2; // 2면 여동생
     InvalidateRect( hWnd , &g_RectSelectDongsang , false );
    }
    else 
    {
     g_nMouseMovedToCharacter = 0; // 여기도 저기도 아니면 0 !
     //InvalidateRect( hWnd , &g_RectSelectDongsang , false );
     //InvalidateRect( hWnd , &g_RectSelectOppa , false );
    }

    // 시험 출력    
    wsprintf( str2 , "( x , y ) = ( %d , %d )" , nX , nY );
    InvalidateRect( g_hWnd , &rt , true );
   }
   break;

  case WM_PAINT :   
   g_hDC = BeginPaint( hWnd , &ps );   

   // 맵 Rendering
   MapRendering();
   
   // 캐릭터 Rendering
   CharacterRendering();
   
   // 캐릭터 선택시에 캐릭터위로 마우스 움직이면,,
   if( g_nLogoState == 4 )
   {
    if( g_nMouseMovedToCharacter == 1 )
    {
     // 대충..
     BitBlt( g_hDC , 100 , 100 , 200 , 200 , g_MouseMoveToCharacterMemDC[ 0 ] ,
      0 , 0 , SRCCOPY );     
    }
    else if( g_nMouseMovedToCharacter == 2 )
    {
     // 대충..
     BitBlt( g_hDC , 450 , 100 , 550 , 200 , g_MouseMoveToCharacterMemDC[ 1 ] ,
      0 , 0 , SRCCOPY );
    }
    else
    {
     // BitBlt( g_hDC , 450 , 100 , 550 , 200 , g_BitmapMemDC[ 4 ] , 0 , 0 , SRCCOPY );
    }
   }

   // Effect Rendering 게임 진행중일때..
   if( g_bOnGaming == true && g_nLogoState != 10 && g_nLogoState != 14 &&
    g_nLogoState != 17 )
   {
    EffectRendering();
   }
   
   //////////////////////////////////////////////////////////////
   // 시험 출력
   wsprintf( str , "g_nLogoState = %d" , g_nLogoState );
   TextOut( g_hDC , 10 , 120 , str , sizeof( str ) );

   wsprintf( str1 , "g_bOnGaming = %d" , g_bOnGaming );
   TextOut( g_hDC , 10 , 140 , str1 , sizeof( str1 ) );
   
   TextOut( g_hDC , 300 , 160 , strTime , sizeof( strTime ) );
   
   if( g_nLogoState == 4 )
   {
    TextOut( g_hDC , 10 , 180 , str2 , sizeof( str2 ) );
   }

   wsprintf( strStage , "Stage = %d" , g_nStage );
   TextOut( g_hDC , 10 , 200 , strStage , sizeof( strStage ) );

   wsprintf( strMouseMovedToCharacter , "g_nMouseMovedToCharacter = %d " ,
    g_nMouseMovedToCharacter );
   TextOut( g_hDC , 10 , 220 , strMouseMovedToCharacter , sizeof( strMouseMovedToCharacter ) );
   // 시험출력은 요까이~

   EndPaint( hWnd , &ps );   
   break;

  case WM_KEYDOWN :
   KeyProcessing( hWnd , wParam ); 
   break;
  //
    }
 
    return DefWindowProc( hWnd, Msg, wParam, lParam );
}

//
int GameInit()
{
 BITMAP OppaBitmap , HorangBitmap;
 BITMAP S_OppaBitmap , S_HorangBitmap;
 BITMAP ClockBitmap[ 10 ];
  
 // Note: 맵 초기화
 MapRead();

    // Note: 캐릭터 초기화
 //CharRead("cha1.chr");
 CharRead();

 //스프라이트 초기화

 // Effect Init..
 EffectRead();

 //기타 환경 초기화

 // 시간 출력관련정보 초기화하기 

 // 캐릭터 이미지의 크기 알아오기
 GetObject( g_hOppaBitmap , sizeof( BITMAP ) , &OppaBitmap );
 OPPA.nRightX = OppaBitmap.bmWidth;
 OPPA.nRightY = OppaBitmap.bmHeight;

 GetObject( g_hHorangBitmap , sizeof( BITMAP ) , &HorangBitmap );
 HORANG.nRightX = HorangBitmap.bmWidth;
 HORANG.nRightY = HorangBitmap.bmHeight;

 GetObject( g_hSmallBoyBitmap , sizeof( BITMAP ) , &S_OppaBitmap );
 S_OPPA.nRightX = S_OppaBitmap.bmWidth;
 S_OPPA.nRightY = S_OppaBitmap.bmHeight;

 GetObject( g_hSmallBoyBitmap , sizeof( BITMAP ) , &S_HorangBitmap );
 S_HORANG.nRightX = S_HorangBitmap.bmWidth;
 S_HORANG.nRightY = S_HorangBitmap.bmHeight;

 for( int i = 0 ; i < 10 ; i++ )
 {
  GetObject( g_hClockBitmap[ i ] , sizeof( BITMAP ) , &ClockBitmap[ i ] );
  CLOCK.nRightX = ClockBitmap[i].bmWidth;
  CLOCK.nRightX = ClockBitmap[i].bmHeight;
 }
    // Note: 스테이지 별 데이타 초기화

    return 1;
}

//
int GameMain()
{  
 // 데이타 이동
 

 // 실제로 게이머가 조작하는 프레임에서만. g_bOnGaming = true 로
 if( ( g_nLogoState > 5 && g_nLogoState < 10 ) ||
  ( g_nLogoState > 11 && g_nLogoState < 14 ) ||
  ( g_nLogoState >14 && g_nLogoState < 17 ) )
 {
  g_bOnGaming = true;
 }
 else
 {
  g_bOnGaming = false;
 }

 // 게임 진행이 시작되면 게임시간, 호랑이 타이머 시작
 if( g_nLogoState == 5 || g_nLogoState == 11 || g_nLogoState == 14 ) 
 {
  g_hTimerHorang = ( HANDLE )SetTimer( g_hWnd , 1 , 30 , NULL );
  g_hTimerTime = ( HANDLE )SetTimer( g_hWnd , 2 , 1000 , NULL );
  g_dwOldTime = GetTickCount();
 }
 // 게임 진행중이 아닐땐 타이머 즐~
 else if ( g_nLogoState == 10 || g_nLogoState == 14 || g_nLogoState == 17 )
 {
  KillTimer( g_hWnd , 1 );
  KillTimer( g_hWnd , 2 );
 }

 // 프레임이 끝까지 가면
 if( g_nLogoState == FRAMECOUNT )
 {
  PostQuitMessage( 0 );    
 }

    // 충돌 체크
 CollisionCheck();
 
    // 렌더링 은  WM_PAINT에서
 
    return 0;
}

void KeyProcessing( HWND hWnd , WPARAM wParam )
{
 // 대충 이렇게 네모영역 지정해놓고.. 호랑이는 언제 필요할랑가..
 //RECT OppaRect = { OPPA.nBaseX , OPPA.nBaseY , OPPA.nRightX , OPPA.nRightY };
 //RECT HorangRect = { HORANG.nBaseX , HORANG.nBaseY , HORANG.nRightX , HORANG.nRightY }; 
 
 // 게임 스테이지 들어갔을않았을때의 키보드 조작
 if( g_bOnGaming == false )
 {
  switch( wParam )
  {  
   case VK_ESCAPE :  
    PostQuitMessage( 0 );
    break;
   
   case VK_LEFT :    
    break;
   
   case VK_RIGHT :     
    break;

   case VK_UP :  
    break;  
   
   case VK_DOWN :    
    break; 

   // 시험용
   case VK_SPACE :   
    if( ( g_nLogoState != 4 ) )
    {
     g_nLogoState++;
     InvalidateRect( g_hWnd , NULL , true );
    }
    break;
   //
  }
 }
 // 게임 스테이지 들어갔을때의 키보드 조작
 else
 {
  switch( wParam )
  {  
   case VK_ESCAPE :  
    PostQuitMessage( 0 );
    break;
   
   case VK_LEFT :
    // 캐릭터를 왼쪽으로
    OPPA.nLeftX -= OPPA.nSpeed;    
    InvalidateRect( g_hWnd , NULL , true );
    break;
   
   case VK_RIGHT :
    // 캐릭터를 오른쪽으로
    OPPA.nLeftX += OPPA.nSpeed;    
    InvalidateRect( g_hWnd , NULL , true );
    break;

   case VK_UP :
    // 점프
    if( g_bOnJumping == false ) // 점프중에 다시 점프 하지 못하도록
    {
     g_bOnJumping = true;
     g_bOnUpJumping = true;
     g_hTimerOppa = ( HANDLE )SetTimer( g_hWnd , 3 , 30 , NULL );
     if( g_bOnUpJumping == false )
     {
      KillTimer( g_hWnd , 3 );
     }     
    }
    break;  
   
   case VK_DOWN :
    // 점프  머.. 그냥
    //OPPA.nBaseY += OPPA.nSpeed;
    InvalidateRect( g_hWnd , NULL , true );
    break;

   // 시험용
   case VK_SPACE :
    g_nLogoState++;
    InvalidateRect( g_hWnd , NULL , true );
    break; 
  }
 }
 //
}

void MapRead()

 // 로고화면들과 맵.. 
 // 미리 보여주는 순서대로 - 한번에 다 읽어버리자.
 // 읽고 , 메모리디씨에 복사하고.
 g_arrhBitmap[ 0 ] = ( HBITMAP )LoadImage( 0 , "DunkinLogo.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 1 ] = ( HBITMAP )LoadImage( 0 , "GameMain.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 2 ] = ( HBITMAP )LoadImage( 0 , "Story.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 3 ] = ( HBITMAP )LoadImage( 0 , "GameControl.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 g_arrhBitmap[ 4 ] = ( HBITMAP )LoadImage( 0 , "CharacterSelect.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 5 ] = ( HBITMAP )LoadImage( 0 , "kinyang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 // 맵들도 읽어오자.
 g_arrhBitmap[ 6 ] = ( HBITMAP )LoadImage( 0 , "stage1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 7 ] = ( HBITMAP )LoadImage( 0 , "stage2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 8 ] = ( HBITMAP )LoadImage( 0 , "stage3.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 9 ] = ( HBITMAP )LoadImage( 0 , "stage4.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 12 ] = ( HBITMAP )LoadImage( 0 , "stage5.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 13 ] = ( HBITMAP )LoadImage( 0 , "stage6.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 15 ] = ( HBITMAP )LoadImage( 0 , "stage7.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 16 ] = ( HBITMAP )LoadImage( 0 , "stage8.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 // 가운데 호랑이와 주인공의 이야기 
 g_arrhBitmap[ 10 ] = ( HBITMAP )LoadImage( 0 , "BoySays1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 g_arrhBitmap[ 11 ] = ( HBITMAP )LoadImage( 0 , "HorangSays.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 14 ] = ( HBITMAP )LoadImage( 0 , "BoySays2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 17 ] = ( HBITMAP )LoadImage( 0 , "GameEnding1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 18 ] = ( HBITMAP )LoadImage( 0 , "GameEnding2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 // 동생 말은 따로 2장
 g_arrhBitmap[ 19 ] = ( HBITMAP )LoadImage( 0 , "GirlSays1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 20 ] = ( HBITMAP )LoadImage( 0 , "GirlSays2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 //
 for( int i = 0 ; i < FRAMECOUNT + 2; i++ )
 {
  g_BitmapMemDC[ i ] = CreateCompatibleDC( g_hDC );
  g_hOldMapBitmap = ( HBITMAP )SelectObject( g_BitmapMemDC[ i ] , g_arrhBitmap[ g_nLogoState + i ] );
 }
 
 // and so on.......

 
}

void MapRendering()
{
 if( g_nSelectedCharacter == 1 )
 {
  // 오빠 이야기 그림( 10 , 14 )과 호랑이 이야기 그림( 11 ) 랜더링
  if( g_nLogoState == 10 || g_nLogoState == 11 || g_nLogoState == 14 )
  {
   BitBlt( g_hDC , 0 , 160 , 800 , 600 , g_BitmapMemDC[ g_nLogoState ] , 0 , 0 , SRCCOPY );
  }
  // 기본 그냥 보통 배경 Rendering
  else 
  {
   BitBlt( g_hDC , 0 , 0 , 800 , 600 , g_BitmapMemDC[ g_nLogoState ] , 0 , 0 , SRCCOPY );
  }
 }
 // 여동생 선택했을때 배경 Rendering ( 오빠 선택했을때는 그냥 순서대로 랜더링 되면 된다. )
 if( g_nSelectedCharacter == 2 )
 {
  if( g_nLogoState == 10 )
  {
   BitBlt( g_hDC , 0 , 160 , 800 , 600 , g_BitmapMemDC[ 19 ] , 0 , 0 , SRCCOPY );
  }
  else if( g_nLogoState == 11 )
  {
   BitBlt( g_hDC , 0 , 160 , 800 , 600 , g_BitmapMemDC[ 11 ] , 0 , 0 , SRCCOPY );
  }
  else if( g_nLogoState == 14 )
  {
   BitBlt( g_hDC , 0 , 160 , 800 , 600 , g_BitmapMemDC[ 20 ] , 0 , 0 , SRCCOPY );
  }
  else // 보통 배경
  {
   BitBlt( g_hDC , 0 , 0 , 800 , 600 , g_BitmapMemDC[ g_nLogoState ] , 0 , 0 , SRCCOPY );
  }
 } 

 //
}


void CharRead()
{
 // 주인공과 호랑이 이미지 읽고 메모리디씨에 복사
 g_hOppaBitmap = ( HBITMAP )LoadImage( g_hInstance , "Oppa.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_CREATEDIBSECTION | LR_LOADFROMFILE );
 g_hDongsangBitmap = ( HBITMAP )LoadImage( g_hInstance , "Dongsang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_CREATEDIBSECTION | LR_LOADFROMFILE );
 g_hHorangBitmap = ( HBITMAP )LoadImage( g_hInstance , "Horang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_CREATEDIBSECTION | LR_LOADFROMFILE );

 g_OppaMemDC = CreateCompatibleDC( g_hDC );
 g_HorangMemDC = CreateCompatibleDC( g_hDC );
 g_DongsangMemDC = CreateCompatibleDC( g_hDC );

 g_hOldOppaBitmap = ( HBITMAP )SelectObject( g_OppaMemDC , g_hOppaBitmap );
 g_hOldDongsangBitmap = ( HBITMAP )SelectObject( g_DongsangMemDC , g_hDongsangBitmap );
 g_hOldHorangBitmap = ( HBITMAP )SelectObject( g_HorangMemDC , g_hHorangBitmap );

 //
}

void CharacterRendering()

 // 움직이는 캐릭터 영역만 새로 뿌려주기..해야된다.

 // 게임 진행중인 상황에만 캐릭터 출력
 if( g_bOnGaming == true && g_nLogoState != 10 && g_nLogoState != 14 && g_nLogoState != 17 )
 {
  // 호랑이 먼저 보여주고 , 주인공 보여주기
  BitBlt( g_hDC , HORANG.nLeftX , HORANG.nLeftY , HORANG.nRightX , HORANG.nRightY ,
    g_HorangMemDC , 0 , 0 , SRCCOPY );
  // 오빠
  if( g_nSelectedCharacter == 1 )
  {
   BitBlt( g_hDC , OPPA.nLeftX , OPPA.nLeftY , OPPA.nRightX , OPPA.nRightY ,
     g_OppaMemDC , 0 , 0 , SRCCOPY );
  }
  // 동생
  if( g_nSelectedCharacter == 2 )
  {
   BitBlt( g_hDC , OPPA.nLeftX , OPPA.nLeftY , OPPA.nRightX , OPPA.nRightY ,
     g_DongsangMemDC , 0 , 0 , SRCCOPY );
  }
 }

 //
}

void EffectRead()
{
 // 캐릭터 선택때 마우스 위로 갖다댔을때의 효과 읽기

 

 // 축소맵용 이미지 읽기
 g_hSmallBoyBitmap = ( HBITMAP )LoadImage( 0 , "SmallBoy.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hSmallHorangBitmap = ( HBITMAP )LoadImage( 0 , "SmallHorang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hSmallGirlBitmap = ( HBITMAP )LoadImage( 0 , "SmallGirl.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );

 g_SmallCharacterMemDC[ 0 ] = CreateCompatibleDC( g_hDC );
 g_SmallCharacterMemDC[ 1 ] = CreateCompatibleDC( g_hDC );
 g_SmallCharacterMemDC[ 2 ] = CreateCompatibleDC( g_hDC );

 g_hOldSmallBoyBitmap = ( HBITMAP )SelectObject( g_SmallCharacterMemDC[ 0 ] , g_hSmallBoyBitmap );
 g_hOldSmallHorangBitmap = ( HBITMAP )SelectObject( g_SmallCharacterMemDC[ 1 ] , g_hSmallHorangBitmap );
 g_hOldSmallGirlBitmap = ( HBITMAP )SelectObject( g_SmallCharacterMemDC[ 2 ] , g_hSmallGirlBitmap );
 
 //시계 숫자이미지 읽기
 g_hClockBitmap[ 0 ] = ( HBITMAP )LoadImage( 0 , "num0.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 1 ] = ( HBITMAP )LoadImage( 0 , "num1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 2 ] = ( HBITMAP )LoadImage( 0 , "num2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 3 ] = ( HBITMAP )LoadImage( 0 , "num3.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 4 ] = ( HBITMAP )LoadImage( 0 , "num4.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 5 ] = ( HBITMAP )LoadImage( 0 , "num5.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 6 ] = ( HBITMAP )LoadImage( 0 , "num6.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 7 ] = ( HBITMAP )LoadImage( 0 , "num7.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 8 ] = ( HBITMAP )LoadImage( 0 , "num8.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 9 ] = ( HBITMAP )LoadImage( 0 , "num9.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );

 for ( int i = 0 ; i < 10 ; i++ )
 {
  g_ClockBitmapMemDC[ i ] = CreateCompatibleDC( g_hDC );
  g_hOldClockBitmap = ( HBITMAP )SelectObject( g_ClockBitmapMemDC[ i ] , g_hClockBitmap[ i ] );
 }

 // 캐릭터 선택시에 마우스 움직일때 효과이미지 읽기
 g_hMouseMoveToBoyBitmap = ( HBITMAP )LoadImage( 0 , "SelectedOppa.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hMouseMoveToGirlBitmap = ( HBITMAP )LoadImage( 0 , "SelectedDongsang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_MouseMoveToCharacterMemDC[ 0 ] = CreateCompatibleDC( g_hDC );
 g_MouseMoveToCharacterMemDC[ 1 ] = CreateCompatibleDC( g_hDC );

 g_hOldMouseMoveToBoyBitmap = ( HBITMAP )SelectObject( g_MouseMoveToCharacterMemDC[ 0 ] , g_hMouseMoveToBoyBitmap );
 g_hOldMouseMoveToGirlBitmap = ( HBITMAP )SelectObject( g_MouseMoveToCharacterMemDC[ 1 ] , g_hMouseMoveToGirlBitmap );
}

void EffectRendering()
{
 int nSmallMapHorangPosition;
 int nSmallMapOppaPosition;

 // 시간 뿌려줄 정보 계산.
 // 시간은 총 두자리니깐 10으로 나누면 첫째자리가 나머지로 남겠지..
 g_nGameTimeOneCount = g_nGameTime % 10;
 // 시간의 십의 자리숫자는.. 현재 시간에서 일의 자리 숫자를 빼준다음 10으로 나눠주면되겠지.. ㅎㅎ
 g_nGameTimeTenCount = ( g_nGameTime - g_nGameTimeOneCount ) / 10 ; 

 // g_nLogoState 와 g_nStage 사이의 관계
 switch( g_nLogoState )
 { 
  case 10 :   
  case 11 :
   g_nStage = 4;
   break;
  case 12 :
   g_nStage = 5;
   break;
  case 13 :
   g_nStage = 6;
   break;
  case 14 :
   g_nStage = 6;
   break;
  case 15 :
   g_nStage = 7;
   break;
  case 16 :
   g_nStage = 8;
   break;
  default :
   g_nStage = g_nLogoState - 5; // 스테이지 번호( g_nLogoState 가 6일때 g_nStage 값은 1 )
   break;
 }
 

 // 축소맵에서의 위치 .. 다시 계산...
 // 전체맵 8장 * 한장에 가로가 800픽셀이니까 전체 6400 픽셀
 // 축소맵 길이는 500 ~ 700까지 200 픽셀로 잡고 , 200 / 6400 하면 1/32 가 나온다..
 nSmallMapHorangPosition = ( ( ( g_nStage * 800 ) + HORANG.nLeftX ) / 32 );
 nSmallMapOppaPosition = ( ( ( g_nStage * 800 ) + OPPA.nLeftX ) / 32 );

 if( g_bOnGaming == true && g_nLogoState != 10 && g_nLogoState != 14 && g_nLogoState != 17 )
 {
  // 호랑이 먼저 양념하고~
  BitBlt( g_hDC , S_HORANG.nLeftX + nSmallMapHorangPosition , S_HORANG.nLeftY ,
    S_HORANG.nRightX , S_HORANG.nRightY , g_SmallCharacterMemDC[ 1 ] , 0 , 0 , SRCCOPY );

  // 축소맵 뿌려주기~
  if( g_nSelectedCharacter == 1 )  // 오빠
  {
   BitBlt( g_hDC , S_OPPA.nLeftX + nSmallMapOppaPosition , S_OPPA.nLeftY ,
    S_OPPA.nRightX , S_OPPA.nRightY , g_SmallCharacterMemDC[ 0 ] , 0 , 0 , SRCCOPY );
  }
  else        // 동생
  {
   BitBlt( g_hDC , S_OPPA.nLeftX + nSmallMapOppaPosition , S_OPPA.nLeftY ,
    S_OPPA.nRightX , S_OPPA.nRightY , g_SmallCharacterMemDC[ 2 ] , 0 , 0 , SRCCOPY );
  } 
 }
  
 
 // 시간 출력..//////////////////////////////////////////////////////////////////////////////////  
 // 십자리수 출력.
 BitBlt( g_hDC , CLOCK.nLeftX , CLOCK.nLeftY , CLOCK.nRightX + CLOCK.nLeftX ,
  CLOCK.nRightY + CLOCK.nLeftY , g_ClockBitmapMemDC[ g_nGameTimeTenCount ] , 0 , 0 , SRCCOPY );
 // 일자리수 출력.
 BitBlt( g_hDC , CLOCK.nLeftX + 45 , CLOCK.nLeftY , CLOCK.nRightX + CLOCK.nLeftX + 45 ,
  CLOCK.nRightY + CLOCK.nLeftY , g_ClockBitmapMemDC[ g_nGameTimeOneCount ] , 0 , 0 , SRCCOPY );

 
 
 //
}

void ChangeScreenMode()
{

}

//
void GameShutdown()
{
    // Note: map 데이타 해제

 // 없애기 이렇게 없애는게 맞는가..모르겠다.
 SelectObject( g_OppaMemDC , g_hOldOppaBitmap );
 DeleteObject( g_hOppaBitmap );
 DeleteDC( g_OppaMemDC );
 
 SelectObject( g_HorangMemDC , g_hOldHorangBitmap );
 DeleteObject( g_hHorangBitmap );
 DeleteDC( g_HorangMemDC );

 SelectObject( g_BitmapMemDC[ g_nLogoState ] , g_hOldMapBitmap );
 DeleteObject( g_arrhBitmap[ g_nLogoState ] );
 DeleteDC( g_BitmapMemDC[ g_nLogoState ] );  

 // Note: 캐릭터 해제

 // 등등 메모리 해제.
 KillTimer( g_hWnd , 2 );
}

void CollisionCheck()
{
 int HorangOffset;

 // 주인공 움직임
 // 주인공이 오른쪽 끝까지 가면 다음 프레임으로
 if( OPPA.nLeftX > RIGHTSIDE )
 {
  g_nLogoState++;  
  OPPA.nLeftX = LEFTSIDE;
  // 주인공이 다음 프레임으로 넘어갈때 ( RIGHTSIDE - 호랑이위치 )의 값을 빼준다
  // 남은거리만큼 다음 프레임에선 뒤쳐져 올 수 있도록
  HorangOffset = RIGHTSIDE - HORANG.nLeftX;
  HORANG.nLeftX = 0;
  HORANG.nLeftX = HORANG.nLeftX - HorangOffset;
  InvalidateRect( g_hWnd , NULL , true );
 }

 // 호랑이 움직임
 if( HORANG.nLeftX > RIGHTSIDE )
 {  
  HORANG.nLeftX = LEFTSIDE;
  InvalidateRect( g_hWnd , NULL , true );
 }

 // 주인공이 왼쪽까지 가면 더 못가도록
 if( OPPA.nLeftX < LEFTSIDE )
 {
  OPPA.nLeftX = 0;
 }

 // 기본 땅보다 밑으로 못내려가도록
 if( OPPA.nRightY > GROUND )
 {
  OPPA.nRightY = GROUND;
 }

 //

 
 // 호랑이에게 잡히면 땡
 if( HORANG.nLeftX + HORANG.nRightX > OPPA.nLeftX )
 {
  if( MessageBox( g_hWnd , "잡혔다~ 끝낼려면 YES" , "ㅇㄹㅇㄹ" , MB_YESNO ) == IDYES )
  {
   PostQuitMessage( 0 );
   exit( 0 );
  }
 }
 

 //
}

 

 

 

 

//////////////////////////////////////////////////

 

빽 버퍼 넣고..  등등..

 

 

//
// Dunkin' Game
//
// team Project
//  : 햇님 달님
//

#include <windows.h>

#define FRAMECOUNT  19  // 총 넘어가는 frame의 개수
#define XPOSITION  10  // 주인공 이미지 기본 좌표
#define YPOSITION  400  // 주인공 이미지 기본 좌표
#define GROUND   580  // 땅의 Y좌표
#define LEFTSIDE  0  // 화면 왼쪽끝
#define RIGHTSIDE  800  // 화면 오른쪽 끝. 799;;
#define UPSIDE   0  // 화면 위쪽
#define BOTTOMSIDE  600  // 화면 아래쪽
#define TOTALDISTANCE 800 * 8 // 맵의 총 길이
#define SMALLMAP_XPOS 500  // 축소맵에서 캐릭터 뿌릴 기준위치
#define SMALLMAP_YPOS 70  // 축소맵에서 캐릭터 뿌릴 위치
#define CLOCK_XPOS  355  // 시간 뿌릴 기준 X 좌표
#define CLOCK_YPOS  65  // 시간 뿌릴 기준 Y 좌표

struct KEY
{
 bool Space;
 bool Esc;
 bool Left;
 bool Right;
};

KEY g_Key;

//변수들///////////////////////////////////////////////////////////////////////////////////////

struct CHARACTER
{
 int nLeftX; 
 int nLeftY;
 int nRightX;
 int nRightY;
 int nSpeed;
 int nJumpSpeed;
 int nJumpHeight;
 int nNumOfItems;
 bool bLife;
};

struct SMALL_CHARACTER
{
 int nLeftX;
 int nLeftY;
 int nRightX;
 int nRightY;
};

// 캐릭터 속성    LX  , LY  , RX, RY, Sp, JumpSp,JumpH, It, Life
CHARACTER OPPA = { XPOSITION , YPOSITION , 0 , 0 , 9 , 10 , 100 , 3 , true };
CHARACTER HORANG = { -200  ,  380 , 0 , 0 , 3 , 3  , 300 , 0 , true };
// 축소맵 캐릭터 위치
SMALL_CHARACTER S_OPPA  = { SMALLMAP_XPOS , SMALLMAP_YPOS , 0 , 0 };
SMALL_CHARACTER S_HORANG = { SMALLMAP_XPOS , SMALLMAP_YPOS , 0 , 0 };
// 시계도 선언하다! -_-.
SMALL_CHARACTER CLOCK  = { CLOCK_XPOS , CLOCK_YPOS , 0 , 0 };

LPSTR  lpszClass = "Dunkin' Game";

bool  g_bOnGaming; // 게임 진행중인가.
bool  g_bOnUpJumping; // 위쪽으로로점프중인가
bool  g_bOnJumping; // 점프중인가
// g_GameState : 게임의 상태를 나타냄
// 0 : Dunkin' Game 로고 , 1 : 게임 메인화면 , 2 : 스토리화면 , 3 : 게임조작법
// 4 : 캐릭터 선택   5 : start .   6 : stage 1 .....
int   g_nLogoState = 0;
int   g_nStage;  // = g_nLogoState - 5 스테이지 번호( g_nLogoState 가 6일때 게임이 시작된다 )
int   g_nMouseMovedToCharacter = 0; // 1 이면 오빠 , 2면 여동생
int   g_nSelectedCharacter = 1;  // 1 이면 오빠 , 2면 여동생
int   g_nGameTime = 99;    // 게임 시간
int   g_nGameTimeOneCount;   // 게임 시간의 일 자리수
int   g_nGameTimeTenCount;   // 게임 시간의 십 자리수

// 비트맵 자료 저장소
HBITMAP  g_arrhBitmap[ FRAMECOUNT + 2 ] , g_hOldMapBitmap; // 배경화면들
HBITMAP  g_hOppaBitmap , g_hOldOppaBitmap ;     // 오빠 관련
HBITMAP  g_hDongsangBitmap , g_hOldDongsangBitmap;   // 동생 관련
HBITMAP  g_hHorangBitmap , g_hOldHorangBitmap;    // 호랑이 관련
HBITMAP  g_hSmallHorangBitmap , g_hOldSmallHorangBitmap;  // 축소맵용 호랑이
HBITMAP  g_hSmallBoyBitmap , g_hOldSmallBoyBitmap;   // 축소맵용 오빠
HBITMAP  g_hSmallGirlBitmap , g_hOldSmallGirlBitmap;   // 축소맵용 동생
HBITMAP  g_hClockBitmap[ 10 ] , g_hOldClockBitmap;   // 시간 표시용 이미지
HBITMAP  g_hMouseMoveToBoyBitmap , g_hOldMouseMoveToBoyBitmap;// 캐릭터 선택시에..
HBITMAP  g_hMouseMoveToGirlBitmap , g_hOldMouseMoveToGirlBitmap;// 마우스움직일때효과이미지

// [ FRAMECOUNT + 2 ] 는 여동생 말하는 화면 두개 까지 더해서
HDC   g_hDC , g_BitmapMemDC[ FRAMECOUNT + 2 ] , g_OppaMemDC , g_HorangMemDC , g_DongsangMemDC;
HDC   g_SmallCharacterMemDC[ 3 ];   // 축소맵용 메모리디씨 ( 0 : 오빠 1 : 호랑 2 : 동생 )
HDC   g_MouseMoveToCharacterMemDC[ 2 ]; // 마우스 움직일때 캐릭터 효과 이미지
HDC   g_ClockBitmapMemDC[ 10 ];   // 시간 표시용

// 사각영역들.. 지정해놓기...
RECT  g_RectItem    = { 20 , 30 , 220 , 90 };
RECT  g_RectTime    = { 355 , 65 , 450 , 130 };
RECT  g_RectSmallMap   = { 510 , 50 , 790 , 110 };
RECT  g_RectPoint    = { 725 , 555 , 770 , 590 };
RECT  g_RectSelectOppa  = { 100 , 100 , 350 , 400 };
RECT  g_RectSelectDongsang = { 450 , 100 , 700 , 450 };
//RECT  g_RectHorang = {  };
//RECT  g_RectOppa = {};
//RECT  g_RectMovingItem = {};

HINSTANCE g_hInstance;
HWND  g_hWnd;
HANDLE  g_hTimerHorang , g_hTimerTime , g_hTimerOppa;
DWORD  g_dwOldTime , g_dwNowTime;
HDC   g_hBackBuffer;

//함수들///////////////////////////////////////////////////////////////////////////////////////

LRESULT WINAPI WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
int  GameInit(); 
int  GameMain();
void GameShutdown();
void MapRead();
void MapRendering();
void CharRead();
void CharacterRendering();
void EffectRead();
void EffectRendering();
// void SmallMapRendering(); // 축소맵은 이펙트에 포함
void KeyProcessing( HWND , WPARAM );
void ChangeScreenMode();
void CollisionCheck();


///////////////////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
 HWND hWnd;
    WNDCLASSEX wcx;

    wcx.cbSize   = sizeof( wcx );
    wcx.cbClsExtra  = wcx.cbWndExtra = 0;
    wcx.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH );
    wcx.hCursor   = ( HCURSOR )LoadCursor( hInstance , NULL );
    wcx.hIcon   = LoadIcon( NULL, NULL );
    wcx.hIconSm   = LoadIcon( NULL, NULL );
    wcx.hInstance  = hInstance;
    wcx.lpfnWndProc  = WndProc;
    wcx.lpszClassName = lpszClass;
    wcx.lpszMenuName = NULL;
    wcx.style = 0;
 
    RegisterClassEx( &wcx );
 
    g_hWnd = hWnd = CreateWindowEx( 0, wcx.lpszClassName, "해와달", WS_POPUP | WS_VISIBLE,
         0, 0, 800, 600, NULL, NULL, hInstance, 0 );
 
    if( !hWnd )
    {
        MessageBox( NULL, "창만들기 쫑", 0, 0 );
        return 0;
    }
 
    if( !GameInit() )
    {
        MessageBox( NULL, "초기화 쫑", 0, 0 );
        return 0;
    }
 
    MSG msg;    

 ZeroMemory( &msg, sizeof( MSG ) ); 

 //
 
    while( 1 )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            if( msg.message == WM_QUIT )
                break;
 
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }

  GameMain();

  // 현재시간 구해서 ( g_dwOldTime - g_NowTime ) 구하기.. 
        g_dwNowTime = GetTickCount();
    }
 
    GameShutdown();

    return 0;
}

// WndProc
LRESULT WINAPI WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
 //
 PAINTSTRUCT ps; 
 static char str[20];
 static char str1[20];
 static char str2[25];
 static char strTime[10];
 static char strStage[10];
 static char strMouseMovedToCharacter[ 30 ];
 RECT rt = { 10 , 60 , 160 , 80 };

 // 마우스 위치
 static int nX;
 static int nY;

 switch( Msg )
    {
  case WM_CREATE :
   // 게임 초기화
   GameInit();
   break;

  case WM_TIMER :   
   switch( wParam )
   {
    case 1 :  // 호랑이 달리기
     HORANG.nLeftX += HORANG.nSpeed;
     InvalidateRect( g_hWnd , NULL , false );
     break;

    case 2 :  // 게임 시간 1초단위로
     if( ( g_dwOldTime - g_dwNowTime ) > 1000 )
     {
      // 전위 연산자로 --g_nGameTime 해줘야 시간 이미지 출력과 차이가 없다.
      wsprintf( strTime , " Time = %d " , --g_nGameTime );
     }     
     InvalidateRect( hWnd , &g_RectTime , false );
     break;

    case 3 :  // 주인공 점프할때 움직임     
     // 땅과 주인공의 바닥 사이의 차가 점프가능높이 보다 작고 플래그가 참
     if( ( GROUND - ( OPPA.nLeftY + OPPA.nRightY ) <= OPPA.nJumpHeight ) &&
      ( g_bOnUpJumping == true ) )
     {
      OPPA.nLeftY -= OPPA.nJumpSpeed; // 위로
     }
     else if( ( OPPA.nLeftY + OPPA.nRightY ) <= GROUND )
     {
      g_bOnUpJumping = false;
      OPPA.nLeftY += OPPA.nJumpSpeed; // 아래로
      
      // 주인공의 밑면이 땅보다 더 밑으로 내려갔으면
      if( ( OPPA.nLeftY + OPPA.nRightY ) >= GROUND )
      {
       g_bOnJumping = false;   // 점프가 끝났다 다시 점프 할 수 있게.
       OPPA.nLeftY = GROUND - OPPA.nRightY;
      }
     }     
     break;
    // 
   }
   break;

  case WM_LBUTTONDOWN :
   // 캐릭터 선택 화면에서
   if( g_nLogoState == 4 )
   {
    nX = LOWORD( lParam );
    nY = HIWORD( lParam );
    // 오빠 그림 영역 : ( 100 , 100 , 350 , 400 )    
    if( ( nX > 100 && nX < 350 ) && ( nY > 100 && nY < 400 ) )
    {
     // 오빠 그림을 밝게보여준다..??? 선택한효과 내기..
     g_nSelectedCharacter = 1; // 오빠 선택
     MessageBox( hWnd , "sdfsdf" , "오빠선택" , MB_OK );
     g_nLogoState++;     
    }
    // 동생 그림 영역 : ( 450 , 100 , 700 , 400 )
    if ( ( nX > 450 && nX < 700 ) && ( nY > 100 && nY < 400 ) )
    {
     // 동생선택한효과 내기..
     g_nSelectedCharacter = 2; // 동생 선택
     MessageBox( hWnd , "sdfsdf" , "동생선택" , MB_OK );
     g_nLogoState++;     
    }
    //    
   } 
  
  case WM_MOUSEMOVE : 
   // 캐릭터 선택 화면에서
   if( g_nLogoState == 4 )
   {
    nX = LOWORD( lParam );
    nY = HIWORD( lParam );

    // 오빠 그림 영역 : ( 100 , 100 , 350 , 400 )    
    if( ( nX > 100 && nX < 350 ) && ( nY > 100 && nY < 400 ) )
    {
     // 마우스를 위에 갖다대면 그림을 밝게보여준다..? 등의 선택한효과 내기..      
     g_nMouseMovedToCharacter = 1; // 1이면 오빠
     InvalidateRect( hWnd , &g_RectSelectOppa , false );
    }
    // 동생 그림 영역 : ( 450 , 100 , 700 , 400 )
    else if ( ( nX > 450 && nX < 700 ) && ( nY > 100 && nY < 400 ) )
    {
     // 마우스 갖다댄 효과 내기..
     g_nMouseMovedToCharacter = 2; // 2면 여동생
     InvalidateRect( hWnd , &g_RectSelectDongsang , false );
    }
    else 
    {
     g_nMouseMovedToCharacter = 0; // 여기도 저기도 아니면 0 !
     //InvalidateRect( hWnd , &g_RectSelectDongsang , false );
     //InvalidateRect( hWnd , &g_RectSelectOppa , false );
    }

    // 시험 출력    
    wsprintf( str2 , "( x , y ) = ( %d , %d )" , nX , nY );
    InvalidateRect( g_hWnd , &rt , false );
   }
   break;

  case WM_PAINT :   
   g_hDC = BeginPaint( hWnd , &ps );   

   // 맵 Rendering
   MapRendering();
   
   // 캐릭터 Rendering
   CharacterRendering();
   
   // 캐릭터 선택시에 캐릭터위로 마우스 움직이면,,
   if( g_nLogoState == 4 )
   {
    if( g_nMouseMovedToCharacter == 1 )
    {
     // 대충..
     BitBlt( g_hBackBuffer , 100 , 100 , 200 , 200 , g_MouseMoveToCharacterMemDC[ 0 ] ,
      0 , 0 , SRCCOPY );     
    }
    else if( g_nMouseMovedToCharacter == 2 )
    {
     // 대충..
     BitBlt( g_hBackBuffer , 450 , 100 , 550 , 200 , g_MouseMoveToCharacterMemDC[ 1 ] ,
      0 , 0 , SRCCOPY );
    }
    else
    {
     // BitBlt( g_hDC , 450 , 100 , 550 , 200 , g_BitmapMemDC[ 4 ] , 0 , 0 , SRCCOPY );
    }
   }

   // Effect Rendering 게임 진행중일때..
   if( g_bOnGaming == true && g_nLogoState != 10 && g_nLogoState != 14 &&
    g_nLogoState != 17 )
   {
    EffectRendering();
   }
   
   //////////////////////////////////////////////////////////////
   // 시험 출력
   wsprintf( str , "g_nLogoState = %d" , g_nLogoState );
   TextOut( g_hBackBuffer , 10 , 120 , str , sizeof( str ) );

   wsprintf( str1 , "g_bOnGaming = %d" , g_bOnGaming );
   TextOut( g_hBackBuffer , 10 , 140 , str1 , sizeof( str1 ) );
   
   TextOut( g_hBackBuffer , 300 , 160 , strTime , sizeof( strTime ) );
   
   if( g_nLogoState == 4 )
   {
    TextOut( g_hBackBuffer , 10 , 180 , str2 , sizeof( str2 ) );
   }

   wsprintf( strStage , "Stage = %d" , g_nStage );
   TextOut( g_hBackBuffer , 10 , 200 , strStage , sizeof( strStage ) );

   wsprintf( strMouseMovedToCharacter , "g_nMouseMovedToCharacter = %d " ,
    g_nMouseMovedToCharacter );
   TextOut( g_hBackBuffer , 10 , 220 , strMouseMovedToCharacter , sizeof( strMouseMovedToCharacter ) );
   // 시험출력은 요까이~

   EndPaint( hWnd , &ps );   
   break;

  case WM_KEYDOWN :
    switch( (int) wParam )
    {
    case VK_SPCAE :
       g_Key.Space = true;
       break;
    case VK_LEFF

    }
  

   case WM_KEYUP :
    switch( (int) wParam )
    {
    case VK_SPCAE :
       g_Key.Space = false;
       break;
    case VK_LEFF

    }
    

 

 

   //KeyProcessing( hWnd , wParam ); 
   break;
  //
    }
 
    return DefWindowProc( hWnd, Msg, wParam, lParam );
}

//
int GameInit()
{
 BITMAP OppaBitmap , HorangBitmap;
 BITMAP S_OppaBitmap , S_HorangBitmap;
 BITMAP ClockBitmap[ 10 ];

 // Note: 백버퍼 만들기
 HDC hdc = GetDC( g_hWnd );
 g_hBackBuffer = CreateCompatibleDC( hdc );
 HBITMAP hBitmap = CreateCompatibleBitmap( hdc, 800, 600 );
 SelectObject( g_hBackBuffer, (HBITMAP)hBitmap );
 ReleaseDC( g_hWnd, hdc );

  
 // Note: 맵 초기화
 MapRead();

    // Note: 캐릭터 초기화
 //CharRead("cha1.chr");
 CharRead();

 //스프라이트 초기화

 // Effect Init..
 EffectRead();

 //기타 환경 초기화

 // 시간 출력관련정보 초기화하기 

 // 캐릭터 이미지의 크기 알아오기
 GetObject( g_hOppaBitmap , sizeof( BITMAP ) , &OppaBitmap );
 OPPA.nRightX = OppaBitmap.bmWidth;
 OPPA.nRightY = OppaBitmap.bmHeight;

 GetObject( g_hHorangBitmap , sizeof( BITMAP ) , &HorangBitmap );
 HORANG.nRightX = HorangBitmap.bmWidth;
 HORANG.nRightY = HorangBitmap.bmHeight;

 GetObject( g_hSmallBoyBitmap , sizeof( BITMAP ) , &S_OppaBitmap );
 S_OPPA.nRightX = S_OppaBitmap.bmWidth;
 S_OPPA.nRightY = S_OppaBitmap.bmHeight;

 GetObject( g_hSmallBoyBitmap , sizeof( BITMAP ) , &S_HorangBitmap );
 S_HORANG.nRightX = S_HorangBitmap.bmWidth;
 S_HORANG.nRightY = S_HorangBitmap.bmHeight;

 for( int i = 0 ; i < 10 ; i++ )
 {
  GetObject( g_hClockBitmap[ i ] , sizeof( BITMAP ) , &ClockBitmap[ i ] );
  CLOCK.nRightX = ClockBitmap[i].bmWidth;
  CLOCK.nRightX = ClockBitmap[i].bmHeight;
 }
    // Note: 스테이지 별 데이타 초기화

    return 1;
}

//
int GameMain()
{  
 // 데이타 이동
 

 // 실제로 게이머가 조작하는 프레임에서만. g_bOnGaming = true 로
 if( ( g_nLogoState > 5 && g_nLogoState < 10 ) ||
  ( g_nLogoState > 11 && g_nLogoState < 14 ) ||
  ( g_nLogoState >14 && g_nLogoState < 17 ) )
 {
  g_bOnGaming = true;
 }
 else
 {
  g_bOnGaming = false;
 }

 // 게임 진행이 시작되면 게임시간, 호랑이 타이머 시작
 if( g_nLogoState == 5 || g_nLogoState == 11 || g_nLogoState == 14 ) 
 {
  g_hTimerHorang = ( HANDLE )SetTimer( g_hWnd , 1 , 30 , NULL );
  g_hTimerTime = ( HANDLE )SetTimer( g_hWnd , 2 , 1000 , NULL );
  g_dwOldTime = GetTickCount();
 }
 // 게임 진행중이 아닐땐 타이머 즐~
 else if ( g_nLogoState == 10 || g_nLogoState == 14 || g_nLogoState == 17 )
 {
  KillTimer( g_hWnd , 1 );
  KillTimer( g_hWnd , 2 );
 }

 // 프레임이 끝까지 가면
 if( g_nLogoState == FRAMECOUNT )
 {
  PostQuitMessage( 0 );    
 }

    // 충돌 체크
 CollisionCheck();
 
    // 렌더링 은  WM_PAINT에서
 
    return 0;
}

void KeyProcessing( HWND hWnd , WPARAM wParam )
{
 // 대충 이렇게 네모영역 지정해놓고.. 호랑이는 언제 필요할랑가..
 //RECT OppaRect = { OPPA.nBaseX , OPPA.nBaseY , OPPA.nRightX , OPPA.nRightY };
 //RECT HorangRect = { HORANG.nBaseX , HORANG.nBaseY , HORANG.nRightX , HORANG.nRightY }; 
 
 // 게임 스테이지 들어갔을않았을때의 키보드 조작
 if( g_bOnGaming == false )
 {
  switch( wParam )
  {  
   case VK_ESCAPE :  
    PostQuitMessage( 0 );
    break;
   
   case VK_LEFT :    
    break;
   
   case VK_RIGHT :     
    break;

   case VK_UP :  
    break;  
   
   case VK_DOWN :    
    break; 

   // 시험용
   case VK_SPACE :   
    if( ( g_nLogoState != 4 ) )
    {
     g_nLogoState++;
     InvalidateRect( g_hWnd , NULL , false );
    }
    break;
   //
  }
 }
 // 게임 스테이지 들어갔을때의 키보드 조작
 else
 {
  switch( wParam )
  {  
   case VK_ESCAPE :  
    PostQuitMessage( 0 );
    break;
   
   case VK_LEFT :
    // 캐릭터를 왼쪽으로
    OPPA.nLeftX -= OPPA.nSpeed;    
    InvalidateRect( g_hWnd , NULL , false );
    break;
   
   case VK_RIGHT :
    // 캐릭터를 오른쪽으로
    OPPA.nLeftX += OPPA.nSpeed;    
    InvalidateRect( g_hWnd , NULL , false );
    break;

   case VK_UP :
    // 점프
    if( g_bOnJumping == false ) // 점프중에 다시 점프 하지 못하도록
    {
     g_bOnJumping = true;
     g_bOnUpJumping = true;
     g_hTimerOppa = ( HANDLE )SetTimer( g_hWnd , 3 , 30 , NULL );
     if( g_bOnUpJumping == false )
     {
      KillTimer( g_hWnd , 3 );
     }     
    }
    break;  
   
   case VK_DOWN :
    // 점프  머.. 그냥
    //OPPA.nBaseY += OPPA.nSpeed;
    InvalidateRect( g_hWnd , NULL , false );
    break;

   // 시험용
   case VK_SPACE :
    g_nLogoState++;
    InvalidateRect( g_hWnd , NULL , false );
    break; 
  }
 }
 //
}

void MapRead()

 // 로고화면들과 맵.. 
 // 미리 보여주는 순서대로 - 한번에 다 읽어버리자.
 // 읽고 , 메모리디씨에 복사하고.
 g_arrhBitmap[ 0 ] = ( HBITMAP )LoadImage( 0 , "DunkinLogo.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 1 ] = ( HBITMAP )LoadImage( 0 , "GameMain.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 2 ] = ( HBITMAP )LoadImage( 0 , "Story.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 3 ] = ( HBITMAP )LoadImage( 0 , "GameControl.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 g_arrhBitmap[ 4 ] = ( HBITMAP )LoadImage( 0 , "CharacterSelect.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 5 ] = ( HBITMAP )LoadImage( 0 , "kinyang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 // 맵들도 읽어오자.
 g_arrhBitmap[ 6 ] = ( HBITMAP )LoadImage( 0 , "stage1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 7 ] = ( HBITMAP )LoadImage( 0 , "stage2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 8 ] = ( HBITMAP )LoadImage( 0 , "stage3.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 9 ] = ( HBITMAP )LoadImage( 0 , "stage4.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 12 ] = ( HBITMAP )LoadImage( 0 , "stage5.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 13 ] = ( HBITMAP )LoadImage( 0 , "stage6.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 15 ] = ( HBITMAP )LoadImage( 0 , "stage7.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 16 ] = ( HBITMAP )LoadImage( 0 , "stage8.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 // 가운데 호랑이와 주인공의 이야기 
 g_arrhBitmap[ 10 ] = ( HBITMAP )LoadImage( 0 , "BoySays1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 g_arrhBitmap[ 11 ] = ( HBITMAP )LoadImage( 0 , "HorangSays.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 14 ] = ( HBITMAP )LoadImage( 0 , "BoySays2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 17 ] = ( HBITMAP )LoadImage( 0 , "GameEnding1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 18 ] = ( HBITMAP )LoadImage( 0 , "GameEnding2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 // 동생 말은 따로 2장
 g_arrhBitmap[ 19 ] = ( HBITMAP )LoadImage( 0 , "GirlSays1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_arrhBitmap[ 20 ] = ( HBITMAP )LoadImage( 0 , "GirlSays2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION ); 
 //
 for( int i = 0 ; i < FRAMECOUNT + 2; i++ )
 {
  g_BitmapMemDC[ i ] = CreateCompatibleDC( g_hDC );
  g_hOldMapBitmap = ( HBITMAP )SelectObject( g_BitmapMemDC[ i ] , g_arrhBitmap[ g_nLogoState + i ] );
 }
 
 // and so on.......

 
}

void MapRendering()
{
 if( g_nSelectedCharacter == 1 )
 {
  // 오빠 이야기 그림( 10 , 14 )과 호랑이 이야기 그림( 11 ) 랜더링
  if( g_nLogoState == 10 || g_nLogoState == 11 || g_nLogoState == 14 )
  {
   BitBlt( g_hBackBuffer , 0 , 160 , 800 , 600 , g_BitmapMemDC[ g_nLogoState ] , 0 , 0 , SRCCOPY );
  }
  // 기본 그냥 보통 배경 Rendering
  else 
  {
   BitBlt( g_hBackBuffer , 0 , 0 , 800 , 600 , g_BitmapMemDC[ g_nLogoState ] , 0 , 0 , SRCCOPY );
  }
 }
 // 여동생 선택했을때 배경 Rendering ( 오빠 선택했을때는 그냥 순서대로 랜더링 되면 된다. )
 if( g_nSelectedCharacter == 2 )
 {
  if( g_nLogoState == 10 )
  {
   BitBlt( g_hBackBuffer , 0 , 160 , 800 , 600 , g_BitmapMemDC[ 19 ] , 0 , 0 , SRCCOPY );
  }
  else if( g_nLogoState == 11 )
  {
   BitBlt( g_hBackBuffer , 0 , 160 , 800 , 600 , g_BitmapMemDC[ 11 ] , 0 , 0 , SRCCOPY );
  }
  else if( g_nLogoState == 14 )
  {
   BitBlt( g_hBackBuffer , 0 , 160 , 800 , 600 , g_BitmapMemDC[ 20 ] , 0 , 0 , SRCCOPY );
  }
  else // 보통 배경
  {
   BitBlt( g_hBackBuffer , 0 , 0 , 800 , 600 , g_BitmapMemDC[ g_nLogoState ] , 0 , 0 , SRCCOPY );
  }
 } 

 BitBlt( g_hDC , 0 , 0 , 800 , 600 , g_hBackBuffer, 0 , 0 , SRCCOPY );

 //
}


void  CharRead()
{
 // 주인공과 호랑이 이미지 읽고 메모리디씨에 복사
 g_hOppaBitmap = ( HBITMAP )LoadImage( g_hInstance , "Oppa.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_CREATEDIBSECTION | LR_LOADFROMFILE );
 g_hDongsangBitmap = ( HBITMAP )LoadImage( g_hInstance , "Dongsang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_CREATEDIBSECTION | LR_LOADFROMFILE );
 g_hHorangBitmap = ( HBITMAP )LoadImage( g_hInstance , "Horang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_CREATEDIBSECTION | LR_LOADFROMFILE );

 g_OppaMemDC = CreateCompatibleDC( g_hDC );
 g_HorangMemDC = CreateCompatibleDC( g_hDC );
 g_DongsangMemDC = CreateCompatibleDC( g_hDC );

 g_hOldOppaBitmap = ( HBITMAP )SelectObject( g_OppaMemDC , g_hOppaBitmap );
 g_hOldDongsangBitmap = ( HBITMAP )SelectObject( g_DongsangMemDC , g_hDongsangBitmap );
 g_hOldHorangBitmap = ( HBITMAP )SelectObject( g_HorangMemDC , g_hHorangBitmap );

 //
}

void CharacterRendering()

 // 움직이는 캐릭터 영역만 새로 뿌려주기..해야된다.

 // 게임 진행중인 상황에만 캐릭터 출력
 if( g_bOnGaming == true && g_nLogoState != 10 && g_nLogoState != 14 && g_nLogoState != 17 )
 {
  // 호랑이 먼저 보여주고 , 주인공 보여주기
  BitBlt( g_hBackBuffer , HORANG.nLeftX , HORANG.nLeftY , HORANG.nRightX , HORANG.nRightY ,
    g_HorangMemDC , 0 , 0 , SRCCOPY );
  // 오빠
  if( g_nSelectedCharacter == 1 )
  {
   BitBlt( g_hBackBuffer , OPPA.nLeftX , OPPA.nLeftY , OPPA.nRightX , OPPA.nRightY ,
     g_OppaMemDC , 0 , 0 , SRCCOPY );
  }
  // 동생
  if( g_nSelectedCharacter == 2 )
  {
   BitBlt( g_hBackBuffer , OPPA.nLeftX , OPPA.nLeftY , OPPA.nRightX , OPPA.nRightY ,
     g_DongsangMemDC , 0 , 0 , SRCCOPY );
  }
 }

 //
}

void EffectRead()
{
 // 캐릭터 선택때 마우스 위로 갖다댔을때의 효과 읽기

 

 // 축소맵용 이미지 읽기
 g_hSmallBoyBitmap = ( HBITMAP )LoadImage( 0 , "SmallBoy.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hSmallHorangBitmap = ( HBITMAP )LoadImage( 0 , "SmallHorang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hSmallGirlBitmap = ( HBITMAP )LoadImage( 0 , "SmallGirl.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );

 g_SmallCharacterMemDC[ 0 ] = CreateCompatibleDC( g_hDC );
 g_SmallCharacterMemDC[ 1 ] = CreateCompatibleDC( g_hDC );
 g_SmallCharacterMemDC[ 2 ] = CreateCompatibleDC( g_hDC );

 g_hOldSmallBoyBitmap = ( HBITMAP )SelectObject( g_SmallCharacterMemDC[ 0 ] , g_hSmallBoyBitmap );
 g_hOldSmallHorangBitmap = ( HBITMAP )SelectObject( g_SmallCharacterMemDC[ 1 ] , g_hSmallHorangBitmap );
 g_hOldSmallGirlBitmap = ( HBITMAP )SelectObject( g_SmallCharacterMemDC[ 2 ] , g_hSmallGirlBitmap );
 
 //시계 숫자이미지 읽기
 g_hClockBitmap[ 0 ] = ( HBITMAP )LoadImage( 0 , "num0.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 1 ] = ( HBITMAP )LoadImage( 0 , "num1.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 2 ] = ( HBITMAP )LoadImage( 0 , "num2.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 3 ] = ( HBITMAP )LoadImage( 0 , "num3.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 4 ] = ( HBITMAP )LoadImage( 0 , "num4.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 5 ] = ( HBITMAP )LoadImage( 0 , "num5.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 6 ] = ( HBITMAP )LoadImage( 0 , "num6.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 7 ] = ( HBITMAP )LoadImage( 0 , "num7.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 8 ] = ( HBITMAP )LoadImage( 0 , "num8.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hClockBitmap[ 9 ] = ( HBITMAP )LoadImage( 0 , "num9.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );

 for ( int i = 0 ; i < 10 ; i++ )
 {
  g_ClockBitmapMemDC[ i ] = CreateCompatibleDC( g_hDC );
  g_hOldClockBitmap = ( HBITMAP )SelectObject( g_ClockBitmapMemDC[ i ] , g_hClockBitmap[ i ] );
 }

 // 캐릭터 선택시에 마우스 움직일때 효과이미지 읽기
 g_hMouseMoveToBoyBitmap = ( HBITMAP )LoadImage( 0 , "SelectedOppa.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_hMouseMoveToGirlBitmap = ( HBITMAP )LoadImage( 0 , "SelectedDongsang.bmp" , IMAGE_BITMAP , 0 , 0 ,
              LR_LOADFROMFILE | LR_CREATEDIBSECTION );
 g_MouseMoveToCharacterMemDC[ 0 ] = CreateCompatibleDC( g_hDC );
 g_MouseMoveToCharacterMemDC[ 1 ] = CreateCompatibleDC( g_hDC );

 g_hOldMouseMoveToBoyBitmap = ( HBITMAP )SelectObject( g_MouseMoveToCharacterMemDC[ 0 ] , g_hMouseMoveToBoyBitmap );
 g_hOldMouseMoveToGirlBitmap = ( HBITMAP )SelectObject( g_MouseMoveToCharacterMemDC[ 1 ] , g_hMouseMoveToGirlBitmap );
}

void EffectRendering()
{
 int nSmallMapHorangPosition;
 int nSmallMapOppaPosition;

 // 시간 뿌려줄 정보 계산.
 // 시간은 총 두자리니깐 10으로 나누면 첫째자리가 나머지로 남겠지..
 g_nGameTimeOneCount = g_nGameTime % 10;
 // 시간의 십의 자리숫자는.. 현재 시간에서 일의 자리 숫자를 빼준다음 10으로 나눠주면되겠지.. ㅎㅎ
 g_nGameTimeTenCount = ( g_nGameTime - g_nGameTimeOneCount ) / 10 ; 

 // g_nLogoState 와 g_nStage 사이의 관계
 switch( g_nLogoState )
 { 
  case 10 :   
  case 11 :
   g_nStage = 4;
   break;
  case 12 :
   g_nStage = 5;
   break;
  case 13 :
   g_nStage = 6;
   break;
  case 14 :
   g_nStage = 6;
   break;
  case 15 :
   g_nStage = 7;
   break;
  case 16 :
   g_nStage = 8;
   break;
  default :
   g_nStage = g_nLogoState - 5; // 스테이지 번호( g_nLogoState 가 6일때 g_nStage 값은 1 )
   break;
 }
 

 // 축소맵에서의 위치 .. 다시 계산...
 // 전체맵 8장 * 한장에 가로가 800픽셀이니까 전체 6400 픽셀
 // 축소맵 길이는 500 ~ 700까지 200 픽셀로 잡고 , 200 / 6400 하면 1/32 가 나온다..
 nSmallMapHorangPosition = ( ( ( g_nStage * 800 ) + HORANG.nLeftX ) / 32 );
 nSmallMapOppaPosition = ( ( ( g_nStage * 800 ) + OPPA.nLeftX ) / 32 );

 if( g_bOnGaming == true && g_nLogoState != 10 && g_nLogoState != 14 && g_nLogoState != 17 )
 {
  // 호랑이 먼저 양념하고~
  BitBlt( g_hBackBuffer , S_HORANG.nLeftX + nSmallMapHorangPosition , S_HORANG.nLeftY ,
    S_HORANG.nRightX , S_HORANG.nRightY , g_SmallCharacterMemDC[ 1 ] , 0 , 0 , SRCCOPY );

  // 축소맵 뿌려주기~
  if( g_nSelectedCharacter == 1 )  // 오빠
  {
   BitBlt( g_hBackBuffer , S_OPPA.nLeftX + nSmallMapOppaPosition , S_OPPA.nLeftY ,
    S_OPPA.nRightX , S_OPPA.nRightY , g_SmallCharacterMemDC[ 0 ] , 0 , 0 , SRCCOPY );
  }
  else        // 동생
  {
   BitBlt( g_hBackBuffer , S_OPPA.nLeftX + nSmallMapOppaPosition , S_OPPA.nLeftY ,
    S_OPPA.nRightX , S_OPPA.nRightY , g_SmallCharacterMemDC[ 2 ] , 0 , 0 , SRCCOPY );
  } 
 }
  
 
 // 시간 출력..//////////////////////////////////////////////////////////////////////////////////  
 // 십자리수 출력.
 BitBlt( g_hBackBuffer , CLOCK.nLeftX , CLOCK.nLeftY , CLOCK.nRightX + CLOCK.nLeftX ,
  CLOCK.nRightY + CLOCK.nLeftY , g_ClockBitmapMemDC[ g_nGameTimeTenCount ] , 0 , 0 , SRCCOPY );
 // 일자리수 출력.
 BitBlt( g_hBackBuffer , CLOCK.nLeftX + 45 , CLOCK.nLeftY , CLOCK.nRightX + CLOCK.nLeftX + 45 ,
  CLOCK.nRightY + CLOCK.nLeftY , g_ClockBitmapMemDC[ g_nGameTimeOneCount ] , 0 , 0 , SRCCOPY );

 
 
 //
}

void ChangeScreenMode()
{

}

//
void GameShutdown()
{
    // Note: map 데이타 해제

 // 없애기 이렇게 없애는게 맞는가..모르겠다.
 SelectObject( g_OppaMemDC , g_hOldOppaBitmap );
 DeleteObject( g_hOppaBitmap );
 DeleteDC( g_OppaMemDC );
 
 SelectObject( g_HorangMemDC , g_hOldHorangBitmap );
 DeleteObject( g_hHorangBitmap );
 DeleteDC( g_HorangMemDC );

 SelectObject( g_BitmapMemDC[ g_nLogoState ] , g_hOldMapBitmap );
 DeleteObject( g_arrhBitmap[ g_nLogoState ] );
 DeleteDC( g_BitmapMemDC[ g_nLogoState ] );  

 // Note: 캐릭터 해제

 // 등등 메모리 해제.
 KillTimer( g_hWnd , 2 );
}

void CollisionCheck()
{
 int HorangOffset;

 // 주인공 움직임
 // 주인공이 오른쪽 끝까지 가면 다음 프레임으로
 if( OPPA.nLeftX > RIGHTSIDE )
 {
  g_nLogoState++;  
  OPPA.nLeftX = LEFTSIDE;
  // 주인공이 다음 프레임으로 넘어갈때 ( RIGHTSIDE - 호랑이위치 )의 값을 빼준다
  // 남은거리만큼 다음 프레임에선 뒤쳐져 올 수 있도록
  HorangOffset = RIGHTSIDE - HORANG.nLeftX;
  HORANG.nLeftX = 0;
  HORANG.nLeftX = HORANG.nLeftX - HorangOffset;
  InvalidateRect( g_hWnd , NULL , false );
 }

 // 호랑이 움직임
 if( HORANG.nLeftX > RIGHTSIDE )
 {  
  HORANG.nLeftX = LEFTSIDE;
  InvalidateRect( g_hWnd , NULL , false );
 }

 // 주인공이 왼쪽까지 가면 더 못가도록
 if( OPPA.nLeftX < LEFTSIDE )
 {
  OPPA.nLeftX = 0;
 }

 // 기본 땅보다 밑으로 못내려가도록
 if( OPPA.nRightY > GROUND )
 {
  OPPA.nRightY = GROUND;
 }

 //

 
 // 호랑이에게 잡히면 땡
 if( HORANG.nLeftX + HORANG.nRightX > OPPA.nLeftX )
 {
  if( MessageBox( g_hWnd , "잡혔다~ 끝낼려면 YES" , "ㅇㄹㅇㄹ" , MB_YESNO ) == IDYES )
  {
   PostQuitMessage( 0 );
   exit( 0 );
  }
 }
 

 //
}

 

 

'- 음악과 나 - > 『 짬 통 』' 카테고리의 다른 글

cd 데이터 포맷.  (0) 2006.05.29
cd ripping 관련 소스  (0) 2006.05.29
뎁퍄 질답들. 음악관련 주제들.  (0) 2006.05.22
vc6 팁들  (0) 2006.05.18
저수준 제어를 이용한 WAVE 재생 - 피크메타 제작  (0) 2006.05.18