0

您好,我的名字是 Ryan,我目前正在开发自己的 2D java 游戏。目前,游戏世界中有很多对象。在游戏重新开始时,世界加载了 100 根随机放置在其上的发束,这些发束是使用数组列表和树类创建的。我的游戏使用一个类checkcollisions来检查玩家是否与任何树木相交。然后将此方法放入update方法中。当不调用此方法时,我会获得额外的 100 FPS,我仍然可以获得这 100 fps 但仍检查碰撞吗?我真的需要提高 FPS,因为我的游戏目前以 30-50 fps 运行

这是检查碰撞代码:

public void checkCollisions() {
    for (int i = 0; i < Placing_Objects.Small_Trees.size(); i++) {
        if (player.getBounds().intersects(Placing_Objects.getSmall_Tree().get(i).getBounds())) {
            if (gotAxeOn) {Placing_Objects.Small_Trees.get(i).health -= rand.nextInt(3);}
        }
        if (Placing_Objects.Small_Trees.get(i).health <= 0) {
            Placing_Objects.removeSmall_Tree(Placing_Objects.Small_Trees.get(i));
            Inventory.addItemToInv("Wood");
            Inventory.addItemToInv("Wood");
            Inventory.addItemToInv("Stick");
            Player.exp += rand.nextInt(3);
            challenges.choppedDownTrees += 1;
        }
    }
}
4

1 回答 1

3

100 个对象应该能够轻松支持 100fps 的碰撞检查,尤其是在 2D 世界中。因此,您的算法可能有问题。

听起来你对玩家蛮力检查每棵树;这可能会变得非常缓慢,尤其是在树木的几何形状很复杂的情况下。可以通过使用 1 个或多个广泛的阶段来避免这种级别的检查。

宽相

在一个基本的广泛阶段,您检查每个对象的边界框可能其他对象的边界框发生碰撞。边界框是否与对象的形状完全相同并不重要,只要它相对较小、完全包含对象并且是简单的形状(最好是轴对齐的矩形)。只有通过这种简单的碰撞检查,才能进行更昂贵的窄相位检查。

空间划分

进一步的改进是将区域在空间上分离成更大的盒子。从而允许您一次消除与几棵树的碰撞。

这些概念如下图所示

在此处输入图像描述

此处玩家显示为红色圆圈;您可以立即看到除了两棵树之外检查任何其他树都没有意义,因为只有两棵树与玩家在同一个大框内。仅检查那两棵树的边界框时,您会看到其中只有一棵树可能与玩家发生碰撞;您检查剩余树的精细几何形状,发现它也没有碰撞。

于 2013-10-30T14:08:52.360 回答