//
// 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 |