League Of Legends - Link Select [winAPI 16] Scene & Object
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 16] Scene & Object

by GAMEMING 2024. 6. 10.
728x90

 

 

์”ฌ ์ „ํ™˜ (ํ™”๋ฉด ์ „ํ™˜)

 

์”ฌ ๋ณ€๊ฒฝ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž. ์”ฌ ์ „ํ™˜์€ ์”ฌ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ?

์”ฌ ๋ณ€๊ฒฝ ๋˜ํ•œ ์ด์ „ ํ”„๋ ˆ์ž„๊ณผ ๋‹ค์Œ ํ”„๋ ˆ์ž„์˜ ์žฅ๋ฉด์ด ๋‹ค๋ฅด๊ธฐ์— ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์ผ๋‹จ ์ƒˆ๋กœ์šด ์”ฌ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์ž.

 

// Scene_Tool.h
#pragma once
#include "Scene.h"

class Scene_Start : public Scene {
public:
	Scene_Start();
	~Scene_Start();
    
	virtual void Enter();
	virtual void Exit();
};


// Scene_Tool.cpp

#include "pch.h"
#include "Scene_Tool.h"

#include "KeyManager.h"

Scene_Tool::Scene_Tool()
{
}

Scene_Tool::~Scene_Tool()
{
}

void Scene_Tool::Enter()
{
}

void Scene_Tool::Exit()
{
}

 

 

์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” Scene_Start์—์„œ Scene_Tool๋กœ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์šฐ์„  SceneManager์—์„œ ์”ฌ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

// SceneManager.h

class Scene;

class SceneManager{
	SINGLE(SceneManager);

private:
	Scene*	arrScene[(UINT)SCENE_TYPE::END];
	Scene*	currScene;							
	
public:
	void init();
	void update();
	void render(HDC _hdc);

	Scene* GetCurScene() { return currScene; }


private:
	void ChangeScene(SCENE_TYPE _next);		// ์ถ”๊ฐ€
	friend class EventManager;			// ์นœ๊ตฌ ์„ ์–ธ
};


// SceneManager.cpp
void SceneManager::ChangeScene(SCENE_TYPE _next)
{
	currScene->Exit();
	currScene = arrScene[(UINT)_next];
	currScene->Enter();
}

 

 

์”ฌ ์ „ํ™˜ ํ•จ์ˆ˜์—์„œ๋Š” ํ•ด๋‹น ์”ฌ์—์„œ ๋‚˜์™€์„œ ๋‹ค์Œ ์”ฌ์— ๋“ค์–ด๊ฐˆ ๋•Œ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ์ผ์„ ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์”ฌ์„ ์ •๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ Exit()์„ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๋’ค๋กœ ํ˜„์žฌ ์”ฌ์„ ๋‹ค์Œ ์”ฌ์œผ๋กœ ์ง€์ •ํ•œ ํ›„ ๋‹ค์Œ ์”ฌ์˜ ์ง„์ž…์ ์—์„œ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜ Enter()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

 ๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋ฅผ Event Manager์—์„œ ์ด๋ฒคํŠธ ํƒ€์ž…์ด SCENE_CHAGNE์ผ ๊ฒฝ์šฐ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

// Event Manager.cpp
void EventManager::Excute(const Event& _eve)
{
	// ....
	case EVENT_TYPE::SCENE_CHAGNE:
		// lParam : Next Scene Type
		SceneManager::Instance()->ChangeScene((SCENE_TYPE)_eve.lParam);
		break;
	// ....
}

 

 

์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ ์”ฌ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค๊ณ  ํ•˜์˜€์„ ๋•Œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž

 

// Scene.h
	virtual void update();		// ์ˆ˜์ • - ๊ฐ€์ƒํ•จ์ˆ˜๋กœ


// Scene_Start.h
class Scene_Start : public Scene {
public:
	Scene_Start();
	~Scene_Start();

	virtual	void update();		// ์ˆ˜์ • - ๊ฐ€์ƒํ•จ์ˆ˜๋กœ
	virtual void Enter();
	virtual void Exit();
};


// Scene_Start.cpp
void Scene_Start::update()
{
	Scene::update();

	// ์ถ”๊ฐ€์ ์œผ๋กœ ํ•˜๊ณ ์ž ํ•˜๋Š” ์ผ ์ถ”๊ฐ€
	if (KEY_TAP(KEY::ENTER)) {
		ChangeSceneEvent(SCENE_TYPE::TOOL);
	}
}


