您好我的名字是Ryan,我正在开发自己的2D Java游戏。目前游戏世界中有很多对象。在游戏重新开始时,世界上随机放置了100个发辫,使用了一个arraylist和一个树类。我的游戏使用一个名为checkcollisions
的类来检查玩家是否与任何发辫交叉。然后将此方法置于update
方法中。当没有调用此方法时,我得到额外的100 FPS,我仍然可以得到这100 fps,但仍然检查是否有碰撞?我真的需要FPS提升,因为我的游戏目前以30-50 fps运行
这里是checkcollisions代码:
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;
}
}
}
答案 0 :(得分:3)
100个对象应该能够轻松支持100fps的碰撞检查,尤其是在2D世界中。因此,您的算法可能有问题。
听起来你强力检查每棵树对着玩家;这可能变得非常慢,特别是如果树的几何形状复杂。通过使用一个或多个广泛阶段,可以避免这种级别的检查。
在基本的广泛阶段中,检查每个可能碰撞边界框的对象与其他对象的边界框。边界框恰好是对象的形状并不重要,只是它相对较小,完全包含对象并且是一个简单的形状(轴对齐的矩形是最好的)。只有通过这种简单的碰撞检查才能进行更为昂贵的窄阶段检查。
进一步的改进是将该区域空间分隔成更大的盒子。从而允许您一次消除与几棵树的碰撞。
这些概念如下图所示
此处播放器显示为红色圆圈;您可以立即看到除了两棵树之外没有任何点检查,因为只有2棵树在与播放器相同的大盒子内。在检查这两棵树的边界框时,你会看到其中只有一棵可能与玩家发生碰撞;你检查剩下的树的精细几何,发现它也不会碰撞。