게임 프로그래머 입문 올인원 강의 수강 후 복습용으로 작성
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 |