KoreanFoodie's Study
윈도우 API 프로그래밍 9 : 키매니저(키 입력 받기), bitset 예제 본문
윈도우 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;
}
더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!
'Game Dev > 윈도우 API' 카테고리의 다른 글
윈도우 API 프로그래밍 10 : 백버퍼와 픽 메시지 (0) | 2021.10.17 |
---|---|
윈도우 API 프로그래밍 8 : 객체 지향적인 윈도우 API 프로그래밍 (0) | 2021.10.15 |
윈도우 API 프로그래밍 7 : 게임 프레임워크 구성 (0) | 2021.10.15 |
윈도우 API 프로그래밍 6 : 간단한 UI 구현과 똥피하기 게임 예제 (0) | 2021.10.15 |
윈도우 API 프로그래밍 5 : 물체 떨어뜨리기 (간단한 똥피하기 게임 예제) (0) | 2021.10.15 |
Comments