9

我正在使用 Glut 在 OpenGL 中构建赛车游戏,我对细节有点迷失。首先,任何建议或路线图都会非常棒。

到目前为止,我的想法是这样的:

  1. 转换的树实现。
  2. 模拟动力学。(*)
  3. 用于碰撞检测的八叉树实现。
  4. 实际碰撞检测。(*)
  5. 在 Maya 中建模并将其导出为 .OBJ。
  6. 使用 GLSL 或类似的东西来优化游戏以提高图形质量。

(*):我不确定这两个的顺序。

所以我从没有树实现的模拟动力学开始,结果对我来说是一个巨大的混乱。你有什么办法可以帮助我建造这样一棵树以用于赛车游戏吗?

我想到了这样的事情,但我不知道如何实现它。

红色为静态,黄色为动态节点 红色为静态,黄色为动态节点

4

3 回答 3

10

我建议与@bezad 完全相反。

从一辆汽车和一条无限的道路开始。

将渲染和动态问题拆分为两个完全不同的事情。常见的更新和/或是和Car之间的链接。CarRenderModelCarPhysicsModel

将什么塑造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 元树结构。

于 2012-12-27T01:26:02.207 回答
2

如果我理解正确,那么您是在询问有关如何开发项目(您的游戏)的想法。我会从轮胎、车身、其他汽车零件和汽车等较小的物体开始,然后是环境、地形和道路轨迹等。最后是世界,并将所有其他物体放在一起进入世界。希望能帮助到你。

于 2012-12-26T07:15:31.770 回答
2

你可以考虑在 gamdev.stackexchange 上发布这个;你可能会在那里得到更好的答案。

话虽如此,我同意Michael IV在评论中的建议。您最好的选择是从免费的开源游戏引擎开始。即使您想制作自己的引擎,首先使用现有引擎构建它也会为您提供有关如何完成它的宝贵想法。

这是有关使用哪个引擎的游戏开发的相关回答问题。

于 2012-12-28T16:00:22.737 回答