주녘공부일지

[C++] 종스크롤 슈팅 게임 ( WinAPI ) 본문

GameDevelopment/[C++] Project

[C++] 종스크롤 슈팅 게임 ( WinAPI )

주녘 2024. 10. 30. 17:35

게임 플레이 영상

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

종스크롤 슈팅 게임 ( WinAPI )

- 유니티 강의에 나오는 리소스를 이용하여 만든 종스크롤 슈팅 게임 ( 리소스 출처 : 골드메탈 )

- 어소트락에서 제공하는 Win32API 무료 강의를 레퍼런스로 아키텍처 설계

- 스테이지를 클리어하며, 최고 점수를 기록하는 게임

- 스테이지는 텍스트 데이터로 세팅 할 수 있으며, 설정된 모든 스테이지를 클리어 했을 경우, 마지막 스테이지가 반복되며 보스 몬스터의 패턴이 강화됨

https://github.com/godgjwnsgur7/WinAPI_FlightShootingGame

 

GitHub - godgjwnsgur7/WinAPI_FlightShootingGame

Contribute to godgjwnsgur7/WinAPI_FlightShootingGame development by creating an account on GitHub.

github.com

Game Progress

- 1프레임당 진행되는 게임 흐름

- Update -> Render -> Event

void CCore::Progress()
{
	// Update
	CTimeMgr::GetInst()->Update();
	CKeyMgr::GetInst()->Update();
	CCamera::GetInst()->Update();
	CSceneMgr::GetInst()->Update();
	CCollisionMgr::GetInst()->Update();
	CUIMgr::GetInst()->Update();

	// Render
	Clear();
	CSceneMgr::GetInst()->Render(m_pMemTex->GetDC());
	CCamera::GetInst()->Render(m_pMemTex->GetDC());
	BitBlt(m_hDC, 0, 0, m_ptResolution.x, m_ptResolution.y, m_pMemTex->GetDC(), 0, 0, SRCCOPY);

	// Event 지연처리
	CEventMgr::GetInst()->Update();
}

Scene & Collision

- 씬 매니저에 의해 제어되는 씬 객체는 모든 오브젝트들을 관리 및 제어

- 각 씬은 GroupType을 가지며, GroupType의 순서대로 업데이트 및 랜더링

+ 각 씬에서 충돌 이벤트를 발생시킬 대상을 지정하여 지정된 그룹끼리만 충돌체크

class CScene
{
protected:
	vector<CObject*> m_arrObj[(UINT)GROUP_TYPE::END];
	wstring m_strName;
    
public:
	void SetName(const wstring& _strName) { m_strName = _strName; }
	const wstring& GetName() { return m_strName; }

	virtual void Start();
	virtual void Update();
	virtual void FinalUpdate();
	virtual void Render(HDC _dc);

	virtual void Enter() = 0;
	virtual void Exit() = 0;

public:
	void DeleteGroup(GROUP_TYPE _eTarget);
	void DeleteAll();
	
public:
	void AddObject(CObject* _pObj, GROUP_TYPE _eType) { m_arrObj[(UINT)_eType].push_back(_pObj); }
	const vector<CObject*>& GetGroupObject(GROUP_TYPE _eType) { return m_arrObj[(UINT)_eType]; }
	vector<CObject*>& GetUIGroup() { return m_arrObj[(UINT)GROUP_TYPE::UI]; }
	
public:
	CScene();
	virtual ~CScene();
};
/// <summary>
/// 렌더링 순서가 됨
/// </summary>
enum class GROUP_TYPE
{
	DEFAULT = 0,
	TILE,
	GROUND,
	WALL,
	BOOM_EFFECT,
	EXPLOSION_EFFECT,
	PLAYER_SUBUNIT,
	ITEM,
	PROJ_PLAYER,
	PROJ_MONSTER,
	MONSTER,
	PLAYER,
	BOSSMONSTER,

	UI_OBJECT = 30,
	UI = 31,
	END = 32,
};

Event

- 해당 프레임에서 발생한 이벤트를 받아 일괄적으로 처리함

 ex) 씬 이동, 객체 생성, 객체 파괴 등

 

+ UI Event는 UIMgr에서 제어 ( 마우스 이벤트를 해당 UI에 전달 )

+ Collision Event는 CollisionMgr에서 제어 ( 충돌 이벤트를 해당 객체들에게 전달 )

struct tEvent
{
	EVENT_TYPE	eEven;
	DWORD_PTR	lParam;
	DWORD_PTR	wParam;
};

class CEventMgr
{
	SINGLE(CEventMgr);
private:
	vector<tEvent> vecEvent;
	vector<CObject*> vecDead;

public:
	void Update();

private:
	void Excute(const tEvent& _eve);

public:
	void AddEvent(const tEvent& _eve) { vecEvent.push_back(_eve); }
};

Sound

- SoundMgr는 게임 실행 시 모든 사운드를 ResMgr에게 캐싱할 것을 요청해 둠

 

'GameDevelopment > [C++] Project' 카테고리의 다른 글

[C++] 벽돌깨기 게임 ( WinAPI )  (1) 2024.09.15
[C언어] 콘솔 비행기 게임  (1) 2024.09.11