14. 씬 Scene 구조 짜기
https://hyrule.tistory.com/111
*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
Scene 관련 소스코드들은 앞으로 Include/Scene 폴더 안에 저장한다.
폴더를 직접 만든 후 클래스 생성 시 클래스 파일명 앞에 Scene/을 붙여 주면 된다.
솔루션 탐색기 상에서도, Scene 필터를 하나 생성하여 모아놓는다.
class CSceneManager
- 싱글턴 패턴으로 생성
- 씬매니저는 일단 초기화 메소드만 생성해 놓는다.
//SceneManager.h
#pragma once
#include "../Singleton.h"
#include "../GameInfo.h"
class CSceneManager
{
public:
bool Init();
DECLARE_SINGLETON(CSceneManager)
};
//SceneManager.cpp
#include "SceneManager.h"
DEFINITION_SINGLETON(CSceneManager)
CSceneManager::CSceneManager()
{
}
CSceneManager::~CSceneManager()
{
}
bool CSceneManager::Init()
{
return true;
}
class CScene
- 씬 클래스를 생성한다.
- 씬 클래스는 외부에서 생성할 수 없고, 상속 관계 또는 씬매니저(friend)를 통해서만 생성이 가능하다.
- 다음 3가지 메소드를 선언및 정의부를 생성만 해 놓는다.(나중에 사용할 예정)
- Init: 초기화 메소드. 성공시 true, 실패시 false 반환
- Update: 매 프레임별 씬 속 게임오브젝트들의 상태 Update
- Render: 매 프레임별 게임오브젝트들 렌더링
class CMainScene: public Scene
- 씬을 상속받는 메인씬을 생성한다.
- 실제로 게임 속에서 동작하게 될 씬이다.
- 마찬가지로 상속 관계 또는 씬매니저(friend)를 통해서만 생성이 가능하다.
- 앞으로 Scene을 상속받는 각각 실제 씬들은, 씬에서 사용할 게임오브젝트를 Init() 함수를 통해 생성만 해 주고,
나머지 과정은 Scene에서 처리할 것이다.
class CSceneManager
- SceneManager 클래스에서 Scene 포인터 변수를 전방선언한다.
- 앞으로 실행될 씬을 이 포인터에 등록해서 관리한다.
class CScene* m_PresentScene;
CreateScene()
- 템플릿 타입으로 받는 씬을 새로 동적할당하고, 초기화한다.
- 초기화에 성공시 true를 반환, 실패 시 false를 반환한다.
- 현재 씬매니저에 등록된 씬이 없다면 해당 씬을 게임매니저의 씬 포인터 변수에 업캐스팅하여 등록한다.
//씬 생성 메소드
template <typename T>
bool CreateScene()
{
T* Scene = new T;
if(!Scene->Init())
{
SAFE_DELETE(Scene);
return false;
}
//씬 생성에 성공했으면 멤버변수 m_PresentScene에 업캐스팅을 통해 등록
m_PresentScene = (CScene*)Scene;
return true;
}
CreateScene() 메소드를 구현했으면, 씬매니저가 초기화될 때, 메인 씬을 기본 씬으로 등록해 놓는다.
bool CSceneManager::Init()
{
CreateScene<CMainScene>();
return true;
}
CGameManager에서 CSceneManager를 생성 및 제거해준다.
bool CGameManager::Init(HINSTANCE hInst)
{
//씬매니저 생성(싱글턴 패턴)
if (!CSceneManager::GetInst()->Init())
return false;
}
CGameManager::~CGameManager()
{
CSceneManager::DestroyInst();
}