|
#include "Game.h"
int CGame::GetClientPos() { pt.x = 0; pt.y = 0;
ClientToScreen(hWnd, &pt); // 클라이언트 영역의 화면 좌표를 구해온다. GetClientRect(hWnd, &ClientRect); // 클라이언트 렉트를 구한다. return 0; }
int CGame::Init(HWND m_hWnd, HINSTANCE m_hInst) { hWnd = m_hWnd; hInst = m_hInst;
// DirectDraw 객체 생성. if( FAILED(DirectDrawCreateEx(NULL, (LPVOID*)&lpdd, IID_IDirectDraw7, NULL)) ) return ERR; if( FAILED(lpdd->SetCooperativeLevel(hWnd, DDSCL_NORMAL)) ) return ERR; // 프라이머리 서페이스 생성. memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; if( FAILED(lpdd->CreateSurface(&ddsd, &lpddSPrimary, NULL)) ) return ERR;
// DirectInput 객체 생성. if( FAILED(DirectInputCreate(hInst, DIRECTINPUT_VERSION, &lpdi, NULL)) ) return ERR; if( FAILED(lpdi->CreateDevice(GUID_SysKeyboard, &lpdiKbd, NULL)) ) return ERR; if( FAILED(lpdiKbd->SetDataFormat(&c_dfDIKeyboard)) ) return ERR; if( FAILED(lpdiKbd->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE|DISCL_BACKGROUND)) ) return ERR;
bPause = false; if( SetAcquire() == ERR) return ERR; lstrcpy(str, "메롱");
Text.X = 0; Text.Y = 0; PreText.X = 1; PreText.Y = 1; GetClientPos(); // 클라이언트의 화면상 위치를 구한다.
return 0; }
int CGame::SetAcquire() { if( bPause ) { if( FAILED(lpdiKbd->Unacquire()) ) return ERR; } else { if( FAILED(lpdiKbd->Acquire()) ) return ERR; }
return 0; }
int CGame::GetInput() { if( FAILED(lpdiKbd->GetDeviceState(sizeof(KeyState), (LPVOID)KeyState)) ) return ERR; if( DIKEYDOWN(KeyState, DIK_ESCAPE) ) { bPause = true; return ERR; }
// 방향키 입력 처리 멀티키 입력도 가능. if( DIKEYDOWN(KeyState, DIK_LEFT) ) Text.X -= (Text.X < Movement)? 0 : Movement; if( DIKEYDOWN(KeyState, DIK_RIGHT) ) Text.X += (Text.X >= RLimit-Movement)? 0 : Movement; if( DIKEYDOWN(KeyState, DIK_UP) ) Text.Y -= (Text.Y < Movement)? 0 : Movement; if( DIKEYDOWN(KeyState, DIK_DOWN) ) Text.Y += (Text.Y > BLimit-Movement)? 0 : Movement;
return 0; }
int CGame::Main() { if( GetInput() == ERR ) return ERR;
// 만약 문자열이 이동하지 않았다면, if( Text.X == PreText.X && Text.Y == PreText.Y ) return 0; // 그려주지 않고 리턴한다.
lpddSPrimary->GetDC(&hDC);
// 이전 위치의 문자열을 지워주고, SelectObject(hDC, GetStockObject(BLACK_PEN)); SelectObject(hDC, GetStockObject(BLACK_BRUSH));
Rectangle(hDC, pt.x + PreText.X, pt.y + PreText.Y, pt.x + PreText.X+lstrlen(str)*8, pt.y + PreText.Y+15); // 문자열을 그려준다. SetBkColor(hDC, RGB(0, 0, 0)); SetTextColor(hDC, RGB(255, 255, 0)); TextOut(hDC, pt.x+Text.X, pt.y+Text.Y, str, lstrlen(str));
lpddSPrimary->ReleaseDC(hDC);
Sleep(50);
// 문자열의 이전위치 기억. PreText.X = Text.X; PreText.Y = Text.Y;
return 0; }
int CGame::Shutdown() { SetAcquire();
SAFERELEASE( lpdiKbd ); SAFERELEASE( lpdi ); SAFERELEASE( lpddSPrimary ); SAFERELEASE( lpdd );
return 0; } |