我现在正在制作游戏,而且几乎所有东西都有自己的类。我觉得我遇到问题的主要课程是我的'Level'和'Object'类。关卡类包含关卡中每个图像的图像,Object类包含屏幕上每个对象的图像(对象几乎是任何东西:你的玩家,敌人,物品等)。
我现在拥有的方式是Object类有一个Image,当你创建一个新对象时,你会在其中加载一个新图像。所以假设你有两个敌人使用相同的图像,对象的两个实例将分别加载图像,我将在内存中有两个相同的图像。这似乎是一个非常糟糕的主意,后来当我的游戏变得更复杂时,它会减慢很多。
所以我正在考虑做的事情就是拥有一个资源管理器类来保存所有图像,而且每个对象都会向资源管理器询问它所需的图像。这样它只会存储每个图像一次并节省一些空间。
我可以使用Object类中的静态变量轻松完成此操作,但由于Level类还需要使用图像,因此还需要访问资源管理器。是否最好将一个指向资源管理器的指针发送到一个对象/级别的每个实例(或者我后来需要它的任何其他类)并以这种方式访问它?或者有更好的方法来做到这一点吗?
答案 0 :(得分:3)
这些问题通常用单例模式解决。在应用任何特定版本之前,请务必查看模式所具有的各种问题。
答案 1 :(得分:3)
您通常应该避免“让变量可以从任何地方访问” - 请参阅here了解原因。
在您的情况下,这意味着从任何地方访问ResourceManager都是一个坏主意。我建议你按照你在帖子中所说的做 - 让每个游戏对象保持指向资源管理器的指针。
将来可能会发现您的游戏对象需要了解其他核心对象。例如,您的游戏对象可能需要在中央游戏状态下调用方法。那么创建一个这样的核心类是有意义的:
class Core {
public:
...
ResourceManager& resourceManager();
GameState& currentGame();
// and so on
};
你的基础GameObject类只保留一个指向核心的指针。然后你可以创建这样的游戏对象:
Core core; // performs some initialization
core.startGame();
Enemy enemy(&core); // it's easy to pass the core to the game object
让基础GameObject类需要Core&在其构造函数中,并提供受保护的Core& GameObject::core()
函数。
答案 2 :(得分:1)
我想我会这样做:
1)让资源管理器类负责加载你需要的所有东西。
2)每个对象(图像或其他任何对象)都有一个关联的字符串,以便能够执行以下操作:
管理器 - > setResource( “levelImage”);
可以使用registerResource,freeResource或其他任何你喜欢的东西。
通过这种方式,您可以轻松访问我想要的所有内容:)
答案 3 :(得分: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() {};
};