๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Component

by eazuooz 2022. 9. 26.

์˜ˆ์ œ :)

https://github.com/eazuooz/WindowAPI/commit/8ffba666f04241fcdc47b2d8305ecab441316e39

 

Component · eazuooz/WindowAPI@8ffba66

Show file tree Showing 22 changed files with 241 additions and 66 deletions.

github.com

์ƒ์† ๊ตฌ์กฐ

๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ• ๋•Œ ๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ ๊ตฌ์กฐ๋Š” ์ƒ์†์„ ์ด์šฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉ ๋˜์—ˆ๋˜ ์˜ค๋ธŒ์ ํŠธ ๊ณ„์ธต ๊ตฌ์กฐ ์„ค๊ณ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์ธต ๊ตฌ์กฐ ์„ค๊ณ„๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ณ„์ธต์„ ๋งŒ๋“ค์–ด ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.




Player, Monster, Prop์˜ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์€ GameObject์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ 
๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๊ฐ๊ฐ์˜ ์˜ค๋ธŒ์ ํŠธ ์—์„œ ๊ตฌํ˜„ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— Player์™€ Monster๋Š” ์›€์ง์ด๋Š” ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์›€์ง์ž„ ๊ด€๋ จ๋œ ์ฒ˜๋ฆฌ๋Š” ์ด MovableObject์—์„œ ํ•˜๋ฉด ๋˜๊ณ 
๊ทธ ์™ธ์— Player, Monster์— ํŠนํ™”๋œ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋“ค์„ ๊ฐ๊ฐ ํ•˜๋ฉด ๋˜๊ฒ ์ฃ 



์—ฌ๊ธฐ์— ์ด์ œ Trigger ๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ Trigger์€ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค. Player, Monster, Prop๊ณผ๋Š” ๋‹ค๋ฅธ ์†์„ฑ์ด ์ƒ๊ธด ๊ฒƒ์ด์ฃ .
๊ทธ๋ ‡๋‹ค๋ฉด ์—ญ์‹œ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ด์ œ ๊ทธ๋ ค์ง€๋Š” ๋ถ€๋ถ„์€ RenderableObject์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋˜๋‹ˆ ์ค‘๋ณต ์ฝ”๋“œ๋„ ์—†๊ณ  ์•„์ฃผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณตํ†ต๋œ ๋ถ€๋ถ„๋“ค์„ ๋ฌถ์–ด์„œ ์ค‘๊ฐ„๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ค๊ณ„ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„
๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ณ„์ธต ๊ตฌ์กฐ ์„ค๊ณ„ ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ฒŒ์ž„์ด ์ ์  ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…๋„ ๋‹ค์–‘ํ•ด์ง€๊ณ  ํ•˜๋Š” ์ผ๋„ ๋งŽ์•„์ ธ์„œ,
๊ณ„์ธต ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์–ด๋ ค์›€์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ์ƒํ™ฉ์—์„œ Camera๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.


์นด๋ฉ”๋ผ๋Š” ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ˆ๊นŒ ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?
์นด๋ฉ”๋ผ๋Š” ํ™”๋ฉด์— ๊ทธ๋ ค์ง€์ง„ ์•Š์ง€๋งŒ ์›€์ง์ผ ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋‹ˆ๊นŒ ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?
์•ˆํƒ€๊น๊ฒŒ๋„ ์นด๋ฉ”๋ผ๋Š” ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค!!
๊ทธ๋ ค์ง€์ง„ ์•Š์ง€๋งŒ ์›€์ง์ผ ์ˆ˜๋Š” ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ๊ธฐ๋‹ˆ ์•ฝ๊ฐ„ ๊ณจ์น˜๊ฐ€ ์•„ํŒŒ์กŒ์Šต๋‹ˆ๋‹ค.
์–ด์ฉ” ์ˆ˜ ์—†์ด Prop๊ณผ Trigger์—๊ฒŒ๋Š” ๋ฏธ์•ˆํ•˜์ง€๋งŒ GameObject์—์„œ ์›€์ง์ž„ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ 
Prop๊ณผ Trigger์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•ด๋ด…์‹œ๋‹ค.


