KoreanFoodie's Study

윈도우 API 프로그래밍 5 : 물체 떨어뜨리기 (간단한 똥피하기 게임 예제) 본문

Game Dev/윈도우 API

윈도우 API 프로그래밍 5 : 물체 떨어뜨리기 (간단한 똥피하기 게임 예제)

GoldGiver 2021. 10. 15. 09:49

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


윈도우 API 프로그래밍 5 : 물체 떨어뜨리기

이번 글에서는 간단한 물체를 떨어뜨리는 기능을 구현하며 다른 디테일을 설명한다.

 

WM_CREATE

	case WM_CREATE:		// 프로그램이 실행 될 때 한번 호출 된다. (초기화)
		SetTimer(hWnd, 1, 10, NULL);
		srand(time(NULL));
		break;

초기화 함수를 통해 타이머를 SET 하고, 랜덤 함수를 호출한다.

 

WM_TIMER

	case WM_TIMER:		// 타이머에 의해서 호출
		{
			InvalidateRect(hWnd, NULL, true);

			// 포지션 위치에 따른 렉트 정보 업데이트
			rtBox1 = RECT_MAKE(ptPos1.x, ptPos1.y, 50);

			if (nDelay == 50)
			{
				RECT rt;
				rt.left = rand() % (WINSIZEX - 15);
				rt.right = rt.left + 30;
				rt.top = -30;
				rt.bottom = 0;

				vecRect.push_back(rt);
				nDelay = rand() % 50;
			}
			else
				nDelay++;

			vector<RECT>::iterator iter;

			for (iter = vecRect.begin(); iter != vecRect.end(); iter++)
			{
				iter->top += 10;
				iter->bottom += 10;

				if (iter->top > WINSIZEY)
				{
					vecRect.erase(iter);
					break;
				}
			}
		}
		break;

1초에 100번 실행되는 WM_TIMER를 통해, delay를 50을 줌으로써 새로운 RECT 생성 간격을 조절하고 있다.

보면 vector를 선언하여 RECT를 해당 백터에 삽입한 다음에, 해당 RECT가 WINSIZEY를 넘어갔을 때 이를 삭제시키는 방식으로 구현하였다. WM_TIMER에서 선언된 RECT들은 WM_PAINT에서 실제로 그려질 것이다.

 

WM_KEYDOWN

	case WM_KEYDOWN:	// 키 입력이 있을 때 마다 호출 된다.
		switch (wParam)
		{
			// 삼항식 (조건) ? 참일 때 : 거짓일 때
		case 'A': case VK_LEFT:
			ptPos1.x -= (rtBox1.left >= fMoveSpeed) ? fMoveSpeed : 0;
			break;
		case 'D': case VK_RIGHT:
			ptPos1.x += (rtBox1.right <= WINSIZEX - fMoveSpeed) ? fMoveSpeed : 0;
			break;
		}

WM_KEYDOWN 블록에서는 좌, 우 이동만 하면 되므로 A와 D만 인식하도록 코드를 정리했다.

 

WM_PAINT

    case WM_PAINT:
        {
            PAINTSTRUCT ps;

            HDC hdc = BeginPaint(hWnd, &ps);

			RECT_DRAW(rtBox1);

			for (int i = 0; i < vecRect.size(); i++)
			{
				RECT_DRAW(vecRect[i]);
			}

            EndPaint(hWnd, &ps);
        }
        break;

for문을 하나 삽입해서 떨어지는 RECT들을 그린다. 실제로 실행해보면 아래와 같은 화면이 나오게 된다!

왼쪽 상단에 있는 텍스트는 다음 글에서 설명할 예정이다!


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

Comments