개요
게임 내 요소인 환경 변화 효과의 구조를 정리한 글이다.
이 기능을 구현하여 C++의 추상 클래스의 개념을 익힐 수 있었다.
결과물
SituationMgr
헤더
#pragma once
#include <unordered_map>
class Situation;
class SituationMgr
{
private:
SituationMgr() = default;
~SituationMgr() = default;
public:
static SituationMgr* GetInst()
{
static SituationMgr m_pInst;
return &m_pInst;
}
public:
void Init();
void Udpate();
void Render(HDC _dc);
void Release();
void SetSituation(SITUATION_TYPE _situationType);
void StartSituation();
void EndSituation();
public:
Situation* GetCurrentSituation() { return m_pCurrentSituation; }
void RegistSituation(SITUATION_TYPE _type, Situation* _situation)
{ m_umSituationMap.insert({ _type, _situation }); }
private:
std::unordered_map<SITUATION_TYPE, Situation*> m_umSituationMap;
Situation* m_pCurrentSituation;
float m_fCurrentSituationTime;
float m_fSituationChagneInterval;
float m_fCurrentSitautionChangeTime;
bool m_bInSituation;
};
cpp
#include "pch.h"
#include "Core.h"
...
void SituationMgr::Init()
{
m_pCurrentSituation = nullptr;
srand((unsigned int)time(NULL));
SITUATION_TYPE situationType;
//환경 변화 효과 등록
situationType = SITUATION_TYPE::REVERSE_GRAVITY;
RegistSituation(situationType, new ReverseGravitySituation(situationType));
situationType = SITUATION_TYPE::REVERSE_INPUT;
RegistSituation(situationType, new ReverseInputSituation(situationType));
situationType = SITUATION_TYPE::INCREASE_MOVE_SPEED;
RegistSituation(situationType, new IncreseMoveSpeedSituation(situationType));
situationType = SITUATION_TYPE::REVERSE_MOVE;
RegistSituation(situationType, new ReverseMoveSituation(situationType));
situationType = SITUATION_TYPE::SWAP_POS;
RegistSituation(situationType, new SwapPositionSituation(situationType));
m_fCurrentSituationTime = 0;
m_fSituationChagneInterval = 5.f;
m_fCurrentSitautionChangeTime = 0.f;
m_bInSituation = false;
}
void SituationMgr::Udpate()
{
if (SceneMgr::GetInst()->GetCurScene() !=
SceneMgr::GetInst()->GetScene(L"Start_Scene"))
{
return;
}
if (m_bInSituation)//현재 효과가 적용중
{
if (m_pCurrentSituation != nullptr)
{
m_pCurrentSituation->UpdateSituation();
m_fCurrentSituationTime += fDT;
//일정 시간이 지나면 종료
if (m_fCurrentSituationTime >= m_pCurrentSituation->GetDuration())
EndSituation();
}
}
else//현재 효과가 적용되고 있지 않음
{
m_fCurrentSitautionChangeTime += fDT;
//일정 시간 후 효과 랜덤으로 효과 적용
if (m_fCurrentSitautionChangeTime >= m_fSituationChagneInterval)
{
m_fCurrentSitautionChangeTime = 0.f;
int type = rand() % (int)SITUATION_TYPE::END;
SetSituation((SITUATION_TYPE)type);
StartSituation();
}
}
}
void SituationMgr::Render(HDC _dc)...
void SituationMgr::Release()
{
for (auto s : m_umSituationMap)
{
delete s.second;
}
}
//효과 시작
void SituationMgr::StartSituation()
{
if (SceneMgr::GetInst()->GetCurScene() !=
SceneMgr::GetInst()->GetScene(L"Start_Scene"))
{
return;
}
m_fCurrentSituationTime = 0;
if (m_pCurrentSituation != nullptr)
m_pCurrentSituation->StartSituation();
}
//효과 적용
void SituationMgr::EndSituation()
{
if (m_pCurrentSituation != nullptr)
m_pCurrentSituation->EndSituation();
m_pCurrentSituation = nullptr;
m_bInSituation = false;
}
//적용할 효과 설정
void SituationMgr::SetSituation(SITUATION_TYPE _situationType)
{
if (m_umSituationMap.find(_situationType) == m_umSituationMap.end())
return;
m_pCurrentSituation = m_umSituationMap[_situationType];
m_bInSituation = true;
}
Situation
헤더
#pragma once
class Situation
{
public:
Situation(SITUATION_TYPE _eSituationType);
~Situation();
public:
virtual void StartSituation() = 0;
virtual void UpdateSituation() = 0;
virtual void EndSituation() = 0;
public:
float GetDuration() { return m_fDuration; }
public:
SITUATION_TYPE GetSituationType() { return m_eSituationType; }
wstring GetDescription() { return m_sDescription; }
protected:
SITUATION_TYPE m_eSituationType;
float m_fDuration;
wstring m_sDescription;
}
cpp
#include "pch.h"
#include "Situation.h"
Situation::Situation(SITUATION_TYPE _eSituationType)
{
m_eSituationType = _eSituationType;
}
Situation::~Situation()
{
}
구현 사항
SituationMgr
환경 변화를 관리하는 클래스이다. 여러 환경 변화 효과들을 map으로 저장하고
Update함수에서 일정 시간마다 랜덤으로 하나의 효과를 시작하고 효과를 종료한다.
Situation
모든 환경 변화 효과 클래스들의 부모가 되는 클래스이다.
SItuationMgr클래스에서는 이 클래스의 함수들을 통해 효과를 시작하거나 끝낸다.
해당 클래스는 상속으로써만 사용하기 위해 추상 클래스로 만들었다.
'프로젝트 > 강강술래잡기' 카테고리의 다른 글
[프로젝트][강강술래잡기] 완성 (0) | 2023.12.21 |
---|---|
[프로젝트][강강술래잡기] 버튼 (0) | 2023.12.18 |
[프로젝트][강강술래잡기] PixelCollision (3) | 2023.11.26 |
[프로젝트][강강술래잡기] 물리 (2) | 2023.11.26 |
[프로젝트][강강술래잡기] 기획 (1) | 2023.11.24 |