当前位置: 首页 > 知识库问答 >
问题:

基于2D平铺的碰撞检测

杨鸿畅
2023-03-14

我计划一个独立游戏项目已经有一段时间了。我会为你总结一下,这样我就可以直接回答这个问题。

它是通过Visual Studio完全使用最新版本的XNA完成的。希望将其放在360和PC上,但目前我只是在真正寻找面向PC的解决方案。

这是一个2D侧向滚动射击游戏(想想大都会风格,甚至是Terraria)。它最终将包括一个游戏中的地图编辑器,地图是基于图块的(16x16)。会有向上和向下滚动。我希望在开发地图编辑器中实现图块层(开发地图编辑器的原因是它会非常倾向于内容焦点,所以会有很多地图)。

物理瓷砖非常简单,只有两种主要类型。块瓷砖,这只是一个实心瓷砖,和角瓷砖,这是一个倾斜的瓷砖,角色可以在上面行走。我强烈考虑完全放弃角瓷砖,但还不确定。

人物/NPC的动作会很简单。左右移动,跳跃,下落,飞行(有合适的物品/情况),瞬移。非常静态,不需要动态物理。只有基本重力。当一个角色离开瓷砖边缘时,它就会掉下来。当它跳起来的时候,上面有一块瓷砖,它会突然停下来,然后掉下来。当它到达一个突出的瓷砖/墙壁时,除非它跳过或飞起来,否则它不能进一步移动。所有基本的东西。

抛射物也会受到重力的影响,在一些情况下,抛射物可能会在飞行中被操纵,但不需要重物理。一些投射物也会移动角色(想想一个简单的“推动”机制)。

所以问题来了:我正处于开始研究运动和碰撞检测的阶段,但我就是不能让自己走上这条路。我需要一些方法来确定角色、方块和投射物何时发生碰撞。鉴于我所说的风格,我正在使用的基于瓷砖的系统,我可以得到一些建议链接到其他人在类似情况下使用的一些可靠的碰撞检测方法吗?我最需要的是灵感。

简单地说一下,我有几年的程序员经验,所以我并不完全是新手:)

共有2个答案

严修德
2023-03-14

如果它是如你所说的基于图块的地图,那么图块存储在二维数组中。因此,您可以通过地图数组中的x, y坐标快速访问图块。

我建议在四叉树上只检查实体附近的图块。

例如,你有一个玩家实体正在向右(x方向)移动,而不是向上或向下移动。你可以碰撞的瓷砖数量将只是几个瓷砖中的一个。特别是你右边的瓷砖。如果你走得够快,也许更靠右。

上述仅检查相邻瓷砖的解决方案是解决此问题的一种非常常见的方法,可以适用于许多用例。这也比上面提到的四叉树查找更快、更简单。

洪照
2023-03-14

我曾经在一个GIS项目中工作过,我有一个类似的问题,我用QuadTrees解决了这个问题,看看这个链接,有一个很好的解释和例子。

 类似资料:
  • 我正在做一个2d平板游戏。到目前为止,我已经做了一些事情。我正在使用libgdx的矩形进行基本的碰撞检测,所以考虑到我现在只有草块,我用Java制作了一个单块世界(文件读取器还没有准备好),问题是我的检测只在第一次工作,换句话说,如果我产生碰撞到一个块,它会检测到碰撞并这样做。虽然如果我在没有碰撞的情况下,让我的球员在方块顶部出现,球员将永远摔倒。 这是代码=

  • 我正在开发一款平台游戏,我想做一些基本的平台碰撞,遗憾的是我还是做不到。玩家的移动是这样计算的: 所有变量都是具有< code>x和< code>y值的向量。这和预期的一样,问题是有冲突。我的规则是: 当降落在平台上时停止坠落。 从平台运行时开始下降。 在跳跃过程中击中平台时停止向上移动。 撞墙时停止向一侧移动,但能够向相反方向移动。 检查底部是否与平台碰撞非常简单,但棘手的部分是检测哪一侧与平台

  • 我正在努力通过tiledmap实现一个碰撞检测系统。我有一个2d“口袋妖怪风格”的游戏,有一个平铺的地图渲染。具体来说,我的平铺地图中有一个“碰撞”层。我希望与播放器和其他实体进行交互的tmx文件。我的问题是,我如何将播放器sprite(扩展Sprite类)连接到tiledmap的“碰撞”层,并导致两者之间的碰撞。感谢任何建议。

  • 我下面的碰撞方法有问题。问题是当游戏中有两个敌人时。它与循环中的一个敌人相交,然后返回true进行碰撞。但是如果在这个数组列表中有第二个敌人,它将不会与第二个物体碰撞,因此导致它返回false,玩家继续行走。有什么办法可以让他在接触任何敌人时停下来,而不是因为他没有接触到所有的敌人而继续下去吗?谢谢,这是密码。

  • 本文向大家介绍基于javascript实现碰撞检测,包括了基于javascript实现碰撞检测的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript实现碰撞检测的具体代码,供大家参考,具体内容如下 碰撞检测原理图如上: 我们检测碰撞时,发现两个div碰上检测比没碰上的检测要难,所以以没碰上作为检测条件。画上九宫格,当红色div在黄色div左边线或是右边线或是上边线或是下

  • 我使用SFML 2.1进行图形,我的游戏结构非常严格地遵循SFML书(SceneGraph实现等)我的世界主要由角色(大约1-400,四处移动)和瓷砖(3600,静止)组成,每次移动时我都会检查碰撞 在最坏的情况下,大约400个字符移动,大约3600个平铺,我有4000个可能的实体,每帧有800个冲突检查调用(单独的X和Y移动)- 几乎我所有的实体都有16x16像素的大小,我一直在考虑实现四叉树或