C++ 如何在游戏中实现碰撞效果?

C++ 如何在游戏中实现碰撞效果?,c++,qt,C++,Qt,我正在用QT构建一个游戏。我的Graphicscene上的每个对象都继承自GraphicsPixmapItem(玩家、障碍物、炸弹…)。我想解释一下碰撞效应。例如,当玩家获得悬停奖励时,他可以选择它。 使用QT框架,我可以得到碰撞项,但我不知道它们是哪种类型,因为没有instanceof函数。有什么建议吗 编辑:我得到碰撞“事件”,我想做的是处理不同的碰撞。我用更好的措词做了另一个。一个想法:继承:玩家可以碰撞的每个对象都有一个CollizeWithPlayer方法,可以根据对象的需要执行任何操

我正在用QT构建一个游戏。我的Graphicscene上的每个对象都继承自GraphicsPixmapItem(玩家、障碍物、炸弹…)。我想解释一下碰撞效应。例如,当玩家获得悬停奖励时,他可以选择它。 使用QT框架,我可以得到碰撞项,但我不知道它们是哪种类型,因为没有instanceof函数。有什么建议吗


编辑:我得到碰撞“事件”,我想做的是处理不同的碰撞。我用更好的措词做了另一个。

一个想法:
继承:玩家可以碰撞的每个对象都有一个CollizeWithPlayer方法,可以根据对象的需要执行任何操作

C++类的pSueDO代码,例如


您可以使用诸如Nvidia PhysX或Bullet之类的外部库,这样可以在发生冲突时设置回调。通过使用这样的库,谁也不会使用Qt的碰撞系统,相反,每一帧你都会模拟物理,然后更新GraphicsPixmapItem的属性,以反映它们在物理模拟中的状态。

你可以看看下面的Qt示例:碰撞鼠标示例

这很简单,它将给你一个非常好的介绍,基本的冲突处理与Qt

快速总结,每个对象将有一个边界框,它将为您提供它使用的空间。。。然后,您将使用这些边界框来了解项目是否相互接触

希望这有帮助

设计注意事项:

我不建议从图形表示中继承游戏对象。为什么?您可能需要一个游戏对象的多个图形表示(如游戏视图中的一个或小地图中的另一个,或其他)。关系是“玩家”具有“图形表示”,而不是“玩家”具有“图形表示”。更好的解决方案是使用组合,而不是继承。另一个很好的效果是,如果您不满意Qt、decoupling、。。。事实上,对于简单的游戏来说,这已经足够了

对于足够简单的游戏逻辑,其他对象对活动对象作出反应的继承。对于任何更复杂的游戏机制来说,可能过于简单化了

class Asteroid {
public:
  virtual void CollideWithPlayer(Player&) { p.loseHealth(100); }
};

class ExplodingAsteroid: Asteroid {
public:
  virtual void CollideWithPlayer(Player&) { explode(); p.loseHealth(1000); }
};
如果交互变得复杂(许多活动对象自行运行),您可能需要标识您的对象:

  • 有RTTI,但很难推荐看到: 简而言之:昂贵,难以维护

  • 您可以使用双重分派。使用两个虚拟调用标识对象。 问题:相当多的语法,有时难以维护(特别是在添加新对象时),所有权问题(请参阅更多)。 来自维基百科的游戏示例:


还是作为一个成员

class GameObject() {
  ID getId() { return id; }
protected:
  GameObject(ID id):id(id) {}
private:
  ID id;
};
或者使用自动初始化id的模板(有点令人难以置信的语法,让我们省略它:o)

  • 及其他

现在,对于这样的游戏循环:

for each object
  update by (fixed) time step
  detect collisions and resolve them
您将遇到:

所有权问题:

玩家在被小行星撞击时失去生命,小行星随后被摧毁

Asteorid::collideWithPlayer(Player& p) { p.loseHealth(100); this->explode(); }

现在也考虑

Player::collideWithAsteroid(Asteroid& a) { this->loseHealth(100); a.explode(); }
结果:代码重复或游戏机制不清楚

穷人的解决办法:打电话给其他人帮助你:o)


+优秀论文1篇。图片会让它变得更好。;-)非常感谢你的解释。C++是不是游戏DEV的一个好选择,C++是游戏DEV IMO的最佳选择之一。你需要更多的内存控制,并在需要时访问低级别的调用。但我有偏见,因为除了C++和java之外,我从来没有尝试过做任何游戏。
for each object
  update by (fixed) time step
  detect collisions and resolve them
Asteorid::collideWithPlayer(Player& p) { p.loseHealth(100); this->explode(); }
Player::collideWithAsteroid(Asteroid& a) { this->loseHealth(100); a.explode(); }
Asteorid::collideWithPlayer(Player& p) { resolveCollision(p, *this); }
Player::collideWithAsteroid(Asteroid& a) { resolveCollision(*this, a); }
resolveCollision(Player, Asteroid) { p.loseHealth(100); a.explode(); }