2017-03-07 4 views
0

저는 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; 

하지만 지금 EnemyBullet의 업데이트 기능은 사용하지 않는 경우에도 새로운 맵 매개 변수를 사용합니다.

엔티티가 업데이트 메소드에서 필요로하는 다른 모든 객체 또는 변수에 대해서도 마찬가지입니다. 머지 않아 수십 개의 매개 변수 (게임 맵, 다른 엔티티 목록, 게임 상태 정보)가 메소드 정의를 복잡하게합니다.

내 질문은 : 어떻게 이것을 막을 수 있습니까? 나는 유일한 인수로 World에 대한 참조를 전달하려고 시도했지만 원형 종속성이 발생했습니다.

+1

이것은 흥미로운 질문이지만 다소 광범위하고 많은 잠재적 인 해결책이 있습니다. http://gamedev.stackexchange.com/에서 운이 좋을지도 모릅니다. 거기에 [이 질문] (http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity)와 같은 게임 엔진 아키텍처 토론이 많이 있습니다. - 아키텍처). – bejado

+0

순환 적 종속성은 [전달 클래스 선언] (http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration)을 사용하여 관리 할 수 ​​있습니다. – JGroven

+0

[ 전달 선언?] (http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) –

답변

1

나는 Map*Player 클래스에 저장하여 게임에서이 문제를 해결했습니다. 당신이 그것을 바꿀 필요가 없다면 위대한 작품.