Greenfoot提供了很多方法来检测角色对象,以便适应不同场景的需求,这主要可分为两种不同的类型:一种完全基于角色对象的位置,另一种则基于角色对象的图像。

1. 基于网格单元的碰撞检测

这种方式就是判断目标网格是否存在你要检测的对象,比如像“树袋熊”游戏示例所展示的那样,游戏角色对象完全被包含在网格单元中。当树袋熊寻找树叶来吃的时候,它们会看看当前位置是否有树叶(也就是检测当前网格是否有叶子对象,有那就说明发生了碰撞),树袋熊的 foundLeaf()方法中包含了实现这种功能的代码:

Greenfoot 的基本功能和使用方法之基于网格单元的碰撞检测

这个方法返回一个树袋熊当前的相对位置的对象。方法的前两个参数指定当前位置的偏移量,在这个例子中是(0,0),也就是当前树袋熊所在的网格。第三个参数指定需要寻找的对象的类型,这个方法仅能获取给定类或子类的对象。

如果想检测网格所有的叶子对象,则可以调用下面这个方法来获取多个树叶对象:

List leaves = getObjectsAtOffset(0, 0, Leaf.class);

如果想让袋熊仅能看见东南西北四个相邻的单元,则可以使用下面的方法:

List leaves = getNeighbours(1, false, Leaf.class);

以上语句能获取距离树袋熊一步之内的网格中的对象,但位于对角线上的网格不包含在内,如果想包含对角线上的网格,则需要把该方法的第二个参数由false 替换成 true。此外,如果想让树袋熊看得更远,则可以把该方法的第一个参数值由 1 增加到更大。

Greenfoot 的基本功能和使用方法之基于网格单元的碰撞检测

还有一个方法:protected java.util.List getObjectsInRange(int radius,

                                          java.lang.Class cls)

返回本对象周围指定半径内指定类型的其他对象。半径范围内的对象指那些自身中心点到本对象中心点的距离小于或等于"radius"参数值的对象。

Greenfoot 的基本功能和使用方法之基于网格单元的碰撞检测

例如:List leaves = getObjectsInRange(2, Leaf.class)