2011-03-05 144 views
3

林做在Java中的游戏与其他几个人,但我们是停留在它的一个组成部分,使碰撞检测。游戏是一个RPG游戏,我知道如何使用矩形对角色进行碰撞检测,但是我不知道该怎么做是地图的碰撞检测。我的意思是说,角色不能漫过树木或水,而使用矩形的东西似乎不是这里最好的选择。碰撞检测中的Java的游戏

好解释什么是游戏的地图,因为我的样子,这里有一个例子http://i980.photobucket.com/albums/ae287/gordsmash/7-8.jpg

现在我可以使用矩形获得界限,并从走在树木和水停的球员,但是这将需要大量的其中。

但有另一种以阻止玩家行走在树木和障碍除了使用矩形更简单的方法?

+1

这对http://gamedev.stackexchange.com很有用 – 2011-03-05 15:11:51

回答

1

这里有一个简单的方法,但它使用更多的内存和你做的工作了前面......只需要创建一个背景碰撞掩码表示允许领域字符以二进制形式走。您可以用某种压缩的位图形式存储它。查找过程非常简单而且非常快速。

+0

这似乎是一种很好的碰撞检测方法,但我想知道如何编程?我认为我们之前正在考虑这样做,但我们不知道如何获得这样的大对象的每个角落和边的坐标。 – gordsmash 2011-03-06 14:37:42

+0

实际上,您将背景图像的副本加载到编辑器中并手动(如果您无法以编程方式进行操作),请绘制所有区域以创建碰撞蒙版;黑色适合步行,白色适合不适合。如果您使用的是瓷砖,则可以针对每种瓷砖类型执行一次。随着精灵移动,您可以从掩码中获取代表其新位置的矩形,或者根据需要从几个图块碰撞蒙版创建一个矩形。然后,您可以与精灵掩码进行AND运算,并检查结果是否包含任何非零像素。如果有的话,你遇到了碰撞并放弃了这一举动。 – 2011-03-06 16:48:20

0

矩形碰撞检测似乎有意义;但是,或者您也可以尝试进行球体碰撞检测,这可以更快地检测碰撞。你甚至不需要用于距离计算的平方根,因为你可以比较平方距离来查看球体是否重叠。这是一个非常快速的方法,并且考虑到您的游戏的性质可以很好地工作。

也!假设你有很多正在碰撞的瓷砖,请考虑一些空间分区的方法。让我给你一个简单的例子 - 将你的地图细分为几个矩形(http://www.staff.ncl.ac.uk/qiuhua.liang/Research/Pic_research/mine_grid.jpg),然后根据你的玩家的矩形区域目前居住在 - 只检查位于该区域内的瓷砖的碰撞。

你可以让了一步 - 如果你比你设置的阈值的任何给定区域有更多的瓷砖 - 细分该区域进一步在其内使更多的较小的区域。

这种细分背后的想法被称为四叉树,并有一个巨大的关于这一主题的文章和教程的数量,你会很快流行起来。

如果您有任何问题,请让我知道。

0

有这种类型的问题,许多解决方案,但你在做什么,我相信最好的行动当然是使用瓷砖引擎。这在过去类似的游戏中会被广泛使用(想想SNES上的任何RPG),它为您提供了一个快速简便的水平/地图设计和碰撞检测方法。

瓦片引擎的基本概念是,对象存储在二维数组中,当玩家(或任何其他移动游戏实体)尝试移动到新瓦片时,您会执行一次简单检查,以查看该对象是否在该瓷砖是否可以通过(例如,如果它是草地,玩家可能会移动;如果它是宝箱,则玩家不能移动)。这将大大简化检查冲突(因为对实体列表的天真检查将具有O(n^2)性能)。 This picture可能会让你知道我在说什么。这些线条已经被添加来说明一个观点,但是当你在玩游戏时,你不会主动将所有内容都视为由单个32x32像素图块组成。

虽然我不亲自在Java的瓷砖引擎的经验,它看起来像Mappy支持Java,而且我听说过PulpCore好东西。当然,你非常欢迎创造你自己的引擎,但是你必须决定是否花费更多的精力来重新发明轮子(当然,那当然是你的轮子,而且这非常令人满意)或花时间制作更好的游戏。