我正在为大型项目创建一个简单的编程练习游戏,目前我正处于十字路口。
游戏使用树形图结构来存储游戏的所有实体,所有实体都从名为TreeNode的基类扩展,该基类实现了一些基本功能,例如将子项与自身连接和分离以及它们在2D世界中的位置。 / p>
我的问题是我想要创建一种“动作节点”,在与玩家发生碰撞时允许发生各种事件,例如更改正在播放的歌曲,触发暂停以及随后的对话,结束舞台等等
我的问题是,我将如何以一种体面的方式实现这一点,而这种方式并没有超过我对血腥纸浆进行代码隔离的努力?我正在考虑使用std :: function成员创建一个新类,我可以编程来执行我想要它做的事情,但这种方式意味着通过将其引用到包含所有数据的主类来完全破坏代码封装在整个游戏中。
Collision目前实现如下:
std::vector<std::pair<&TreeNode, &TreeNode>> vCollision;
MasterNode.checkCollision(vCollision);
通过对向量的引用调用checkCollision,在图的其余部分上递归调用碰撞检查,并使用已碰撞的不同实体对填充向量。 (这是在更新循环中。) 我还需要找出一种能够从此列表中调用所述std :: function的方法,因为指向基类的指针无法访问派生类的成员。
答案 0 :(得分:0)
树结构是可以与不同数据类型一起使用的容器。因此,它是模板的理想选择。
由于您的树工作正常,因此将数据类型分解为模板参数 例如,给定一个节点:
struct Tree_Node
{
struct Tree_Node * left_subtree;
struct Tree_Node * right_subtree;
Some_Data_Type node_data;
};
您可以使用模板分解数据类型:
template <class Node_Data_Type>
struct Tree_Node
{
struct Tree_Node * left_subtree;
struct Tree_Node * right_subtree;
Node_Data_Type node_data;
};
您可以将树节点声明为:
struct Player_Data;
Struct Moves_Data;
struct Tree_Node<Player_Data>; // For a tree of Player_Data
struct Tree_Node<Moves_Data>; // For a tree of Moves_Data
另一种方法是对节点数据使用继承。
struct Node_Data_Base
{
virtual bool is_equal(Node_Data_Base * p_node) const = 0;
virtual bool is_less(Node_Data_Base * p_node) const = 0;
bool operator==(Node_Data_Base * p_node) const
{
return is_equal(p_node); // Dispatch to child.
}
bool operator<(Node_Data_Base * p_node) const
{
return is_less(p_node); // dispatch to child.
}
};
struct Tree_Node_Inheritance
{
struct Tree_Node * left_subtree;
struct Tree_Node * right_subtree;
Node_Data_Base * p_data;
};
另外,请查看std::map
数据类型。