๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ–ผ GameProgramming 2D

Scene, GameObject, Component

by eazuooz 2022. 12. 21.

Scene

์šฐ๋ฆฌ๊ฒŒ์ž„์˜ ๊ตฌ์กฐ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋  ๊ฒƒ์ด๋‹ค.

์”ฌ ์•ˆ์—๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ•˜๋‚˜์˜ ์”ฌ ํŒŒ์ผ์€ ํ•œ ๋ ˆ๋ฒจ๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์”ฌ์—์„œ๋Š” ํ™˜๊ฒฝ๊ณผ ์žฅ์• ๋ฌผ, ์žฅ์‹์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๊ฒŒ์ž„์„ ์„ธ์„ธํ•˜๊ฒŒ ๋””์ž์ธํ•˜๊ณ  ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

	class Scene : public Entity
	{
	public:
		Scene();
		virtual ~Scene();

		virtual void Initialize();
		virtual void Update();
		virtual void FixedUpdate();
		virtual void Render();

		Layer* GetLayer(UINT index) { return& mLayers[index]; }
		void AddGameObject(GameObject* gameObject, UINT layerIndex);

	private:
		Layer mLayers[LAYER::MAX];
	};

SceneManager

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ์”ฌ์„ ๊ด€๋ฆฌํ•˜๋Š” SceneManager ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.

Scene๊ณผ Scene์„ ๋„˜๋‚˜๋“œ๋Š” ์ž‘์—…์„ ํ• ๋–„ ์ด์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์œผ์„œ ๋กœ๋”ฉ์ด ๋๋‚˜๋ฉด ํƒ€์ดํ‹€์”ฌ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๊ฒŒ์ž„์‹œ์ž‘์„ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์”ฌ์œผ๋กœ ์ด๋™ํ•˜๊ณ 

์˜ํ™”์ฒ˜๋Ÿผ ์žฅ๋ฉดํ•˜๋‚˜๋ฅผ ๋‹จ์œ„๋กœ ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ•ด์ฃผ๊ณ  ๊ทธ ์žฅ๋ฉด๋“ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

	class Scene;
	class SceneManager
	{
		SINGLE(SceneManager)
	public:
		void Initialize();
		void Tick();
		void Render(HDC hdc);

	private:
		Scene* mScenes[SCENE_TYPE::END];
		Scene* mPlayScene;
	};

 

 

Game Object

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

 

๊ทธ๋ฆฌ๊ณ  ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ถ€์†ํ’ˆ(component)๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด Transform ์€ ํฌ๊ธฐ ์ด๋™ ๊ฐ๋„ ๊ฐ™์€ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๊ณ  SpriteRenderer๋Š” ํ™”๋ฉด์ƒ์— ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. AudioSource๋Š” ์†Œ๋ฆฌ๋ฅผ ์žฌ์ƒ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ตฌ์š”.

	class GameObject;
	class Component : public Entity
	{
	public:
		friend GameObject;

		Component(COMPONENTTYPE type);
		virtual ~Component();

		virtual void Initialize() = 0;
		virtual void Update() = 0;
		virtual void FixedUpdate() = 0;
		virtual void Render() = 0;

		GameObject* GetOwner() { return mOwner; }
		UINT GetUpdateOrder() { return (UINT)mType; }

	private:
		const COMPONENTTYPE mType;
		GameObject* mOwner;
	};

 

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์”ฌ๊ณผ ๊ทธ ์”ฌ์•ˆ์— ์กด์žฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋ฐฐ์น˜ํ•˜์—ฌ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

	class GameObject : public Entity
	{
	public:
		enum eState
		{
			Active,
			Paused,
			Dead,
		};

		GameObject();
		virtual ~GameObject();

		void AddComponent(Component* component);
		template <typename T>
		T* GetComponent()
		{
			T* component;
			for (auto c : mComponents)
			{
				component = dynamic_cast<T*>(c);

				if (component != nullptr)
					return component;
			}

			return nullptr;
		}

		virtual void Initialize();
		virtual void Update();
		virtual void FixedUpdate();
		virtual void Render();

	private:
		eState mState;
		std::vector<Component*> mComponents;
	};

 

'๐Ÿ“ Development Study > ๐Ÿ–ผ GameProgramming 2D' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Sampler ์ƒ˜ํ”Œ๋Ÿฌ  (0) 2023.01.02
Texture ์ƒ์„ฑ  (0) 2022.12.26
Mesh, MeshRenderer  (0) 2022.12.21
Constant Buffer(์ƒ์ˆ˜ ๋ฒ„ํผ), Index Buffer(์ธ๋ฑ์Šค ๋ฒ„ํผ)  (1) 2022.12.08
Drawing a Triangle  (0) 2022.12.06

๋Œ“๊ธ€