KoreanFoodie's Study

윈도우 API 프로그래밍 3 : 키 입력과 게임 업데이트 본문

Game Dev/윈도우 API

윈도우 API 프로그래밍 3 : 키 입력과 게임 업데이트

GoldGiver 2021. 10. 15. 08:21

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


윈도우 API 프로그래밍 3 : 키 입력과 게임 업데이트

이번 글에서는 WIM_KEYDOWN을 통한 키 입력에 대해 알아보도록 한다.

 

키 입력 처리하기

	case WM_CREATE:		// 프로그램이 실행 될 때 한번 호출 된다. (초기화)
		SetTimer(hWnd, 1, 10, NULL);
		break;
	case WM_TIMER:		// 타이머에 의해서 호출
		InvalidateRect(hWnd, NULL, true);
		break;
	case WM_KEYDOWN:	// 키 입력이 있을 때 마다 호출 된다.
		switch (wParam)
		{
			// 삼항식 (조건) ? 참일 때 : 거짓일 때
		case 'A': case VK_LEFT:
			ptPos.x -= (ptPos.x > 0) ? 1 : 0;
			break;
		case 'D': case VK_RIGHT:
			ptPos.x += (ptPos.x < 15) ? 1 : 0;
			break;
		case 'W': case VK_UP:
			ptPos.y -= (ptPos.y > 0) ? 1 : 0;
			break;
		case 'S': case VK_DOWN:
			ptPos.y += (ptPos.y < 8) ? 1 : 0;
			break;
		}
		break;

키 입력은 WM_KEYDOWN에서 처리하는데, 삼항식 조건을 잘 보면 ptPos라는 POINT를 다룸에 있어서 화면 밖으로 나가지 않도록 처리한 것을 확인할 수 있다.

WM_TIMER에서는 타이머를 다루며 갱신할 부분을 넣게 되는데, WM_CREATE에서 초기화 시, SetTimer(hWnd, 1, 10, NULL); 에서 1초에 100번 갱신함을 알 수 있다. (1000 / 세번째 인자) -> 1초에 갱신하는 횟수

 

실제로 그리기

    case WM_PAINT:
        {
            PAINTSTRUCT ps;

            HDC hdc = BeginPaint(hWnd, &ps);

			int roomSize = WINSIZEY / 9;

			for (int i = 0; i < 10; i++)
			{
				MoveToEx(hdc, 0, i * roomSize, NULL);
				LineTo(hdc, WINSIZEX, i * roomSize);
			}

			for (int i = 0; i < 17; i++)
			{
				MoveToEx(hdc, i * roomSize, 0, NULL);
				LineTo(hdc, i * roomSize, WINSIZEY);
			}

			int ptX = ptPos.x * roomSize;
			int ptY = ptPos.y * roomSize;

			Rectangle(hdc, ptX + 10, ptY + 10, ptX + roomSize - 10, ptY + roomSize - 10);

            EndPaint(hWnd, &ps);
        }
        break;

PAINTSTRUCT 와 HDC는 자동 생성되는 코드이니 넘어가자. 

이전 글처럼, 격자를 그리는 것은 동일하지만, 그 후에 roomSize를 계산하여 격자 내부에 사각형을 넣어 주었다.

그리고 WM_KEYDOWN을 통해 ptPos를 변경시켰으므로, 우리는 키를 움직일 때마다 사각형이 격자를 이동하는 것을 확인할 수 있다!

 


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

 

Comments