다양한 글들/PushPush 게임

2. Highlevel_Interface

smile blog 2022. 9. 23. 19:09
게임이 돌아가는데 필요한 기초 코드

 

Application.cpp (소스파일)
#include "Application.h"
#include "TitleScene.h"
#include "PlayScene.h"

Application* Application::mInstance = nullptr; // 클래스 바깥에서 초기화를 해줘야함 (전역변수처럼 사용하기 위해서)

Application::Application() // Applicaiton.h 에서 빠른 작업 및 리팩터링하면
	: mbRunning(true)// Applicaiton.cpp에서 자동으로 이렇게 생성
	, mPlaySceneNumber((int)SCENETYPE::TITLE) // int형 형변환
{
	clear();
}

Application::~Application() // ::을 치면 namespace를 사용하는 것처럼 쓸수 있다 ex) namespace std
{
}

void Application::clear() // clear는 공백으로 만들어주는 함수인듯하다
{
	for (int i = 0; i < SCENETYPE::END; i++)
	{
		mScenes[i] = nullptr;
	}
}

bool Application::Initiailize() // 리팩터링하고 선언/정의 누르면 cpp에서 자동으로 함수 생성
{
	mScenes[SCENETYPE::TITLE] = new TitleScene(); //타이틀씬을 동적할당
	mScenes[SCENETYPE::PLAY] = new PlayScene(); //플레이씬을 동적할당

	for (int i = 0; i < SCENETYPE::END; i++)
	{
		mScenes[i]->Initiailize(); //씬들이 전부 초기화된다
	}

	return true;
}

void Application::Update()
{
	mScenes[mPlaySceneNumber]->Update(); //Scene을 하나 업데이트한다
} 

void Application::Rendering()
{
	system("cls"); //common.h 의 window.h 라이브러리에 있는 한번 렌더링하면 한번 지워주는 함수
	mScenes[mPlaySceneNumber]->Render();
	Sleep(500); // cpu를 (500) = 0.5초 만큼 멈추게 하는 함수
}

void Application::Destroy()
{
	for (int i = 0; i < SCENETYPE::END; i++)
	{ 
		mScenes[i]->Destroy(); //씬들이 전부 해제된다
	}

	for (int i = 0; i < SCENETYPE::END; i++)
	{
		if (mScenes[i] != nullptr)
			delete mScenes[i]; // 동적할당된 씬들을 해제
	}
}

 

 

Application.h (헤더파일)
#pragma once
#include "Common.h"
#include "Scene.h"

enum SCENETYPE
{
	TITLE,
	PLAY,
	END
};

// 싱글턴 패턴 : 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나
// 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴
class Application
{
public:
	static Application* GetInstance() // static 전역변수처럼 사용이 가능하다
		// GetInstance는 null일경우 동적할당을 할 때 쓰인다.
	{
		if (mInstance == nullptr) //null 일때
		{
			mInstance = new Application(); //동적할당을 한다
		}
		return mInstance;
	}

public:

	bool Initiailize();
	void Update();
	void Rendering();
	void Destroy();

	bool GetIsRunning() { return mbRunning; }
	void SetPlaySceneNumber(int number) { mPlaySceneNumber = number; }

private:
	Application(); //private에 넣어야 못 바꿈
	~Application();

	void clear();

private:
	static Application* mInstance;//클래스내부에 선언, 전역변수처럼 사용가능

	bool mbRunning; //bool형은 true(1), false(0)를 저장하는 형식에 자료형
	
	Scene * mScenes[SCENETYPE::END];
	int mPlaySceneNumber;
};