반응형
컴퍼넌트 구조
- 내가 필요할때마다 추가하여 사용하는 방식
1. Component 클래스 추가
//DirectX_Component.h
#pragma once
#include "DirectX_Entity.h"
namespace dir
{
class GameObject;
class Component : public Entity
{
public:
Component();
~Component();
virtual void Initialize();
virtual void Update();
virtual void LateUpdate();
virtual void Render(HDC hdc);
void SetOwner(GameObject* owner) { mOwner = owner; }
GameObject* GetOwner() { return mOwner; }
private:
GameObject* mOwner;
};
}
//DirectX_Component.cpp
#include "DirectX_Component.h"
namespace dir
{
Component::Component()
{
}
Component::~Component()
{
}
void Component::Initialize()
{
}
void Component::Update()
{
}
void Component::LateUpdate()
{
}
void Component::Render(HDC hdc)
{
}
}
2. Gameobject 클래스 수정
//DirectX_GameObject.cpp
#include "DirectX_GameObject.h"
#include "DirectX_Input.h"
#include "DirectX_Time.h"
namespace dir
{
GameObject::GameObject()
{
}
GameObject::~GameObject()
{
for (Component* comp : mComponents)
{
delete comp;
comp = nullptr;
}
}
void GameObject::Initialize()
{
for (Component* comp : mComponents)
{
comp->Initialize();
}
}
void GameObject::Update()
{
for (Component* comp : mComponents)
{
comp->Update();
}
}
void GameObject::LateUpdate()
{
for (Component* comp : mComponents)
{
comp->LateUpdate();
}
}
void GameObject::Render(HDC hdc)
{
for (Component* comp : mComponents)
{
comp->Render(hdc);
}
}
}
//DirectX_GameObject.h
#pragma once
#include "CommonInclude.h"
#include "DirectX_Component.h"
namespace dir
{
class GameObject
{
public:
GameObject();
~GameObject();
virtual void Initialize();
virtual void Update();
virtual void LateUpdate();
virtual void Render(HDC hdc);
template <typename T>
T* AddComponent()
{
T* newComponent = new T();
newComponent->SetOwner(this);
mComponents.push_back(newComponent);
return newComponent;
}
template <typename T>
T* GetComponent()
{
T* component = nullptr;
for (Component* comp : mComponents)
{
component = dynamic_cast<T*>(comp);
if (component)
break;
}
return component;
}
private:
std::vector<Component*> mComponents;
};
}
3. SpriteRenederer 코드 추가
//DirectX_SpriteRenderer.cpp
#pragma once
#include "DirectX_GameObject.h"
#include "DirectX_Transform.h"
#include "DirectX_SpriteRenderer.h"
namespace dir
{
SpriteRenderer::SpriteRenderer()
{
}
SpriteRenderer::~SpriteRenderer()
{
}
void SpriteRenderer::Initialize()
{
}
void SpriteRenderer::Update()
{
}
void SpriteRenderer::LateUpdate()
{
}
void SpriteRenderer::Render(HDC hdc)
{
//파랑 브러쉬 생성
HBRUSH blueBrush = CreateSolidBrush(RGB(255, 0, 255));
// 파랑 브러쉬 DC에 선택 그리고 흰색 브러쉬 반환값 반환
HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, blueBrush);
HPEN redPen = CreatePen(PS_SOLID, 2, RGB(rand() % 255, rand() % 255, rand() % 255));
HPEN oldPen = (HPEN)SelectObject(hdc, redPen);
SelectObject(hdc, oldPen);
Transform* tr = GetOwner()->GetComponent<Transform>();
Rectangle(hdc, tr->GetX(), tr->GetY(), 100 + tr->GetX(), 100 + tr->GetY());
SelectObject(hdc, oldBrush);
DeleteObject(blueBrush);
DeleteObject(redPen);
}
}
//DirectX_SpriteRenderer.h
#pragma once
#include "DirectX_GameObject.h"
#include "DirectX_Component.h"
namespace dir
{
class SpriteRenderer : public Component
{
public:
SpriteRenderer();
~SpriteRenderer();
void Initialize() override;
void Update() override;
void LateUpdate() override;
void Render(HDC hdc) override;
private:
};
}
4.Player 코드 추가
//DirectX_Player.cpp
#include "DirectX_Player.h"
namespace dir
{
void Player::Initialize()
{
GameObject::Initialize();
}
void Player::Update()
{
GameObject::Update();
}
void Player::LateUpdate()
{
GameObject::LateUpdate();
}
void Player::Render(HDC hdc)
{
GameObject::Render(hdc);
}
}
//DirectX_Player.h
#pragma once
#include "..//DirectX_SOURECE/DirectX_GameObject.h"
namespace dir
{
class Player : public GameObject
{
public:
void Initialize() override;
void Update() override;
void LateUpdate() override;
void Render(HDC hdc) override;
private:
};
}
5.PlayScene코드 수정
#include "DirectX_PlayScene.h"
#include "DirectX_GameObject.h"
#include "DirectX_Transform.h"
#include "DirectX_SpriteRenderer.h"
#include "DirectX_Player.h"
namespace dir
{
PlayScene::PlayScene()
{
}
PlayScene::~PlayScene()
{
}
void PlayScene::Initialize()
{
{
Player* pl = new Player();
Transform* tr = pl->AddComponent<Transform>();
tr->SetPos(800, 450);
tr->SetName(L"TR");
SpriteRenderer* sr = pl->AddComponent<SpriteRenderer>();
sr->SetName(L"SR");
AddGameObject(pl);
}
{
Player* pl = new Player();
Transform* tr = pl->AddComponent<Transform>();
tr->SetPos(300, 450);
tr->SetName(L"TR");
SpriteRenderer* sr = pl->AddComponent<SpriteRenderer>();
sr->SetName(L"SR");
AddGameObject(pl);
}
{
Player* pl = new Player();
Transform* tr = pl->AddComponent<Transform>();
tr->SetPos(100, 650);
tr->SetName(L"TR");
SpriteRenderer* sr = pl->AddComponent<SpriteRenderer>();
sr->SetName(L"SR");
AddGameObject(pl);
}
}
void PlayScene::Update()
{
//부모꺼의 함수 호출
Scene::Update();
}
void PlayScene::LateUpdate()
{
Scene::LateUpdate();
}
void PlayScene::Render(HDC hdc)
{
Scene::Render(hdc);
}
}
결과
반응형
'C++ > 유니티 엔진 모작(일시중지)' 카테고리의 다른 글
[유니티 엔진 제작] 씬 변경 및 초기화 (0) | 2025.02.18 |
---|---|
[유니티 엔진 제작] Vector2, GdiPlus (0) | 2025.02.18 |
[유니티 엔진 제작] Scene 제작 (0) | 2025.02.13 |
[유니티 엔진 제작] GameObject 코드 개선 (0) | 2025.02.13 |
[유니티 엔진 제작] 더블 버퍼링 (0) | 2025.02.11 |