KoreanFoodie's Study

윈도우 API 프로그래밍 9 : 키매니저(키 입력 받기), bitset 예제 본문

Game Dev/윈도우 API

윈도우 API 프로그래밍 9 : 키매니저(키 입력 받기), bitset 예제

GoldGiver 2021. 10. 17. 21:48

게임클래스의 하민우 교수님 강좌를 듣고 기억할 만한 내용을 리마인드하는 글입니다


윈도우 API 프로그래밍 9 : 키매니저(키 입력 받기), bitset 예제

이번 글에서는 싱글톤 패턴을 이용해서 키 입력을 받는 방법과 간단한 bitset 메소드를 이용해 보겠다.

SingletonBase.h

먼저, 싱글톤 클래스를 이용할 템플릿 클래스인 SingletonBase.h를 정의해 보았다.

#pragma once
/*
싱글톤 패턴 : 단일 객체 관리 방법
- 인스턴스를 호출 시 처음 호출 하는 경우 인스턴스를 생성하고 생성 된 인스턴스를 반환 한다.
- 인스턴스를 호출 시 이전에 호출되어 생성이 되어 있는 경우 그 생성 되어 있는 인스턴스를 반환 한다.

템플릿(Template, 형판) : 함수 또는 클래스를 만들어 내기 위한 틀
- 정해지지 않은 자료형에 대한 선언을 템플릿을 사용하여 하고 기능을 구현한다.
- 함수 또는 클래스 작성시 템플릿에 사용 될 자료형을 결정해준다.
*/

template <typename T> // template <class T>
class SingletonBase
{
protected:
	static T* Instance;

	SingletonBase() {};
	~SingletonBase() {};

public:
	static T* GetInstance();	// 싱글톤 인스턴스 가져오기(생성)
	void ReleaseInstance();		// 싱글톤 인슨턴스 해제하기
};

// 싱글톤 초기화
template<typename T>
T* SingletonBase<T>::Instance = NULL;

template<typename T>
inline T * SingletonBase<T>::GetInstance()
{
	if (!Instance)
		Instance = new T;

	return Instance;
}

template<typename T>
inline void SingletonBase<T>::ReleaseInstance()
{
	if (Instance)
	{
		delete Instance;
		Instance = NULL;
	}
}

그 후, SingletonBase.h를 상속한 KeyManager 클래스를 생성한다.

 

KeyManager.h

실제 키의 입력을 받을 때는 bitset을 이용한다.

#pragma once
#include "SingletonBase.h"
#include <bitset>

using namespace std;

/*
bitset : bool 타입을 담고 있는 자료구조(컨테이너)

set() : bit 모두 1로 설정
reset() : bit 모두 0으로 설정
set(i, value) : i번째 값을 value로 설정
[] : 배열 형태의 접근이 가능 ex) bit[10] = false;
flip() : bit 값 전환 0 -> 1, 1 -> 0

all() : 모든 비트가 1일 때 트루 반환
none() : 모든 비트가 0일 때 트루 반환
any() : 1개라도 1이면 트루 반환
count() : 값이 1로 셋팅 된 비트의 갯수 반환
*/

#define g_pKeyManager KeyManager::GetInstance()

#define KEYMAX 256

class KeyManager : public SingletonBase<KeyManager>
{
private:
	bitset<KEYMAX> m_bitKeyUp;
	bitset<KEYMAX> m_bitKeyDown;

public:
	void Setup();			// 키 매니져 초기화

	bool isOnceKeyDown(int key);	// 키가 한번 눌림
	bool isOnceKeyUp(int key);		// 키를 눌렀다 땜
	bool isStayKeyDown(int key);	// 키를 누르고 있음
	bool isToggleKey(int key);		// 토글키(키를 키고 끔)
};

 

KeyManager.cpp

실제 메소드를 구현한다. 이때, GetAsynKeyState를 이용해서키 입력을 받는 것을 기억하자.

#include "stdafx.h"
#include "KeyManager.h"


void KeyManager::Setup()
{
	m_bitKeyUp.reset();
	m_bitKeyDown.reset();
}

bool KeyManager::isOnceKeyDown(int key)
{
	if (GetAsyncKeyState(key) & 0x8000)
	{
		// 키가 이전에 눌리지 않은 상태
		if (!m_bitKeyDown[key])
		{
			// 눌린 상태로 변환
			m_bitKeyDown.set(key, true);
			return true;
		}
	}
	else
	{
		m_bitKeyDown.set(key, false);
	}

	return false;
}

bool KeyManager::isOnceKeyUp(int key)
{
	if (GetAsyncKeyState(key) & 0x8000)
	{
		m_bitKeyUp.set(key, true);
	}
	else
	{
		// 키가 눌렀다가 땠을 때
		if (m_bitKeyUp[key])
		{
			// 눌린 상태로 변환
			m_bitKeyUp.set(key, false);
			return true;
		}
	}

	return false;
}

bool KeyManager::isStayKeyDown(int key)
{
	if (GetAsyncKeyState(key) & 0x8000) return true;
	return false;
}

bool KeyManager::isToggleKey(int key)
{
	if (GetAsyncKeyState(key) & 0x0001) return true;
	return false;
}

 


더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

Comments