카메라나 객체를 이동시키기 위하여 유저의 입력을 받는 Input
시간과 프레임 간의 시간차를 알기 위한 Timer
enum class KEY_TYPE
{
UP = VK_UP,
DOWN = VK_DOWN,
LEFT = VK_LEFT,
RIGHT = VK_RIGHT,
W = 'W',
A = 'A',
S = 'S',
D = 'D',
};
VK_ 접두사가 붙은 변수는 윈도우에서 정의된 변수임 (WinUser.h)
void Input::Init(HWND hwnd)
{
_hwnd = hwnd;
...
}
Input 클래스를 생성 시 윈도우 핸들을 받아 현재 게임 창이 활성화 되었을 때의 입력만 처리
void Input::Update()
{
...
BYTE asciiKeys[KEY_TYPE_COUNT] = {};
if (::GetKeyboardState(asciiKeys) == false)
return;
for (uint32 key = 0; key < KEY_TYPE_COUNT; key++)
{
if (asciiKeys[key] & 0x80)
{
KEY_STATE& state = _states[key];
if (state == KEY_STATE::PRESS || state == KEY_STATE::DOWN)
state = KEY_STATE::PRESS;
else
state = KEY_STATE::DOWN;
}
else
{
KEY_STATE& state = _states[key];
if (state == KEY_STATE::PRESS || state == KEY_STATE::DOWN)
state = KEY_STATE::UP;
else
state = KEY_STATE::NONE;
}
}
}
GetKeyboardState 함수로 반환된 데이터와 비트 연산을 통하여 키 눌림을 판별
void Timer::Init()
{
::QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&_frequency));
::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&_prevCount));
}
Timer 클래스 생성 시 CPU의 Frequency와 Counter를 저장해둔다.
CPU를 클럭을 통하여 지나간 시간을 계산
void Timer::Update()
{
uint64 currentCount;
::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(¤tCount));
_deltaTime = (currentCount - _prevCount) / static_cast<float>(_frequency);
_prevCount = currentCount;
...
}
이전 저장된 Counter에서 현재 Counter 값을 뺀 후 Frequency로 나누어
이전 프레임에서 현재 프레임까지 지나간 시간을 구할 수 있다.