Qt:如何在Qt游戏中实现障碍和碰撞检测

时间:2015-11-21 08:42:30

标签: qt

我正在构建一个简单的游戏,其中的角色的移动区域受到限制(即,无法穿过墙壁和某些物体)。如何在相对较大的地图上实施此检测,而不会大幅降低与远处墙壁碰撞的性能检测?

此外,我如何绘制或动画地图,识别"墙壁"或障碍,并将该信息转换为可编码的形式?

1 个答案:

答案 0 :(得分:2)

Qt图形场景/视图/项目堆栈已经内置了一些碰撞检测功能,尽管它相当简陋。 QGraphicsItem类有几种方法:

collidesWithItem(const QGraphicsItem * other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
collidesWithPath(const QPainterPath & path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
collidingItems(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const

我不知道这是如何实现的,但我认为地图场景大小并不像可碰撞对象的数量那么多。

场景中还有itemAt(pos)方法和items(rect,...),可用于确定您将要移动的位置中是否有对象,是一个点或矩形区域。因此,您可以轻松获取此类物品,并根据移动的方向和速度等属性,检查它们是否会发生碰撞以及它们是如何提前移动的。这对于实现比图形项方法更复杂和更有效的方法可能更有用。

此外,在完善碰撞检测时,这可能很有用: Qt - circles for collision detection

话虽这么说,图形场景/视图/项目堆栈相当笨拙且工作缓慢,尤其是自定义元素及其绘图和动画和内容的实现。我建议使用QML - 与使用图形堆栈制作游戏相比,实现QML碰撞检测和制作游戏更容易。此外,还有可用于QML(例如v-play)的游戏引擎可能带有碰撞检测甚至是简单的物理。如果QML是快速原型设计的一大优势,与使用C ++ API相比,它可以大大提高生产力,并且花费一半的时间等待编译。此外,QML图形性能更好,最近它甚至为3d图形引入了一个基本API(不,它不是虚幻的引擎替代品)。