반응형

책의 소스 코드를 직접 작성해보면서 정리한 글입니다. (실습환경: windows)
책 소스 코드: GitHub - gameprogcpp/code: Game Programming in C++ Code
1. Actor 역할(기능)
게임을 구성하는 객체를 표현하기 위한 기본 클래스이다.
| 기능 | 설명 |
| Component 관리(추가, 삭제, 업데이트) | Component에 의해서 Actor의 역할 및 기능이 달라진다 |
| Transformation(위치, 크기, 회전) 관리 | 게임에 객체를 나타내기 위한 정보 |
2. Structure.hpp
Vector2 구조체를 별도 헤더로 만들었다.
#pragma once
struct Vector2
{
float x, y;
};
3. Actor.hpp
#pragma once
#include <vector>
#include "Structure.hpp"
class Actor
{
public:
Actor(class GameManager* gm);
~Actor();
// Update function called from Game Manager (not overridable)
void update(float delta_time);
// Add/remove components
void addComponent(class Component* comp);
void removeComponent(class Component* comp);
//getter, setter
const Vector2 getPosition() const;
void setPosition(float x, float y);
const float getscale() const;
void setScale(float scale);
const float rotation() const;
class GameManager* getGameManager() const;
private:
// Updates all the components attached to the actor (not overridable)
void updateComponents(float delta_time);
// Transform
Vector2 _position;
float _scale;
float _rotation;
std::vector<class Component*> _components;
std::vector<class Component*> _pending_components;
class GameManager* _game_manager;
};
4. Actor.cpp
생성자를 보면, Game Manager를 전달 받고, 이를 통해 Game Manager에게 자신(Actor)을 등록함을 알 수 있다.
Actor가 생성되면 자동으로 Game Manager에게 등록하는 구조로, 중요한 포인트이다.
Component 역시 동일한 방법으로 Actor에게 자동으로 등록하고,
Sprite의 경우 Actor와 Game Manager 양쪽에 자동으로 등록한다.
#include <algorithm>
#include "GameManager.hpp"
#include "Component.hpp"
#include "Actor.hpp"
Actor::Actor(GameManager* gm) : _game_manager(gm), _position{ 0.0f, 0.0f }, _scale(1.0f), _rotation{ 0.0f }
{
_game_manager->addActor(this);
}
Actor::~Actor()
{
while (!_components.empty())
{
delete _components.back();
}
}
void Actor::update(float delta_time)
{
updateComponents(delta_time);
}
void Actor::updateComponents(float delta_time)
{
for (const auto& comp : _components)
{
comp->update(delta_time);
}
}
void Actor::addComponent(class Component* comp)
{
_components.emplace_back(comp);
}
void Actor::removeComponent(class Component* comp)
{
auto iter = std::find(_components.begin(), _components.end(), comp);
if (iter != _components.end())
{
_components.erase(iter);
}
}
const Vector2 Actor::getPosition() const
{
return _position;
}
void Actor::setPosition(float x, float y)
{
_position.x = x;
_position.y = y;
}
const float Actor::getscale() const
{
return _scale;
}
void Actor::setScale(float scale)
{
_scale = scale;
}
const float Actor::rotation() const
{
return _rotation;
}
GameManager* Actor::getGameManager() const
{
return _game_manager;
}반응형
'Game Programming in C++' 카테고리의 다른 글
| Game Programming in C++ Chapter2 - Sprite Component (0) | 2025.09.06 |
|---|---|
| Game Programming in C++ Chapter2 - Component (0) | 2025.09.06 |
| Game Programming in C++ Chapter2 - Game Manager (0) | 2025.09.05 |
| Game Programming in C++ Chapter2 - 컴포넌트 기반 게임 객체 (0) | 2025.09.01 |
| Game Programming in C++ Chapter2 - Animation (0) | 2025.08.31 |