我正在尝试将我的游戏引擎从Java移植到C ++,以便我使用更多最新版本的OpenGL。虽然它通常是一个非常流畅的过程(尽管使用C ++的经验很少),但在尝试移植 SceneNode 类时遇到了问题。
SceneNode类用于通过将父节点和子节点集合存储为成员来创建场景图。在Java中,SceneNode可以将另一个SceneNode(例如子节点)作为成员使用。但是,如果不使用指针,这在C ++中是不可能的。
所以,我的问题基本归结为:将SceneNode(或其集合)存储为另一个SceneNode成员的推荐方法是什么?
下面是一个草稿工具的示例,展示了我想要实现的目标的总体思路:
class SceneNode
{
public:
//...
// constructor, destructor etc
//...
void render(); // will call render() for each child node
void addChild(SceneNode* child);
private:
SceneNode* parent;
std::vector<SceneNode*> children;
//...
// other members such as model data, transformation matrix etc
}
以上肯定不是一成不变的,我非常欢迎提出建议,这纯粹是为了示范。如果任何建议的实现需要额外的关注,例如专门的复制构造函数或析构函数,那么对我来说也是有用的。
我假设我需要使用new
关键字来生成指针,如果可能的话,可能还有智能指针,但我是C ++风格内存管理的初学者,所以任何帮助都会非常感激。
答案 0 :(得分:-1)
指针是实现您想要做的事情的好方法。我认为你拥有的正是你需要开始的。
仅仅因为您使用指针并不意味着您需要使用“new”动态创建SceneNode(尽管这是最简单的入门方式)。您可以使用节点池,或者从静态分配的节点创建指针。
我喜欢做的是创建两个函数 - 类似于:
SceneNode * Alloc_SceneNode();
void Dealloc_SceneNode(SceneNode *node);
或者它们可以被称为CreateNode()和DestroyNode(),无论你想要什么术语。完成后,使用这些函数获取新节点并返回节点。在幕后,他们可以称之为“新”和“删除”,但将来如果您想切换到节点池(我建议用于游戏开发),很容易编辑这两个功能和繁荣。您的整个SceneGraph不再动态分配,它使用您想要的任何内存管理模式。
哦是的,如果您使用new,请确保在完成后删除节点。对树状结构(如树)执行此操作的最简单方法是(在SceneNode的析构函数中)对所有子项调用delete。