2017-06-24 57 views
0

我有一个奇怪的问题。我已经开始在C++/SFML中实现简单的游戏引擎。 我实现了一个消息和消息队列系统,以便将模块解耦并避免任何令人困惑的依赖关系。我还实现了一个类Entity,它代表游戏中的一个对象(包含它的位置,精灵,等等)。成员函数的不同实现C++

每个实体都有一个叫做“on_message”的函数,当指定的实体接收到消息时,它被消息队列调用。 (例如:如果实体P1是来自P2的消息的目的地,则msg_queue将调用p1.on_message传递msg_type“say damage”给它做某事

我的问题,所有实体(来自类实体的对象)现在有相同的函数on_message的实现,但是这个函数应该不同于实体(因此当按下“say”空间时玩家的行为与敌人不同)

我得到的一个想法是使用继承,但是我认为这是不正确的,如果游戏有100个实体,我应该让100类!

有什么有效的想法可以解决这个问题吗? Th预先安排

+1

“我应该做100班!”?有什么奇怪的呢?它不像编译器变得很累......类可以模拟不同类型的“东西”,所以如果你有100个实体类型,将它们建模为类是不荒谬的。 –

+0

我认为还有另一种方式可以这样做,如果随着游戏组件的增长,类的数量会不断增加? –

+0

玩家与其他玩家有着明显的区别,但其他玩家会如何区别?你可以用数据来模拟这些差异,而不是功能。 – Sopel

回答

0

我得到的一个想法是使用继承,但我认为它不是正确的,就好像游戏有100个实体我应该让100级!

这实际上完全是可能的,它甚至可以是那些定义明确的实体拥有自己的类的“正确的事物”。如果除了消息接收行为之外,您还需要数据成员或其他自定义函数将所有内容封装在一个类中,这是一个好主意。另一方面,如果你有很多非常相似的实体,当接收到一些消息时只有一些行为上的差异,你可能有一个公共的超类,它提供了一个定制点,例如,一个可转让的std::function。事情是这样的:

struct Entity { 
    ... 
    virtual ret on_message(msg_type msg) = 0; 
}; 

... 

struct LightweightCustomEntity : public Entity { 
    std::function<ret(msg_type)> custom_on_message; 

    virtual ret on_message(msg_type msg) override { 
     if(!custom_on_message) return ret(); 
     return custom_on_message(msg); 
    } 
}; 

// ... 

// in reality this would be a smart pointer or whatever 
Entity *e = new LightweightCustomEntity; 
e->custom_on_message = [](msg_type msg) { 
    if(msg.type == SAY_DAMAGE) { 
     return ret(42); 
    } 
    return ret(); 
}; 

这让一些更灵活的运行时,却发现你不是真的获益良多在紧凑 - 尤其是因为C++ 11,我们可以继承构造函数,定义一个新的类从Entity继承并且重写on_message或多或少地使用相同的代码。

+0

对不起,但我只有继承和重写,你能详细解释你在这个代码中做什么? –

+0

什么不清楚? lambda函数? '的std :: function'?看看http://www.cprogramming。COM/C++ 11/C++ 11-λ-closures.html –