본문 바로가기

Programming/Mgr

Key 매니져

매니져는 여러 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->"함수명" 식으로 사용하면 된다.