KoreanFoodie's Study

윈도우 API 프로그래밍 6 : 간단한 UI 구현과 똥피하기 게임 예제 본문

Game Dev/윈도우 API

윈도우 API 프로그래밍 6 : 간단한 UI 구현과 똥피하기 게임 예제

GoldGiver 2021. 10. 15. 09:57

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


윈도우 API 프로그래밍 6 : 간단한 UI 구현과 똥피하기 게임 예제

이전 글에 이어서 추가적인 기능을 약간 추가해 보자.

 

전역 변수 재설정

struct tagBox
{
	RECT	rt;
	float	speed;
};

vector<tagBox>	vecBox;											// 떨어지는 렉트들의 정보
int				nDelay = 50;

struct tagBox를 새로 선언하여 RECT를 대체했다. 그 이유는, 각각의 상자마다 떨어지는 속도를 다르게 만들기 위해서인데, 이는 난이도나 약간의 재미 요소를 첨가하는데 사용될 수 있다.

 

WM_TIMER : 점수 계산과 타입 수정

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

			nLevel = nScore / 100 + 1;

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

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

				box.speed = rand() % 11 + 5;

				vecBox.push_back(box);
				nDelay = rand() % 50;
			}
			else
				nDelay += nLevel;

			vector<tagBox>::iterator iter;

			for (iter = vecBox.begin(); iter != vecBox.end(); iter++)
			{
				iter->rt.top += iter->speed;
				iter->rt.bottom += iter->speed;

				RECT rt;
				RECT rtIter = iter->rt;
				if (iter->rt.top > WINSIZEY)
				{
					nScore++;
					vecBox.erase(iter);
					break;
				}
				else if (IntersectRect(&rt, &rtBox1, &rtIter))
				{
					nScore -= 10;
					vecBox.erase(iter);
					break;
				}
				else if (PtInRect(&rtIter, ptMouse))
				{
					nScore += 5;
					vecBox.erase(iter);
					break;
				}
			}
		}
		break;

RECT를 tagBox로 변경하면서, rt.right 대신 box.rt.right 같은 형식으로 약간의 수정이 있었다.

사실 뒷부분을 보면, 스코어를 더하고 빼는 부분을 추가하여 점수를 계산할 수있도록 만들었다. 그중 PtInRect(&rtIter, ptMouse) 부분은 마우스가 해당 RECT안으로 들어왔는지를 판단하는 함수이다. 여기서는 마우스 포인터가 떨어지는 RECT블록을 건드리면 점수가 5점 추가되면서 해당 tagBox를 지우도록 구현하였다.

 

WM_PAINT : 간단한 TEXT UI

    case WM_PAINT:
        {
            PAINTSTRUCT ps;

            HDC hdc = BeginPaint(hWnd, &ps);

			RECT_DRAW(rtBox1);

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

			char szBuf[32];
			
			_itoa_s(nLevel, szBuf, 10);
			string str = string(szBuf);
			TextOutA(hdc, 10, 10, str.c_str(), str.length());

			_itoa_s(nScore, szBuf, 10);		// 정수값을 문자열 값으로 변환 해주는 함수
			str = string(szBuf);
			TextOutA(hdc, 10, 30, str.c_str(), str.length());

            EndPaint(hWnd, &ps);
        }
        break;

_itoa_s 함수를 통해 레벨과 스코어를 szBuf에 저장한 후,  string으로 형변환하여 TextOutA로 넣었다. TextOutA 함수는 지정한 위치에 해당하는 텍스트를 출력하게 되는데, 이는 이전 글에서 보았던 왼쪽 상단의 텍스트 부분을 의미한다!


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

Comments