0. 점수를 어디에 구현할 것인가?

1) 개요

이 게임은 2차원 슈팅게임이다.

스페이스바로 미사일을 발사해 몬스터에게 닿으면 몬스터가 제거되는 방식으로 되어있다.

Score를 표시하는 것은 Game.cpp의 Render에서 textout과 format 함수를 사용하여 나타낼 수 있을 것인데,

그렇다면 Score를 어디에서 구현하고 사용할 것인가?

 

2) ScoreManager?

오직 점수 하나만을 위해 매니저 클래스로 관리하는 것은 또다른 메모리 낭비가 될 수 있으므로 되도록 지양하고자 한다.

그렇다면 오브젝트를 관리하고 있는 ObjectManager에 score를 추가하여 싱글톤으로 인스턴스를 불러와 사용하는 방법을 시도하겠다.

 

3) 점수 추가 시점은?

일반적으로 몬스터가 처치될 때 점수가 올라가는 방식으로 구현되어 있으므로, missile과 monster의 충돌 판정이 구현된 부분에서 _score를 증가시키도록 하겠다.

미사일과 몬스터의 충돌판정은 Missile.cpp에 있다.

 

 

1. ObjectManager.h, .cpp

public:
	//~~ 생략 ~~
	auto GetScore() { return _score; }
	auto SetScore(int32 value) { _score += value; }
    
private:
	// Object를 들고 있는 동적 배열
	vector<Object*> _objects; 
	int32 _score = 0;
}

점수를 0으로 초기화한다.

 

2. Game.cpp

void Game::Render()
{
	int32 _score = GET_SINGLE(ObjectManager)->GetScore();
	// ~~~중략~~~

	{
    	// Score 출력
		wstring str = std::format(L"Score : {0}", _score);
		::TextOut(_hdcBack, 370, 10, str.c_str(), static_cast<int32>(str.size()));
	}

이어서 게임의 렌더링 부분의 코드를 작성한다.

점수는 ObjectManager의 GetScore 함수로 매번 가져올 것이다.

 

 

3. Missile.cpp

Missile 클래스의 Update 함수를 수정한다.

		// 미사일과 몬스터 사이의 거리에 따라 충돌 판정함
		if (dist < 50)
		{
			GET_SINGLE(ObjectManager)->Remove(object);
			GET_SINGLE(ObjectManager)->Remove(this);
			GET_SINGLE(ObjectManager)->SetScore(50);
			return;
		}

 

이후, 게임을 실행하여 몬스터를 처치하면 점수가 상승하는 것을 볼 수 있다.