학원/경일게임아카데미

27. 열여섯번째 수업과제 [악어 게임]

셩잇님 2022. 12. 29. 18:52
반응형

경일게임아카데미 프로그래밍반 28기 16일차 수업과제 (2021. 04. 29)

 

 

 


 

 

 

오늘은 WIN32 API을 활용하여 악어 게임을 제작해봅시다!

과제2 - 악어 게임을 제작하세요

조건.
1. 윗 이빨 10개, 아래 이빨 10개를 만드세요.
2. 20개의 버튼중 1개의 버튼은 누르면 악어 입이 닫히게 됩니다.
3. 닫히고 나서 게임을 다시 시작하게 하세요.

 

 

 


 

 

 

소스코드 (내가 작업한 것)

#include "stdafx.h"
#include "playGround.h"
#include <Windows.h>

playGround::playGround()
{

}

playGround::~playGround()
{

}

//초기화는 여기다 하세요 제발
HRESULT playGround::init()
{
	gameNode::init();
	
	// 시간
	time = 0;

	// 윗니
	for (int i = 0; i < 20; i++)
	{
		_box1[i].rc = RectMakeCenter(240 + i * 65, 400, 50, 50);
		_box1[i].isCheck = false;
		_box1[i].isJoker = false;

		// 아랫니
		if (i > 9)
		{
			_box1[i].rc = RectMakeCenter(220 + (i - 9.5) * 62, 500, 50, 50);
			_box1[i].isCheck = false;
			_box1[i].isJoker = false;
		}
	}

	// 이빨 중 조커 선언
	_box1[RND->getInt(20)].isJoker = true;

	// 얼굴 선언 (위, 왼쪽, 아래 순)
	Alligator_Mouse = RectMake(200, 375, 650, 200);
	Alligator_Face1 = RectMake(150, 325, 700, 50);
	Alligator_Face2 = RectMake(150, 325, 50, 250);
	Alligator_Face3 = RectMake(150, 525, 700, 50);

	return S_OK;
}

//메모리 해제는 여기다 하세요 제발
void playGround::release()
{
	gameNode::release();
}

//여기에다 연산하세요 제에발
void playGround::update()
{
	gameNode::update();

	//왼쪽클릭하면
	if (KEYMANAGER->isOnceKeyDown(VK_LBUTTON))
	{
		for (int i = 0; i < 20; i++)
		{
			if (PtInRect(&_box1[i].rc, _ptMouse))
			{
				_box1[i].isCheck = true;
			}
		}
	}

	for (int i = 0; i < 20; i++)
	{
		// 해당 카드가 조커이면
		if (_box1[i].isCheck && _box1[i].isJoker)
		{
			for (int i = 0; i < 10; i++)
			{
				// 윗니가 내려오고
				if (_box1[i].rc.bottom <= 450)
				{
					_box1[i].rc.top += 5;
					_box1[i].rc.bottom += 5;
				}

				// 윗입술이 내려온다
				if (Alligator_Face1.bottom <= 400)
				{
					Alligator_Face1.top += 5;
					Alligator_Face1.bottom += 5;
				}
			}

			time++;
			if (time > 100) this->init();
		}
	}
}

//여기에다 그려라 좀! 쫌!
void playGround::render(HDC hdc)
{
	HDC backDC = this->getBackBuffer()->getMemDC();
	PatBlt(backDC, 0, 0, WINSIZEX, WINSIZEY, WHITENESS);
	// 위에 건들지마라
	//================제발 이 사이에 좀 그립시다==========================

	// 입 
	HBRUSH brush2 = CreateSolidBrush(RGB(255, 0, 0));
	HBRUSH oldBrush2 = (HBRUSH)SelectObject(backDC, brush2);
	Rectangle(backDC, Alligator_Mouse);
	SelectObject(backDC, oldBrush2);
	DeleteObject(brush2);

	// 얼굴
	HBRUSH brush = CreateSolidBrush(RGB(0, 122, 0));
	HBRUSH oldBrush = (HBRUSH)SelectObject(backDC, brush);
	Rectangle(backDC, Alligator_Face1);
	Rectangle(backDC, Alligator_Face3);
	Rectangle(backDC, Alligator_Face2);
	SelectObject(backDC, oldBrush);
	DeleteObject(brush);

	// 눈
	EllipseMake(backDC, WINSIZEX / 2 - 400, 250, 100, 100);
	HBRUSH brush3 = CreateSolidBrush(RGB(0, 0, 0));
	HBRUSH oldBrush3 = (HBRUSH)SelectObject(backDC, brush3);
	EllipseMake(backDC, WINSIZEX / 2 - 380, 270, 63, 63);
	SelectObject(backDC, oldBrush3);
	DeleteObject(brush3);

	// 이
	for (int i = 0; i < 20; i++)
	{
		if (_box1[i].isCheck && !_box1[i].isJoker)
		{
			HBRUSH brush = CreateSolidBrush(RGB(5, 0, 238));
			HBRUSH oldBrush = (HBRUSH)SelectObject(backDC, brush);

			Rectangle(backDC, _box1[i].rc);
			SelectObject(backDC, oldBrush);
			DeleteObject(brush);
		}
		else if (_box1[i].isCheck && _box1[i].isJoker)
		{
			HBRUSH brush = CreateSolidBrush(RGB(0, 0, 0));
			Rectangle(backDC, _box1[i].rc);
			FillRect(backDC, &_box1[i].rc, brush);
			DeleteObject(brush);
		}
		else Rectangle(backDC, _box1[i].rc);
	}

	//==================================================
	//여기도 건들지마라
	this->getBackBuffer()->render(hdc, 0, 0);
}

 

 

 


 

 

 

 

어떻게 구현해야 할까?
1. 이를 만들자.
2. 입속을 만들자.
3. 얼굴을 만들자.
4. 눈을 만들자.


로직은?
1. 이를 만들 배열을 20개 선언하자.
> 이중 포문을 활용하여 이를 초기화 한다.
> 조커(썩은 이)를 선택할 경우 윗니아 아래로 내려온다.

 

2. 입 속을 그리기 위해 RECT를 만든다.
> RECT 초기화를 해주고, 단순히 RENDER에서 그린다.

 

3. 얼굴을 그리기 위해 RECT를 만든다.
> RECT 3개를 초기화해주고, RENDER에서 그려준다. 그렇지만 조커(썩은 이)를 선택할 경우 윗입술이 내려오게 해야한다.

 

4. 눈을 만들기 위해 EllipseMake를 사용한다.
Ellipse 초기화 해주고, 단순히 RENDER에서 그려준다.

 

 

 


 

 


결과화면

 

 

 


 

 

 

개인적으로 해보고 싶은 심화학습
딱히 없는 것같다. 게임자체가 단순해서 무엇을 추가로 무엇을 넣을 수 있을까 생각해보았을 때 마땅한 답이 안떠올랐다.

아쉬운점
악어를 이쁘게 디자인하고 싶었지만, 러닝게임을 위해 다음으로 미루고 싶다. 사실 이쁘게 제작해도 누가 알아주는것도 없으니 😔..

 

 

 

 

반응형

'학원 > 경일게임아카데미' 카테고리의 다른 글

29. 열여덟번째 수업  (2) 2023.01.06
28. 열일곱번째 수업  (0) 2022.12.29
26. 열여섯번째 수업과제 [러닝 게임]  (0) 2022.12.29
25. 열여섯번째 수업  (0) 2022.12.26
24. 열다섯번째 수업과제  (0) 2022.12.26