首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏引擎设计问题

游戏引擎设计问题
EN

Stack Overflow用户
提问于 2017-07-26 23:58:12
回答 1查看 51关注 0票数 2

我正在开发一个使用ECS的游戏引擎。我的问题是如何产生一个实体。我的想法是,我有一个方法,它接受一个实体作为参数,创建这个实体的克隆,从克隆中检索所有指针组件,并将它们放在各自的系统中进行更新:

代码语言:javascript
复制
Entity & Scene::spawnEntity(Entity entity) {

    Entity clone = Entity(entity);

    Transform* transform = clone.getComponent<Transform>();
    Drawable* drawable = clone.getComponent<Drawable>();
    Collidable* collidable = clone.getComponent<Collidable>();
    Scriptable* scriptable = clone.getComponent<Scriptable>();

    if (transform != nullptr) {
        _transformSystem.add(*transform, _currentId);
    }
    if (drawable != nullptr) {
        _drawableSystem.add(*drawable, _currentId);
    }
    if (collidable != nullptr) {
        _collidableSystem.add(*collidable, _currentId);
    }
    if (scriptable != nullptr) {
        scriptable->assignCallbacks([&](Entity entity)                              -> Entity&              { spawnEntity(entity); },
                                    [&](Entity entity)                                                      { destroyEntity(entity); },
                                    [&](std::vector<std::string> tags)              -> Entity&              { findEntity(tags); },
                                    [&](std::vector<std::vector<std::string>> tags) -> std::vector<Entity>& { findEntities(tags); });
        _scriptableSystem.add(scriptable, _currentId);
    }

    _entities.push_back(clone);

    _currentId++;
}

这里的问题是其中一个组件,即scriptable是一个纯粹的抽象类(它有一个initiate方法和update方法,开发人员使用它们在派生类中创建行为)。这使得引擎不能自动克隆可编写脚本的类,克隆必须在派生类中完成,例如:

代码语言:javascript
复制
class PlayerScript : public Scriptable
{
public:
    void init() override;
    void update() override;
    PlayerScript* clone() override;
};


PlayerScript * PlayerScript::clone()
{
    return new PlayerScript(*this);
}

我不希望用户必须为他或她创建的每个脚本创建一个clone方法,我认为它应该由引擎自动处理。但我想不出怎么做才能不一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-27 01:09:25

只要玩家的脚本是可复制构造的,并且您可以通过复制构造函数来克隆它们,您就可以使用CRTP和如下所示的中间类(最小的工作示例):

代码语言:javascript
复制
struct BaseScriptable {
    virtual ~BaseScriptable() = default;
    virtual BaseScriptable * clone() = 0;
    virtual void update() = 0;
};

template<typename D>
struct Scriptable: BaseScriptable {
    BaseScriptable * clone() override final {
        return new D{*static_cast<D *>(this)};
    }
};

struct PlayerScript: Scriptable<PlayerScript> {
    void update() override {}
};

int main() {
    BaseScriptable *script = new  PlayerScript;
    BaseScriptable *clone = script->clone();
}

如果复制构造函数不足以克隆播放器脚本,那么,这意味着您没有足够的信息来克隆它。因此,定义脚本的开发人员还必须定义一个克隆例程,以便为您提供适当的副本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45332006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档