2011-02-26 2 views
1

나는 지금 게임을 만들고 있고 거의 모든 것이 자신의 클래스를 가지고 있습니다. 내가 가지고있는 주된 수업은 나의 'Level'과 'Object'수업입니다. 레벨 클래스에는 레벨의 모든 이미지에 대한 이미지가 포함되어 있으며, Object 클래스에는 화면의 각 객체에 대한 이미지가 포함되어 있습니다 (객체는 플레이어, 적, 항목 등).프로그램의 어느 곳에서나 변수에 액세스 할 수있는 가장 좋은 방법은 무엇입니까?

지금 당장 가지고있는 방법은 Object 클래스에 Image가 있고 새 객체를 만들 때 새 이미지를로드하는 것입니다. 그래서 같은 이미지를 사용하는 두 개의 적을 가지고 있다고 가정 해 봅시다. 객체의 두 인스턴스가 모두 이미지를로드하고 메모리에 동일한 이미지가 두 개있을 것입니다. 이것은 정말 나쁜 생각처럼 보이고 나중에 게임이 더 복잡 해지면 속도가 느려질 것입니다.

그래서 저는 모든 이미지를 보유 할 수있는 Resource Manager 클래스와 같은 것을 가지고 있으며, 각 개체가 리소스 관리자에게 필요한 이미지를 요청할 것이라고 생각했습니다. 그렇게하면 각 이미지를 한 번만 저장하고 공간을 절약 할 수 있습니다.

Object 클래스의 정적 변수를 사용하면 쉽게이 작업을 수행 할 수 있지만 Level 클래스도 이미지를 사용해야하므로 Resource Manager에 대한 액세스가 필요합니다. 오브젝트/레벨 (또는 나중에 필요로하는 다른 클래스)의 각 인스턴스에 자원 관리자에 대한 포인터를 보내고 그런 식으로 액세스하는 것이 가장 좋을까요? 아니면 이것을 할 수있는 더 좋은 방법이 있을까요?

+1

가장 좋은 방법은 (일반적으로) 이러한 변수가없는 것입니다. – delnan

답변

3

당신은 일반적으로 피해야한다 "어디서든 접근 할 변수 만들기"- 이유를 here를 참조하십시오.

귀하의 경우, ResourceManager를 모든 곳에서 액세스 할 수있게 만드는 것이 바람직하지 않습니다. 포스트에서 말하는 것처럼 당신이 할 것을 제안합니다 - 모든 게임 객체가 리소스 관리자에 대한 포인터를 유지하게하십시오.

나중에 게임 개체가 다른 핵심 개체에 대해서도 알아야 할 수도 있습니다. 예를 들어 게임 객체는 중앙 게임 상태에서 메소드를 호출해야 할 수 있습니다.

class Core { 
    public: 
    ... 
    ResourceManager& resourceManager(); 
    GameState& currentGame(); 
    // and so on 
}; 

을 그리고 당신의 기본 게임 오브젝트 클래스는 단지의 핵심 포인터를 유지 : 그럼이 같은 기본 클래스를 만드는 것이 좋습니다.

Core core; // performs some initialization 
core.startGame(); 
Enemy enemy(&core); // it's easy to pass the core to the game object 

는 생성자의 핵심 &을 필요로하는 기본 게임 오브젝트 클래스가 있고, 보호 Core& GameObject::core() 기능을 제공 : 그럼 당신은이 같은 게임의 개체를 만들 수 있습니다.

+0

전 세계 곳곳의 컨텍스트에 대한 참조를 전달하지 않을 것을 제안합니다. 이렇게하면 모든 서비스에 쉽게 액세스 할 수 있으며 이로 인해 많은 의존성과 스파게티 코드가 생길 수 있습니다. – david

1

나는 내가 이런 식으로 할 것이라고 생각 :

1) 당신이 필요로하는 모든 것을로드에 대한 책임을 자원 관리자 클래스가 있습니다.

2) 각 객체 (이미지 또는 다른 것)은 같은 것을 할 수 있도록하기 위해, 관련 문자열이 있습니다

관리자 -> setResource ("levelImage");

registerResource는 freeResource 등 원하는대로 사용할 수 있습니다. 당신은 쉽게 당신이 필요로하는 모든 액세스 할 수 있습니다

이 방법은 내가 :)

+0

이 방법을 권하고 싶습니다. 내 개인 프로젝트에서 매일 사용합니다. –

3

이러한 문제는 일반적으로 싱글 톤 패턴으로 해결된다 생각합니다. 패턴의 특정 버전을 적용하기 전에 패턴이 갖는 다양한 문제를 검토하십시오.

+0

싱글 톤 안티 패턴 문제를 검토하기위한 +1 –

0

싱글 톤 패턴을 사용하면됩니다. 보통 나중에 서브 클래 싱하는 일반 싱글 톤 클래스를 만듭니다. 이런 식으로 뭔가 :

template<class Derived> 
    class Singleton 
    { 

     public: 

      static Derived& instance(); 

     protected: 

      Singleton() {}; 


     private: 

      Singleton(const Singleton&) {}; 

      Singleton& operator=(const Singleton&) { return *this; }; 

     private: 

      static std::auto_ptr<Derived> _instance; 
    }; 

그런 다음 자원 클래스가 수행 할 수

class ResourceManager : public Singleton<ResourceManager> 
{ 

    public: 

     friend class Singleton<ResourceManager>; 

    protected: 

     ResourceManager() {}; 
}; 
+0

멀티 스레드 응용 프로그램의 경우 적절한 잠금 장치가 있는지 확인하십시오. –

관련 문제