我和其他几个人一起用Java制作游戏,但我们仍然坚持使用它的一部分,进行碰撞检测。游戏是一个RPG,我知道如何使用矩形与角色进行碰撞检测,但我不知道该怎么办是地图的碰撞检测。我的意思是这样的,这个角色不能走过树木或水,那些东西,但使用矩形似乎不是这里最好的选择。
为了解释游戏地图会是什么样子,这里有一个例子http://i980.photobucket.com/albums/ae287/gordsmash/7-8.jpg
现在我可以使用矩形来限制并阻止玩家走过树木和水,但这会占用很多。
但除了使用矩形之外,还有另一种更简单的方法可以防止玩家越过树木和障碍物吗?
答案 0 :(得分:1)
这是一种简单的方法,但它使用更多的内存,你可以预先做好工作......只需创建一个背景碰撞掩码,表示字符以二进制形式行走的允许区域。您可以以某种压缩位图形式存储它。然后查找非常简单,非常快。
答案 1 :(得分:0)
矩形碰撞检测似乎有意义;但是,您也可以尝试球面碰撞检测,它可以更快地检测到碰撞。您甚至不需要平方根进行距离计算,因为您可以比较平方距离以查看球体是否重叠。这是一种非常快速的方法,鉴于您的游戏性质可以很好地工作。
也!假设您有许多正在碰撞的瓷砖,请考虑一些空间划分方法。让我举一个简单的例子 - 将您的地图细分为几个矩形(http://www.staff.ncl.ac.uk/qiuhua.liang/Research/Pic_research/mine_grid.jpg),然后根据您的播放器的矩形区域目前居住在 - 仅针对位于该区域内的瓷砖检查碰撞。
您可以更进一步 - 如果您在任何给定区域内有更多的图块而不是您设置的阈值 - 进一步细分该区域以在其中创建更小的区域。
这种细分背后的想法叫做Quadtree,关于这个主题有大量的论文和教程,你会很快就能找到。
如果您有任何疑问,请与我们联系。
答案 2 :(得分:0)
这类问题有很多解决方案,但对于你正在做的事情,我相信最好的做法是使用一个磁贴引擎。这在过去的类似游戏中经常被使用(想想SNES上的任何RPG),它为您提供了一种快速简便的水平/地图设计和碰撞检测方法。
tile引擎的基本概念是对象存储在2D数组中,当你的玩家(或任何其他移动的游戏实体)试图移动到新的tile中时,你会执行一个简单的检查以查看该对象是否存在瓷砖是否可以通过(例如,如果它是草,玩家可以移动;如果它是宝箱,则玩家不能移动)。这将极大地简化对冲突的检查(因为对实体列表的天真检查将具有O(n ^ 2)性能)。 This picture可能会让你知道我在说什么。这些线条已被添加以说明一点,但当然,当你在玩游戏时,你并没有积极地将所有事物都视为由单独的32x32像素图块组成。
虽然我个人对Java中的tile引擎没有任何经验,但看起来Mappy支持Java,我听说过有关PulpCore的好消息。当然,非常欢迎您创建自己的引擎,但是您必须决定是否更好地重新使用轮子(但是,当然,它将是您的轮,然后,这是相当令人满意的)或花时间制作更好的游戏。