我正在制作塔防游戏。在创建关卡之前,我需要在内存中准备好关于怪物,塔等的统计数据。例如:
fastmonster.name = "Rabbit";
fastmonster.health = 100;
fastmonster.speed = 10;
slowmonster.name = "Turtle";
slowmonster.health = 500;
slowmonster.speed = 2;
塔和其他东西也一样。
(我还没有决定如何从文件中详细阅读。)
如何在创建怪物或塔类对象之前确保所有这些数据都已准备就绪?我正在寻找一种设计模式,它允许我全局初始化所有数据,并允许我使用常规构造函数创建怪物对象。同时,它应该确保在读取单位统计数据之前没有创建任何对象。
我确信这个问题已经解决了一百万次,但到目前为止我找不到任何真正适合这个问题的解决方案,并且不是一个具有多个抽象级别的超级复杂问题。
到目前为止我的解决方案
我将构造函数设为私有,并定义了一个create()
函数,看起来像这个
Monster Monster::create (MonsterType type) {
if (!initialized()) {
initialize();
initialized = true;
}
return new Monster(type);
}
现在的问题是我需要为塔和所有其他游戏元素创建相同的功能。这似乎有很多重复。
另一个想法
我将所有构造函数保密。创建一个(singleton?)工厂类并使其成为所有类的朋友,并让它创建所有对象。 Factory将在创建时进行初始化。
GOF模式
我看了其他创作图案,但似乎没有一个适合。或者我只是不太了解它们。
答案 0 :(得分:0)
我认为你的解决方案很棒。
您可以使用模板方法 GOF模式对其进行改进,以避免重复。
不幸的是我不知道它是如何在c ++中实现的,但在c#中它可以是以下内容:
public abstract class BaseEntity<T>
{
private bool initialized = false;
public BaseEntity<T> Create(T typeOfEntity)
{
if (!Initialized())
{
Initialize();
initialized = true;
}
return GetEntity(typeOfEntity);
}
protected abstract void Initialize();
protected abstract bool Initialized();
protected abstract BaseEntity<T> GetEntity(T typeOfEntity);
}
public class MonsterEntity:BaseEntity<MonsterType>
{
//...
public MonsterEntity(MonsterType typeOfEntity)
{
//...
}
protected override void Initialize()
{
//initialize logic
}
protected override bool Initialized()
{
bool initialized = false;
//check for initialization
return initialized;
}
protected override BaseEntity<MonsterType> GetEntity(MonsterType typeOfEntity)
{
return new MonsterEntity(typeOfEntity);
}
//...
}
您还可以为entites添加子类,并使方法GetEntity
成为Fabric方法。