2013-10-30 62 views
0

你好我的名字是瑞恩,我目前正在開發我自己的2D Java遊戲。目前遊戲世界中有很多對象。遊戲重新開始後,世界將隨機放置100髮束,使用陣列列表和樹類進行製作。我的遊戲使用名爲checkcollisions的類來檢查玩家是否與任何髮束相交。然後將該方法置於update方法中。當這種方法不被稱爲我得到額外的100 FPS是在那裏我仍然可以得到這個100幀,但仍然檢查碰撞?我真的需要一個FPS提升ASAS我的比賽目前運行在30-50 fps的Java中的低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

速度減慢可能是由checkCollisions函數中進行的任何次數的函數調用引起的。玩家所要求的interest()函數是一個可能的罪魁禍首。 – Stieffers

+0

在探查器中運行你的遊戲。 –

+0

什麼是剖析器 – user2876115

回答

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; 
     } 
    } 
3

只檢查碰撞與樹在附近的球員,或者是樹木在當前可見的矩形內。爲了有效地做到這一點,請保存一組可見的對象,並僅對這些對象進行迭代。

+0

如何檢查每個單獨的樹是否在可見矩形(相機)中而不使用for循環? – user2876115

+0

你必須。這是你無法避免的。但是一旦你找到了可見的物體,你可以在這些物體上執行*所有的遊戲邏輯*,而不是一切。如果你有很多對象,這將是一個重大改進。 –

+0

你能告訴我一個代碼示例,Java或僞將是好的 – user2876115

1

使用空間數據結構進行碰撞測試。通過這樣的結構,您可以大量減少測試次數。

2d的兩個簡單而高效的結構將是quadtreekd-tree

有關java中kd-tree實現的鏈接的相關問題可以在here找到。

0

不要在Swing事件派發線程中檢查衝突。創建一個併發線程來完成那個線程和事件線程的簡單分配。通過最大限度減少檢查衝突的數量,只檢查屏幕上的樹木。

2

正如威爾伯特提到kd-tree會是一個完美的解決方案。 對於很多非移動的一個簡單的2D遊戲對象,你可以嘗試一個更簡單的方法:

首先,設置你的樹,你已經做到了:

enter image description here

保持所有這些你的ArrayList中的樹。

沒有在相同大小的x個矩形(例如3x5 = 15)中分隔您的遊戲場,並檢查哪個樹與哪個區域相交。將這些計算保存在合適的數據結構中。例如:

HashMap<Rectangle, ArrayList<Tree>> fieldSperation; 

enter image description here

白色數whithin樹指示它們的交點的矩形。有可能,一棵樹與多個矩形相交。那麼你必須在兩個或更多的清單中舉例說明(例如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 
      } 
     } 
    } 
} 

我敢肯定這項技術將足以滿足您的性能比較的要求。

+0

如果樹移動,我仍然可以使用這種方法 – user2876115

+0

如果一棵樹移動,你必須recalcualte其相交的矩形。因此,將其從包含它的所有列表中刪除,然後將其添加到新的相應列表中。 – trylimits