// func.h
void ChangeSceneEvent(SCENE_TYPE _next);


// func.cpp
void ChangeSceneEvent(SCENE_TYPE _next)
{
	Event evn = {};
	evn.even = EVENT_TYPE::SCENE_CHAGNE;
	evn.lParam = (DWORD_PTR)_next;

	EventManager::Instance()->AddEvent(evn);
}

 

 

์”ฌ ์—…๋ฐ์ดํŠธ ๋ถ€๋ถ„์„ ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์„œ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜์—ฌ ๊ธฐ์กด ์”ฌ์—์„œ ํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ํ•˜๋ ค๋Š” ์ผ๋„ ํ•˜๋„๋ก ํ•œ๋‹ค. START ์”ฌ์—์„œ ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๊ณ  ๊ทธ ์ด๋ฒคํŠธ๋Š” func ํŒŒ์ผ์— ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์”ฌ์˜ ์ „ํ™˜ํ•  ๋•Œ ๋‹จ์ˆœํžˆ ์”ฌ๋งŒ ์ „ํ™˜ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์”ฌ์„ ๋‚˜์˜ฌ ๋•Œ ํ•ด๋‹น ์”ฌ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฒกํ„ฐ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋‹จ์ˆœ ๋ฒกํ„ฐ๋งŒ ํด๋ฆฌ์–ด๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ ์„ธ๋ถ€์ ์ธ ์ฃผ์†Œ ๊ฐ’๊ณผ ๋ฒกํ„ฐ๋„ ๋‚ ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๊ณ„์† ์ž์ฃผ ์‚ฌ์šฉํ•  ๋ถ€๋ถ„์ด๋ผ func ํŒŒ์ผ์— ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“์ž.

 

// func.h

// ์›๋ณธ ๋ฒกํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•จ์œผ๋กœ ์ฐธ์กฐ
template<typename T>
void SafeDeleteVec(vector<T>& _vec)
{
	for (size_t i = 0; i < _vec.size(); ++i) {
		if (nullptr != _vec[i])
			delete _vec[i];
	}
	_vec.clear();
}


// Scene.h
public:
	void DeleteGroup(GROUP_TYPE type);	// ํŠน์ • ๊ทธ๋ฃน ์˜ค๋ธŒ์ ํŠธ ์‚ญ์ œ
	void DeleteAll();			// ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ ์‚ญ์ œ

// Scene.cpp
void Scene::DeleteGroup(GROUP_TYPE type)
{
	// SafeDeleteVec<Object*>(arrObj[(UINT)type]);
	SafeDeleteVec(arrObj[(UINT)type]);
}

void Scene::DeleteAll()
{
	for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
		DeleteGroup((GROUP_TYPE)i);
	}
}

// Scene_Start.cpp

void Scene_Start::Exit()
{
	DeleteAll();	// ๋ชจ๋“  ๋ฌผ์ฒด ์‚ญ์ œ
	ColliderManager::Instance()->Reset();
}

 

 

ํ…œํ”Œ๋ฆฟ T๋กœ ๋ฒกํ„ฐ ํƒ€์ž…์„ ์ „๋‹ฌ ๋ฐ›๊ณ  ์žˆ๊ธฐ์— Object* ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜์ง€๋งŒ, ๋„ฃ์ง€ ์•Š๋”๋ผ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋„ฃ์–ด์ค€๋‹ค.

 

Start ์”ฌ

 

Enter๋ฅผ ๋ˆ„๋ฅด๋ฉด Tool์”ฌ์œผ๋กœ ์ „ํ™˜๋œ๋‹ค.

 

Tool ์”ฌ

 

 


 

 

์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋งŒ๋“ค๋ฉด ํ˜„์žฌ ์ถฉ๋Œ์ฒด์˜ ์ฃผ์†Œ๊ฐ€ ์›๋ž˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ๊ฐ์ฒด๋“ค์€ ๋ณต์‚ฌ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

// Object.cpp
Object::Object(const Object& _ori)
	: strName(_ori.strName)
	, vPos{_ori.vPos}
	, vScale{_ori.vScale}
	, collider(nullptr)
	, act(true)		
{
	collider = new Collider(*_ori.collider);
	collider->owner = this;
}

 

 

 

