【发布时间】:2016-10-04 20:07:09
【问题描述】:
我想尽可能笼统地表达这个问题,但它确实与我正在编程的游戏有关。
我有一个具有 std::map 成员的类:
class Player {
...
private:
std::map<Action, Command> mActionBinding;
...
}
Action 是 Player 类中的枚举。它包含动作标题,例如 MoveLeft 或 MoveRight。 Command 是一个包含函数和类别的结构体。
struct Command
{
Command();
std::function<void(SceneNode&, sf::Time)> action;
unsigned int category;
// SceneNode& node
};
这个系统背后的想法是,我可以将一个函数绑定到一个 SceneNode 类别(我的游戏中的一个可绘制对象)。游戏的 update() 将遍历我游戏中的所有 SceneNode,如果 SceneNode 的类别与命令中的类别匹配,则在 SceneNode 上执行命令。 (如果这一切听起来很熟悉,这是 SFML 的 GQE 引擎,源代码可以在这里找到:https://github.com/LaurentGomila/SFML-Game-Development-Book)
我希望命令比这个实现更具体。如果 SceneNode 与命令指定的匹配,我希望在 SceneNode 上执行命令,而不仅仅是类别比较。
但是,命令是在这个 Player 类中创建的,并且它们是在那个 std::map 中创建的。玩家的构造函数调用了一个 initializeAction() 函数,该函数调用如下:
mActionBinding[MoveLeft].action =
derivedAction<SpaceCraft>(SpaceCraftMover(-playerSpeed, 0.f));
基本上,它为一些操纵航天器节点的函数设置动作。稍后在 Player 构造函数中,mActionBinding 的命令类别设置如下:
for(auto& pair : mActionBinding)
pair.second.category = Category::PlayerSpaceCraft;
我的问题:Command 的构造函数在我看不到的地方被调用。我想更改 Command 的构造函数以接受 SceneNode&,这样我就可以将其设置为 SpaceCraft 节点(将 unsigned int 替换为注释的 SceneNode&)。如何以可以看到 Command(SceneNode&) 的方式创建这些命令,从而能够正确设置它?换句话说,我怎样才能得到这个:
Command::Command(SceneNode& n)
: action()
// , category(Category::None)
, node(n)
{}
目前在 stl_map.h 中给我一个我不理解的错误,可能是因为在 Player 的函数中调用了 Command 构造函数不正确
提前致谢,抱歉这个冗长的问题,但我认为上下文是必要的。
【问题讨论】:
标签: c++ struct constructor sfml stdmap