我正在构建一个简单的游戏,其中的角色的移动区域受到限制(即,无法穿过墙壁和某些物体)。如何在相对较大的地图上实施此检测,而不会大幅降低与远处墙壁碰撞的性能检测?
此外,我如何绘制或动画地图,识别"墙壁"或障碍,并将该信息转换为可编码的形式?
答案 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(不,它不是虚幻的引擎替代品)。