컬렉션에 들어 있는 객체별로 한 프레임 단위의 작업을 진행하라고 알려줘서 전체를 시뮬레이션한다.
게임 월드는 객체 컬렉션을 관리한다. 각 객체는 한 프레임 단위의 동작을 시뮬레이션하기 위한 업데이트 메서드를 구현한다. 매 프레임마다 게임은 컬렉션에 들어 있는 모든 객체를 업데이트한다.
#include <iostream>
using namespace std;
class Entity {
public:
Entity() {}
virtual ~Entity() {}
//업데이트를 가상함수로 설정
virtual void update() = 0;
double x() const { return x_; }
double y() const { return y_; }
void setX(double x) { x_ = x; }
void setY(double y) { y_ = y; }
private:
double x_ = 0;
double y_ = 0;
};
class World {
public:
World() : numEntities_(0) {}
void gameloop();
private:
Entity* entities_[MAX_ENTITIES];
int numEntities_;
};
void World::gameloop() {
while (true)
{
//유저 입력 처리 ...
//각 개체를 업데이트한다.
for (int i = 0; i < numEntities_; ++i) {
entities_[i]->update();
}
//물리, 렌더링 ...
}
}
class Skeleton : public Entity {
public:
Skeleton() : patrollingLeft_(false) {}
virtual void update() {
if (patrollingLeft_) {
setX(x() - 1);
if (x() == 0) patrollingLeft_ = false;
}
else
{
setX(x() + 1);
if (x() == 100) patrollingLeft_ = true;
}
}
private:
bool patrollingLeft_;
};
class Statue : public Entity {
public:
Statue(int delay) :frames_(0), delay_(delay) {}
virtual void update() {
if (++frames_ == delay_) {
ShootLightning();
frames_ = 0;
}
}
private:
int frames_;
int delay_;
};