[게임 프로그래밍 패턴] 9. 업데이트 메서드 패턴

WIGWAG·2023년 3월 16일

의도

컬렉션에 들어 있는 객체별로 한 프레임 단위의 작업을 진행하라고 알려줘서 전체를 시뮬레이션한다.

설명

게임 월드는 객체 컬렉션을 관리한다. 각 객체는 한 프레임 단위의 동작을 시뮬레이션하기 위한 업데이트 메서드를 구현한다. 매 프레임마다 게임은 컬렉션에 들어 있는 모든 객체를 업데이트한다.

주의사항

  1. 코드를 한 프레임 단위로 끊어서 실행하는 게 더 복잡하다.
  2. 다음 프레임에서 다시 시작할 수 있도록 상태를 저장해야 한다.
  3. 모든 객체는 매 프레임마다 시뮬레이션되지만 진짜 동시에 되는 건 아니다.
  4. 업데이트 도중에 객체 목록을 바꾸는 건 조심해야 한다.

예제코드

#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_;
};
profile
프로그래밍 공부 기록 노트

0개의 댓글