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

5 回答 5

3

仅检查与玩家附近的树木或当前可见矩形内的树木是否发生碰撞。为了有效地执行此操作,请保存一组可见的对象并仅对其进行迭代。

于 2013-10-30T17:06:55.257 回答
2

正如威尔伯特所说,kd-tree 将是完美的解决方案。对于具有大量非移动对象的简单 2d 游戏,您可以尝试一种更简单的方法:

首先,按照您已经完成的方式设置所有树:

在此处输入图像描述

将所有这些树保存在 ArrayList 中。

没有在相同大小的 x 个矩形(例如 3x5=15)中分隔您的游戏场,并检查哪个树与哪个区域相交。将这些计算保存在合适的数据结构中。例如:

HashMap<Rectangle, ArrayList<Tree>> fieldSperation;

在此处输入图像描述

树上的白色数字表示它们相交的矩形。一棵树与多个矩形相交是可能的。然后你必须在两个或更多列表中保存一个引用(例如 6/7 或 7/12)。

最后,您可以按如下方式调整您的 checkCollisions() 方法:

public void checkCollisions() {
    // 1. check which Rectangle intersects with the player (can be a maximum of 4)
    for (Rectangle r : fieldSeperation.keySet()) {
         if (playerRect.intersect(r)) {
             // 2. do your collision detection with those trees which are intersecting with those
             // trees which are intersecting with the rectangles from 1.)
             for (List<Tree> ts : fieldSeperation.get(r)) {
                 // your old code here
             }
         }
     }
}

我很确定这种技术足以满足您的性能要求。

于 2013-10-30T17:47:17.220 回答
1

使用空间数据结构进行碰撞测试。使用这种结构,您可以大量减少测试次数。

2d 的两个简单而有效的结构是四叉树kd-tree

可以在此处找到与 Java 中的 kd-tree 实现链接的相关问题。

于 2013-10-30T17:08:47.533 回答
0

不要在 Swing 事件调度线程中检查冲突。创建一个执行此操作的并发线程,事件线程只需将它们分配给它。通过最多只检查屏幕上的树木来减少检查的碰撞数量。

于 2013-10-30T17:33:23.713 回答
0

我刚刚重新排列了代码,现在可以正常工作了!感谢所有提供帮助的人,我也很抱歉多次发布这个问题......我是新手,并不真正知道我在做什么。再次感谢您帮助有需要的开发人员的每个人!这是新代码:

for (int i = 0; i < Placing_Objects.Small_Trees.size(); i++) {
        if (gotAxeOn) {
            if (player.getBounds().intersects(Placing_Objects.getSmall_Tree().get(i).getBounds())) {
                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;
        }
    }
于 2013-10-31T15:50:02.813 回答