게임 엔진/Window API

[Window API] Object 설계

Henzee 2025. 2. 17. 23:17

 

게임 프로그래머 입문 올인원 강의 수강 후 복습용으로 작성

 

 

 

1. Object 관련 클래스 추가

1) Types.h에 Stat struct 추가

// Types.h

struct Stat
{
	int32 hp = 0;
	int32 maxHp = 0;
	int32 speed = 0;
};

 

2) Object : ObjectType 추가, 순수 가상 함수 추가(인터페이스 역할)

// Object.h

#pragma once

enum class ObjectType
{
	None, 
	Player,
	Monster,
	Projectile,

};

class Object
{
public:
	Object();
	Object(ObjectType type);
	virtual ~Object();

	virtual void Init() abstract;
	virtual void Update() abstract;
	virtual void Render(HDC hdc) abstract;

public:
	ObjectType GetObjectType() const { return _type; }

	Pos GetPos() { return _pos; }
	void SetPos(Pos pos) { _pos = pos; }

protected:
	ObjectType _type = ObjectType::None;
	Stat _stat = {};
	Pos _pos = {};

};

 

3) Player

  • Init() : Stat과 Pos 정보 초기화
  • Update() : DevScene::Update()의 Player 이동 로직 이동, 미사일 발사 로직 추가
// Player.h

#pragma once
#include "Object.h"
class Player :
    public Object
{
public:
	Player();
	virtual ~Player() override;

	virtual void Init() override;
	virtual void Update() override;
	virtual void Render(HDC hdc) override;
};

 

4) Monster

// Monster.h

#pragma once
#include "Object.h"
class Monster :
    public Object
{
public:
	Monster();
	virtual ~Monster() override;

	virtual void Init() override;
	virtual void Update() override;
	virtual void Render(HDC hdc) override;
};

 

5) Missile

  • Init() : Stat과 Pos 정보 초기화
  • Update() : 미사일 발사 로직, 오브젝트 충돌 처리
// Missile.cpp

void Missile::Init()
{
	_stat.hp = 1;
	_stat.maxHp = 1;
	_stat.speed = 600;
}

void Missile::Update()
{
	float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();

	_pos.y -= deltaTime * _stat.speed;

	// 충돌
	const vector<Object*> objects = GET_SINGLE(ObjectManager)->GetObejcts();
	for (Object* obj : objects)
	{
		if (obj == this)
			continue;

		if (obj->GetObjectType() != ObjectType::Monster)
			continue;

		Pos p1 = GetPos();
		Pos p2 = obj->GetPos();

		const float dx = p1.x - p2.x;
		const float dy = p1.y - p2.y;
		float dist = sqrt(dx * dx + dy * dy);

		if (dist < 25)
		{
			GET_SINGLE(ObjectManager)->Remove(obj);
			GET_SINGLE(ObjectManager)->Remove(this);
			return;
		}

	}

	if (_pos.y < -200)
	{
		GET_SINGLE(ObjectManager)->Remove(this);

		return;
	}
}

 

 

 

2. ObjectManager 클래스 : Object 생성, 추가, 삭제 등의 기능

// ObjectManager.h

#pragma once

class Object;

class ObjectManager
{
	DECLARE_SINGLE(ObjectManager);

	~ObjectManager();

	void Add(Object* object);
	void Remove(Object* object);
	void Clear(); // delete

	const vector<Object*>& GetObejcts() { return _objects; }

	template<typename T>
	T* CreateObject()
	{
		// type trait
		static_assert(std::is_convertible_v<T*, Object*>);

		T* object = new T();
		object->Init();

		return object;
	}

private:
	vector<Object*> _objects;
};

 

 

 

3. GameScene 클래스 : ObjectManager 를 활용한 Object 처리

  • Init() : Player와 Monster 생성 및 오브젝트 목록에 추가
  • Update() : Object를 가져와서 Update() 실행 → 참조값이 아닌 복사를 해서 오브젝트 사용(오류 방지)
  • Render() : Object를 가져와서 Render() 실행
// GameScene.cpp

void GameScene::Init()
{
	{
		Player* player = GET_SINGLE(ObjectManager)->CreateObject<Player>();
		player->SetPos(Pos{ 400, 400 });
		GET_SINGLE(ObjectManager)->Add(player);
	}
	
	for (int i = 0; i < 5; i++)
	{
		Monster* monster = GET_SINGLE(ObjectManager)->CreateObject<Monster>();
		monster->SetPos(Pos{ static_cast<float>(i + 1) * 100, 100 });
		GET_SINGLE(ObjectManager)->Add(monster);
	}
}

void GameScene::Update()
{
	const vector<Object*> objects = GET_SINGLE(ObjectManager)->GetObejcts();
	for (Object* obj : objects)
		obj->Update();
}

void GameScene::Render(HDC hdc)
{
	const vector<Object*>& objects = GET_SINGLE(ObjectManager)->GetObejcts();
	for (Object* obj : objects)
		obj->Render(hdc);
}

 

 

 

4. 폴더 구조

 

 

'게임 엔진 > Window API' 카테고리의 다른 글

[Window API] 포트리스 모작  (0) 2025.03.03
[Window API] Resource  (0) 2025.02.18
[Window API] 프레임워크 제작 2  (0) 2025.02.15
[Window API] 프레임워크 제작  (0) 2025.02.14
[Window API] 기본 템플릿 코드  (0) 2025.02.14