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;
}
이후, 게임을 실행하여 몬스터를 처치하면 점수가 상승하는 것을 볼 수 있다.
'Windows API & 게임 수학' 카테고리의 다른 글
2-1. 삼각함수를 이용하여 여러 각도로 발사하기 (1) | 2023.10.26 |
---|---|
1-11. 번외 - 충돌 판정(Collision) 구현하기 (0) | 2023.10.24 |
1-8. 리소스 제작 툴 만들기 (Resources, EditScene) (0) | 2023.10.17 |
1-7. 오브젝트(Object) 설계 (2) - 디버깅, 몬스터, 피격 판정 (0) | 2023.10.17 |
1-6. 오브젝트(Object) 설계 (1) - 플레이어, 투사체, ObjectManager (0) | 2023.10.17 |