WIN32API FrameWork/한단계씩 직접 구현

14. 씬 Scene 구조 짜기

hyrule 2022. 5. 18. 14:50

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();
}

 

 

씬 구조 준비 완료

 


GameFrameworkStepbyStep_14_SceneStructure.zip
1.27MB