저번 사각형 창 띄우기에서 더 나가서 창 테두리는 HPEN을 통해 HBRUSH를 통해 사각형 내부를 채우는 코드를 작성했다.
참고로 운영체제 공부도 하면서 글을 조금씩 작성하는데 같이보면 WinAPI의 용어와 어떤 느낌으로 이 코드를 제공하는지 이해하기 편한거 같습니다~
그러면 마우스 좌표를 받고 싶다 WM_LBUTTONDOWN 의 case문에 추가하여 lParam 매개변수를 받으면 된다. 자세한건 항상 MSDN을 찾아보면 된다. 참고로 lParam은 마우스를 wParam은 키보드의 입력을 받는 매개변수다.
그렇다면 오브젝트를 그리고 키를 입력해서 움직이고 싶다면 먼저 오브젝트의 위치를 좌표로 얻는 방법을 연습해야 한다.
POINT 구조체는 f12를 눌러 코드상에서 직접 확인하고 우선 이런식으로 전역 변수를 선언한다.
오브젝트의 위치는 말 그대로 오브젝트의 중심 위치를 의미한다. 아직 이걸 클라이언트 좌표로 가져오지 않았다.
그 후 기존에 Rectangle 함수를 다음과 같이 수정한다. 여기서 수학적 센스가 필요한데 좌상단이 (0,0)이고 x축은 오른쪽으로 갈수록 증가하고 y축은 아래로 내려올수록 증가한다고 이전 글에서 언급했다.
그렇다면 오브젝트를 이 클라이언트 영역에 그리고 싶다면 사각형의 4개의 모서리의 좌표를 얻어야 하는데 다음 그림처럼a, b, c, d의 위치를 구해야 한다. 오브젝트 좌표 중앙(500, 500)이고 오브젝트 크기는 (100, 100)이라 가정했다.
Recttangle은 순서대로 왼쪽, 위, 오른쪽, 아래를 입력 받는다.
왼쪽은 x축을 기준으로 오브젝트의 x 위치 - (내 크기 / 2), 오른쪽은 오브젝트의 x 위치 기준 + (내 크기 / 2)
여기서 상단은 y축을 기준으로 오브젝트의 y위치 - (내 크기 / 2), 하단은 오브젝트의 y위치 기준 + (내 크기 / 2)다. 왜 상단은 빼고 하단은 더하느냐 위 예시 이미지를 보면 알겠지만 클라이언트 좌표 기준은 좌상단이 (0,0)으로 내려올수록 y가 증가하기 때문이다! (Unity나 Unreal을 해본사람이라면 오브젝트 공간에서 스크린 좌표로 가져온다고 생각하자)
그러면 키보드의 Up키를 눌렀을 때 y축으로 이동시키는 코드를 만들고 실행하면 작동이 될까? (참고로 y축 왜 마이너스냐면 좌표 생각하면 위로 올라가려면 y는 감소해야 한다. 나 자신아... 이제 이정도 말했으면 디폴트로 이해될거라 믿는다)
정답은 작동은 되지만 창을 내렸다 올려야 된다. 왜 실시간으로 변하지 않느냐? 전역 변수의 값은 변했지만 움직인 좌표 기반 새롭게 그리는 코드가 없기 때문이다.
따라서 case VK_UP 내부에 InvalidateRect(hWnd, NULL, false); 를 해서 실행하면 무효화 영역을 발생시켜 계속 그려주는 역할을 하는데 먼저 false로 해서 보면 이동 경로가 남는다. 이는 이전 픽셀에 값이 박혀있기에 true로 해줘야 새로 지우면서 그리는 것이다.
이제 이 개념을 이용해 상하좌우 움직이는 코드를 작성하고 실행하면 마치 게임속 캐릭터를 조작하는 느낌이 든다!
게임에서 키를 한번 꾸욱 누르고 있을 경우 움직이면 중간에 끊기는 느낌이 든다. 게임에서 이래도 되는걸까? 한번 고민해보면서 오늘은 여기서 공부를 끝내고자 한다...
'WinAPI 32' 카테고리의 다른 글
06 WinAPI) Singleton (0) | 2023.11.12 |
---|---|
05 WinAPI) PeekMessage (0) | 2023.11.11 |
03 WinAPI) 핸들과 DC(1) (0) | 2023.11.09 |
02 WinAPI) 기본(2) (0) | 2023.11.07 |
01 WinAPI) 기본(1) (0) | 2023.11.06 |