ํ”Œ๋ ˆ์ด์–ด, ๋ชฌ์Šคํ„ฐ ๊ฐ™์€ ๊ฐ์ฒด๋“ค์€ ๋ณต์‚ฌํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์„๊นŒ? ํ˜„์žฌ ๊ตฌํ˜„๋œ ๋ถ€๋ถ„์—์„œ Texture*์€ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž„์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํ”Œ๋ ˆ์ด์–ด์˜ ๋ณต์‚ฌ์ƒ์„ฑ์ž๋Š” ์œ„์ฒ˜๋Ÿผ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณต์‚ฌ์ƒ์„ฑ์ž์™€ ์ž์‹ ์˜ ๋ณต์‚ฌ์ƒ์„ฑ์ž ๋ถ€๋ถ„(๋ฌธ์ œ์—†์Œ)์ด ์žˆ๊ธฐ์— ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ณ ๋ คํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋งŒ์•ฝ ๊ธฐ์กด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ํ•œ ๋งˆ๋ฆฌ ๋” ๋งŒ๋“ค์–ด๋ณธ๋‹ค๊ณ  ํ•˜์ž.

 

// Start_Scene.cpp

void Scene_Start::Enter()
{
	Object* obj = new Player;
	obj->setPos(Vec2(640.f, 384.f));
	obj->setScale(Vec2(100.f, 100.f));
	AddObject(obj, GROUP_TYPE::PLAYER);

	Object* otherPlayer = new Player(*(Player*)obj);
	otherPlayer->setPos(Vec2(740.f, 384.f));
	AddObject(otherPlayer, GROUP_TYPE::PLAYER);
    
    // ...   
}

 

 

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋‘ ๋งˆ๋ฆฌ ์ƒ์„ฑ๋œ๋‹ค

 

 

 

 

๊ทผ๋ฐ ๋ณต์‚ฌ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•ด์„œ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋‹ˆ ๊ทธ ๊ณผ์ •์ด ์กฐ๊ธˆ ๋ถˆํŽธํ•˜๋‹ค. ์ด๋ฅผ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ์— ๊ฐ€์ƒํ•จ์ˆ˜๋กœ ์ž๊ธฐ ์ž์‹ ์˜ ๋ณต์ œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Clone ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์ž.

 

// Object.h
public:
	virtual Object* Clone() = 0;	// ์ถ”๊ฐ€

 

 

์ด๋Ÿฌ๋ฉด ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ์ด Clone ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•จ์— ์žˆ์–ด ๊ธฐ์กด ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด๋„ ๋˜๋Š”์ง€, ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ๋˜๋Š”์ง€๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด ์นœ๊ตฌ๋Š” ๋งค ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ๋ฐ˜๋ณต๋จ์œผ๋กœ ๋งคํฌ๋กœ๋กœ ๋งŒ๋“ค์–ด ๋†“์ž.

// define.h

#define CLONE(type) type* Clone() { return new type(*this); }

 

 

์ด ์นœ๊ตฌ๋ฅผ ์ด์šฉํ•ด ๊ธฐ์กด ์ฝ”๋“œ๋„ ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

// Player.h
class Texture;

class Player : public Object {
private:
	Texture* tex;

	void CreateMissile();
	CLONE(Player);		// ์ถ”๊ฐ€

public:
	Player();
	~Player();

	virtual void update();
	virtual void render(HDC _dc);
};


// Monster.h
public:
	CLONE(Monster);		// ์ถ”๊ฐ€


// Missile.h
public:
	CLONE(Missile);		// ์ถ”๊ฐ€
    
    
// Scene_Start.cpp ๋ณ€๊ฒฝ
void Scene_Start::Enter()
{
	Object* obj = new Player;
	obj->setPos(Vec2(640.f, 384.f));
	obj->setScale(Vec2(100.f, 100.f));
	AddObject(obj, GROUP_TYPE::PLAYER);

	Object* otherPlayer = obj->Clone();		// Clone ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ฆ
	otherPlayer->setPos(Vec2(740.f, 384.f));	
	AddObject(otherPlayer, GROUP_TYPE::PLAYER);
    
	// ...
}

 

 

'๐Ÿค“ Study > winAPI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[winAPI 20] Tool  (1) 2024.06.11
[winAPI 19] Unity Build  (0) 2024.06.11
[winAPI 15] Event Manager  (1) 2024.06.10
[winAPI 14] Collider(3)  (1) 2024.06.09
[winAPI 13] Collider(2)  (1) 2024.06.08