본문 바로가기

Game Programming in C++ Chapter2 - Actor

반응형

 

 

산자이 마드하브 저 / 박주항 역 ❘ 에이콘

 

책의 소스 코드를 직접 작성해보면서 정리한 글입니다. (실습환경: 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;
}
반응형