Input과 Timer

ㅋㅋ·2022년 7월 19일
0

DirectX12강의

목록 보기
10/39

카메라나 객체를 이동시키기 위하여 유저의 입력을 받는 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*>(&currentCount));

	_deltaTime = (currentCount - _prevCount) / static_cast<float>(_frequency);
	_prevCount = currentCount;

	...
}

이전 저장된 Counter에서 현재 Counter 값을 뺀 후 Frequency로 나누어

이전 프레임에서 현재 프레임까지 지나간 시간을 구할 수 있다.

0개의 댓글