์ด๋ ‡๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ณด๋‹ˆ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋งŒ ๋ณด๋ฉด ๋” ๊น”๋”ํ•ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋” ๊น”๋”ํ•ด์กŒ์ง€๋งŒ GameObject์˜ ๋น„์ค‘์€ ์ ์  ๋” ์ปค์ ธ๋งŒ ๊ฐ‘๋‹ˆ๋‹ค.
์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…์ด ๋Š˜์–ด๋‚˜๋ฉด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋ ์ˆ˜๋ก ์ ์  ๋” ์„ค๊ณ„๋Š” ๋ณต์žกํ•ด์ง€๊ณ  ์ƒ์œ„ ๊ณ„์ธต์€ ๋น„๋Œ€ํ•ด์ง‘๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๊ฐ€ ๋ถ€๊ฐ๋˜๊ธฐ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜  ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋Š” ์ƒ์†๊ตฌ์กฐ์˜ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž ์ œ์•ˆ๋œ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ•ด์•ผ ํ•  ๊ธด์œผ๋“ค์„ ๊ฐ๊ฐ ๋ณ„๋„์˜ ๊ฐ์ฒด์— ๋ถ„ํ• ํ•˜์—ฌ

๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์ด ๋น„๋Œ€ํ™” ๋˜๋Š” ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.

 

์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„์—์„œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋Š” ๊ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ

๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋‹จ์ง€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ด€๋ฆฌ ํ• ๋ฟ์ด์ฃ .

์œ ๋‹ˆํ‹ฐ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ
์–ธ๋ฆฌ์–ผ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

์ด๋ฏธ ์œ ๋‹ˆํ‹ฐ ์—”์ง„๊ณผ ์–ธ๋ฆฌ์–ผ์—”์ง„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋„ ์ด ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

	class Component : public Entity
	{
	public:
		Component(eComponentType type);
		~Component();

		virtual void Tick() = 0;
		virtual void Render(HDC hdc) {}

	private:
		const eComponentType mType;

	};

	class Component;
	class Object : public Entity
	{
	public:
		Object();
		~Object();

		virtual void Tick();
		virtual void Render(HDC hdc);

		void AddComponent(Component* component);

	public:
		void SetPos(Vector2 pos) { mPos = pos; }
		void SetScale(Vector2 scale) { mScale = scale; }

		Vector2 GetPos() { return mPos; }
		Vector2 GetScale() { return mScale; }

	private:
		Vector2 mPos;
		Vector2 mScale;

		std::vector<Component*> mComponents;
	};
    
        void Object::Tick()
    {
        for (Component* component : mComponents)
        {
            component->Tick();
        }
    }

    void Object::Render(HDC hdc)
    {
        for (Component* component : mComponents)
        {
            component->Render(hdc);
        }
    }
    void Object::AddComponent(Component* component)
    {
        mComponents.push_back(component);
    }

์˜ค๋ธŒ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ Render์™€ Tick ํ•จ์ˆ˜๋งŒ์„ ํ˜ธ์ถœํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ƒ์†๋ฐ›์€ Animation , Collider ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„์ด ๋œ๋ถ€๋ถ„๋“ค์ด ์ž์‹๊ฐ์ฒด๋“ค๋กœ ์•Œ์•„์„œ ํ˜ธ์ถœ์ด ๋ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

	class Collider : public Component
	{
	public:
		Collider();
		~Collider();

		virtual void Tick() override;
		virtual void Render(HDC hdc) override;

	private:
		
	};
    
    class Animator : public Component
	{
	public:
		Animator();
		~Animator();

		virtual void Tick() override;
	};

 

 

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

Collider Manager  (1) 2022.09.30
Collider  (0) 2022.09.27
Path, Resource Load  (1) 2022.09.22
Resources, Brush, Pen  (0) 2022.09.20
Double Buffering  (0) 2022.09.19

๋Œ“๊ธ€