C++实现赛车游戏树

9
我正在使用Glut和OpenGL构建一款赛车游戏,但在细节方面有些迷茫。首先,任何建议或路线图都将非常棒。
到目前为止,我正在考虑以下内容:
1. 变换的树实现。 2. 模拟动力学。 3. 碰撞检测的八叉树实现。 4. 实际的碰撞检测。 5. 在Maya中建模并将其导出为.OBJ文件。 6. 使用GLSL或类似技术提高游戏的图形质量。
注:(*)我不确定这两个的顺序。
所以我从模拟动力学开始,没有进行树的实现,结果对我来说是一个巨大的混乱。您能否想到一些东西,可以帮助我构建这样的树来用于赛车游戏?
我想到了这样的东西,但不知道如何实现。
红色是静态节点,黄色是动态节点

9
我不理解你在问什么。你是在问数据结构吗?你是在询问如何将问题分解成部分吗?还是像标签所示,关于OpenGL的问题?请说明清楚。 - Pavel Radzivilovsky
第一部分是关于制作3D游戏的一般步骤。第二部分(带有树的部分)询问如何在C++中编写这样的树,因为它不是二叉树或四叉树等。 - hevele
3
我建议把问题(和问题本身)分成若干部分来解决。 - Pavel Radzivilovsky
如果你想做一个游戏,那么你需要一个引擎专家。因此,你需要有场景图形和父子节点等。否则,一切都会变得混乱。现在有很多开源的3D引擎可以供你参考。 - Michael IV
这是一个课程项目,所以我们必须使用OpenGL,不用其他的。 - hevele
这是一个课程项目,所以我们必须使用OpenGL,无其他选择。那么StackOverflow对此限制有免疫力吗? - WhozCraig
3个回答

10
我建议与@bezad完全相反。
从一个单一的汽车和一个无限的道路开始。
将渲染和动力学问题拆分为两个完全不同的事物。公共的“Car”更新和/或是“CarRenderModel”和“CarPhysicsModel”的链接。
“Car”放入GL场景中的形状由“Car”决定。
在其他事情中,这意味着您可以在屏幕上显示一个非常简单的“Car”,并附加一个非常简单的物理模型,而不必将两者绑定在一起,从而使“Car”变得更漂亮或物理行为更好。在每个阶段,您都有一个可玩的东西。
所以,汽车是一个长5宽3高1单位的矩形。道路宽13个单位,永无止境。静态相机。也许是地平线。第一个物理模型是火箭船,在其中每秒钟按下箭头键,汽车获得x单位/秒的速度。请注意,此汽车不会旋转-它是轴对齐的。如果汽车离开道路,它会爆炸,游戏就结束了。
现在,您在屏幕上有了一个响应用户输入的东西。您可以花时间制作更漂亮的汽车模型(轮子等),或者改进汽车物理和控制模型(方向!角度!制动!≠加速!),或者使环境更有趣(添加黑白条纹,以便您可以在道路边缘看到速度。 道路附近的非公路部分,或者会导致汽车爆炸的树木),或者让摄像机更有趣(比如,它留在汽车后面,看着它的肩膀)。
现在,对于动力学,我将使用与汽车-汽车交互不同的代码来处理宇宙-汽车交互,只是为了保持我的理智。汽车无法修改环境。
这意味着您可以更轻松地编写大量汽车-宇宙交互,而不是汽车-汽车交互。
...
在C++中构建任意树很容易。
#include <vector>
#include <memory>
#include <string>
struct MyTree;
typedef std::unique_ptr<MyTree> upTree; // punt on memory management!
struct MyBaseNode;
typedef std::unique_ptr<MyBaseNode> upNode;

struct MyTree {
  std::vector<upTree> children;
  upNode node;
  MyTree( upNode node_ ):node(std::move(node_)) {}
private:
// if C++11 compiler, use these:
  MyTree( MyTree const& ) = delete;
  MyTree& operator=( MyTree const& ) = delete;
// if C++03, use these:
  // MyTree( MyTree const& ); // no implementation
  // MyTree& operator=( MyTree const& ); // no implementation
};
upTree make_tree(upNode node) { return upTree( new MyTree(std::move(node)) ); }

enum EOrder{ eFirst, eMiddle, eLast };
template<typename Functor>
void walk_tree( upTree const& tree, Functor f, bool bFirst = true, bool bLast = true) {
  if (!tree) return;
  f( tree, bFirst, bLast );
  for (auto it = tree->children.begin(); it != tree->children.end(); ++it) {
    bool bChildFirst = (it == tree->children.begin());
    bool bChildLast = ((it+1) == tree->children.end());
    walk_tree( *it, f, bChildFirst, bChildLast );
  }
}
struct MyBaseNode {
  virtual ~MyBaseNode() {};
  // put things that your tree nodes have to be able to do here
  // as pure virtual functions...
  virtual std::string MyName() const = 0;
};

struct CarsNode : MyBaseNode {
  // cars node implementation!
  virtual std::string MyName() const /*override*/ { return "I am a bunch of CARS!"; }
};
upNode make_cars() { return upNode( new CarsNode() ); }

struct CarNode : MyBaseNode {
  // car node implementation!
  virtual std::string MyName() const /*override*/ { return "I am a CAR!"; }
};
upNode make_car() { return upNode( new CarNode() ); }

struct RoadNode : MyBaseNode {
  // car node implementation!
  virtual std::string MyName() const /*override*/ { return "I am a ROAD!"; }
};
upNode make_road() { return upNode( new RoadNode() ); }

#include <iostream>
void tree_printer_func( upTree const& tree, bool bFirst, bool bLast ) {
  if (bFirst) std::cout << "[ ";
  if (tree->node) {
    std::cout << tree->node->MyName().c_str();
  } else {
    std::cout << "nullNode";
  }
  if (bLast) {
    std::cout << " ]\n";
  } else {
    std::cout << ", ";
  }
}
int main() {
  upTree root = make_tree(upNode());
  upTree carsTree = make_tree(make_cars());
  carsTree->children.push_back( make_tree( make_car() ) );
  carsTree->children.push_back( make_tree( make_car() ) );
  root->children.push_back( std::move(carsTree) );
  upTree roadTree = make_tree(make_road());
  root->children.push_back( std::move(roadTree) );
  walk_tree( root, tree_printer_func );
}

上面的内容比较粗糙(例如,在打印机中我没有完全正确处理末尾节点),但它展示了在C++中一种非同质,无泄漏,n元树结构。


2

如果我理解正确,您正在寻求有关开发项目(您的游戏)的想法。我会从较小的对象开始,比如轮胎、车身、其他汽车零件和汽车,然后是环境的各个部分,地形和道路赛道等。最后将所有其他对象放在一起组成世界。希望对您有所帮助。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接