2

我正在创建一个塔防游戏。在创建关卡之前,我需要在内存中准备好有关怪物、塔等的统计信息。例如:

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);
}

现在的问题是我需要为塔和所有其他游戏元素创建相同的功能。这似乎有很多重复。

另一个想法

我将所有构造函数保密。创建一个(单例?)工厂类,让它成为所有类的朋友,让它创建所有对象。工厂将在创建时进行初始化。

GOF 模式

我查看了其他创作模式,但似乎没有一个适合。或者我只是不够了解他们。

4

1 回答 1

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);
    }

    //...
}

您还可以为您的实体添加子类并将方法设为GetEntityFabric 方法。

于 2013-04-28T23:08:04.633 回答