매니져는 여러 Class에서 공통적으로 쓰이며 어떠한 것을 관리해주는 클래스를 말한다 이러한 클래스를 쉽게 사용하기 위해 싱글톤 패턴을 활용하여 만든 후 #define 을 통해 사용한다.
KeyMgr.h
#pragma once const int KEYMAX = 256; // 넉넉하게 255를 잡았지만 109키 키보드와 마우스 2버튼을 포함한 111로 잡아도 무관 class cKey { private: static cKey* m_pInstance; // 클래스 포인터 bool m_bKeyDown[KEYMAX]; // 키가 눌렸는지 체크할 배열 bool m_bKeyUp[KEYMAX]; // 키가 떼졌는지 체크할 배열 private: cKey(void); public: ~cKey(void); static cKey* GetInst(void); // 인스턴스 생성 void FreeInst(void); // 인스턴스 파괴 bool StayKeyDown( INT nKey );// 키가 눌리고 있는지 체크 bool OnceKeyDown( INT nKey );// 키가 한번 눌렸는지 체크 bool OnceKeyUp( INT nKey ); // 키가 한번 눌렸다 떼졌는지 체크 bool IsToggleKey( INT nKey );// 한번 눌릴때마다 on off로 바뀜 };
KeyMgr.cpp
#include "KeyMgr.h"
cKey *cKey::m_pInstance = NULL; // 스태틱 맴버변수는 클래스 내에서 초기화 할 수 없어 밖에서 초기화 하도록 한다.
cKey::cKey(void)
{
ZeroMemory( m_bKeyDown, KEYMAX );
ZeroMemory( m_bKeyUp, KEYMAX );
// 키 버퍼들을 초기화 시킨다.
}
cKey::~cKey(void)
{
}
cKey* cKey::GetInst(VOID)
{
// 싱글톤 패턴을 사용함
if( m_pInstance == NULL )
{
m_pInstance = new cKey;
RSCMGR->m_bKEY_MGR = true;
}
return m_pInstance;
}
VOID cKey::FreeInst(VOID)
{
if( m_pInstance != NULL )
{
delete m_pInstance;
m_pInstance = NULL;
RSCMGR->m_bKEY_MGR = false;
}
}
// 계속 눌리는지
bool cKey::StayKeyDown( INT nKey )
{
if( GetAsyncKeyState( nKey ) & 0x8000 )
{
return TRUE;
}
return FALSE;
}
// 한번만 눌리는지 체크
bool cKey::OnceKeyDown( INT nKey )
{
if( GetAsyncKeyState( nKey ) & 0x8000 )
{
// 눌리는 순간 true
if( m_bKeyDown[nKey] == false )
{
m_bKeyDown[nKey] = true;
return TRUE;
}
}
else
{
// 떼는 순간 false
m_bKeyDown[nKey] = false;
}
return FALSE;
}
// 한번 눌렸다가 띄어지는지 체크
bool cKey::OnceKeyUp( INT nKey )
{
if( GetAsyncKeyState( nKey ) & 0x8000 )
{
m_bKeyUp[nKey] = true;
}
else
{
// 눌려진 순간 true가 되므로 true일때만 진입
if( m_bKeyUp[nKey] == true )
{
// 키상태를 false로 만들어 재진입 불가
m_bKeyUp[nKey] = false;
return TRUE;
}
}
return FALSE;
}
// 토글키
bool cKey::IsToggleKey( INT nKey )
{
if( GetKeyState(nKey) & 0x0001 ) // GetKeyState의 0x0001 은 이전에 눌렸는가 를 체크한다.
{
return TRUE;
}
return FALSE;
}
이 소스를 다운받아 사용하고 싶은 경우
사용할 메인 헤더파일에
#include "KeyMgr.h" #define KEYMGR ( cKey::GetInst() ) // 키 매니저
를 추가한 후 KEYMGR->"함수명" 식으로 사용하면 된다.
'Programming > Mgr' 카테고리의 다른 글
상태패턴을 활용한 Game Scene 변경 매니져 - 2 (0) | 2013.12.03 |
---|---|
상태패턴을 활용한 Game Scene 변경 매니져 (0) | 2013.11.30 |