您好我的名字是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)
仅检查与播放器附近的树木或当前可见矩形内的树木的碰撞。要有效地执行此操作,请保留一组可见的对象,并仅对这些对象进行迭代。
答案 1 :(得分:2)
正如威尔伯特所说,kd树将是完美的解决方案。 对于具有大量非移动物体的简单2D游戏,您可以尝试更简单的方法:
首先,按照您已经完成的方式设置所有树木:
将所有这些树保存在ArrayList中。
不要在相同大小的x矩形中分隔你的游戏区域(例如3x5 = 15)并检查哪个树与哪个区域相交。将这些计算保存在合适的数据结构中。例如:
HashMap<Rectangle, ArrayList<Tree>> fieldSperation;
树上的白色数字表示它们相交的矩形。一棵树可能与多个Rectangle相交。然后你必须在两个或多个列表中持有一个引用(例如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
}
}
}
}
我很确定这种技术足以满足您的性能要求。
答案 2 :(得分:1)
使用空间数据结构进行碰撞测试。使用这种结构,您可以大量减少测试次数。
2d的两个简单而有效的结构是quadtree或kd-tree。
可以找到一个相关问题,其中包含指向java中kd-tree实现的链接here。
答案 3 :(得分:0)
不要在Swing事件派发线程中检查冲突。创建一个并发线程来执行该操作,并且事件线程只是将它们分配给它。通过最多只检查屏幕上的树来减少检查的碰撞量。
答案 4 :(得分: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;
}
}