저는 C++로 게임을 제작하기 위해 노력해 왔습니다. World
클래스에는 모든 게임 상태 관련 객체와 기본 게임 루프 함수가 포함됩니다. 내 게임에게임 패턴의 업데이트 방법에 대한 인수
class World {
Clock clock;
Map map;
std::vector<Entity*> entities;
...
모든 개체는 추상 클래스 Entity
에서 상속합니다. 예를 들어
class Player: public Entity {...};
class Enemy: public Entity {...};
class Bullet: public Entity {...};
엔티티는 모든 엔티티들의리스트를 통해 반복하고 각각의 update()
메소드를 호출하여 각 프레임을 업데이트된다.
다양한 프레임 속도를 고려하여 각 프레임의 경과 시간을 float delta
(대부분의 다른 게임 엔진과 마찬가지로)으로 전달합니다. 내가 만나는 문제는 엔티티가 update()
에서 참조 할 필요가있는 모든 다른 것들입니다. 다음과 같이
Entity
클래스는 가상 업데이트 방법을 정의
virtual void update(float delta) = 0;
은 다음과 같습니다 게임 루프에서이 함수를 호출 : 이것은 위대한 작품을
for(int i = 0; i < entities.size(); i++) {
entities[i]->update(clock.get_delta());
}
. 하지만 이제 예를 들어 Player
이 다른 표면에서 더 빠르게 움직일 수있는 기능을 추가하려고한다고 가정 해 봅시다. 플레이어가 어떤 표면에 있는지 알아 보려면 World
클래스에 속한 Map
개체에 액세스해야합니다.
우리는 가상 업데이트 방법에 그것을 추가 할 수
virtual void update(float delta, Map *map) = 0;
하지만 지금 Enemy
및 Bullet
의 업데이트 기능은 사용하지 않는 경우에도 새로운 맵 매개 변수를 사용합니다.
엔티티가 업데이트 메소드에서 필요로하는 다른 모든 객체 또는 변수에 대해서도 마찬가지입니다. 머지 않아 수십 개의 매개 변수 (게임 맵, 다른 엔티티 목록, 게임 상태 정보)가 메소드 정의를 복잡하게합니다.
내 질문은 : 어떻게 이것을 막을 수 있습니까? 나는 유일한 인수로 World
에 대한 참조를 전달하려고 시도했지만 원형 종속성이 발생했습니다.
이것은 흥미로운 질문이지만 다소 광범위하고 많은 잠재적 인 해결책이 있습니다. http://gamedev.stackexchange.com/에서 운이 좋을지도 모릅니다. 거기에 [이 질문] (http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity)와 같은 게임 엔진 아키텍처 토론이 많이 있습니다. - 아키텍처). – bejado
순환 적 종속성은 [전달 클래스 선언] (http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration)을 사용하여 관리 할 수 있습니다. – JGroven
[ 전달 선언?] (http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) –