[英]Java more efficient array searching
我正在使用LibGdx對游戲進行編碼,我有一個數組,其中包含玩家可以碰撞的所有牆對象。 對於那些不使用LibGdx的人,我說的是LibGdx的Array類,它提供了與ArrayList相同的功能,但它的構建考慮了內存效率。 當我檢查碰撞時,我不得不穿過陣列中的每個牆並檢查碰撞,如下所示:
for(Wall w : walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
我意識到這是低效的,因為即使那堵牆離開了地圖的當前視圖,我也會穿過每一面牆。 顯然,如果我正在檢查相機視口中當前牆壁的碰撞(這意味着玩家當前可以看到它們),那么通過整個陣列是沒有意義的,因為玩家在進入之前不能與它們發生碰撞視圖。 我只想通過檢查與玩家附近牆壁的碰撞來讓我的游戲更有效率。 在我的游戲中,我將所有牆壁都卡在一個網格上,單元格為32x32像素。 我真的不知道如何創建更有效的碰撞搜索。 我可以使用某種類型的地圖,它使用vector2位置作為其鍵,然后查看玩家的位置並在玩家在地圖中的位置的某個范圍內查看牆壁嗎? 我真的迷失了如何在我的游戲中擁有不會通過所有100多個牆壁的代碼,因為當前只有10個當前可能的牆壁可以觸摸玩家。 這有道理嗎? 有人可以解釋這樣做的好方法嗎? 非常感謝。
那里有很多碰撞的alghoritms,你需要找到一個適合你需要的。
我能想到的一個解決方案是:
保持您的牆列表在其坐標上排序。 如果您創建了一個新牆,請使用插入排序來求助您的數組。 當你想檢查碰撞時,取對象坐標(在這種情況下可能是正在運行的玩家)並進行二分查找以找到最接近玩家的牆。 然后計算玩家和這堵牆是否發生碰撞。 如果最近的牆沒有造成碰撞,你可以非常自信沒有其他牆也是如此。
每個牆都在這些32x32px網格中的一個或多個上。 設柵格的坐標為x和y。 如果網格包含牆,請將其輸入a
HashMap<CoordPair,Set<Wall>> xy2wall
要調查位置與附近牆壁的接觸位置,請使用位置坐標確定一小組網格坐標,獲取由這些CoordPairs映射的一組或多組牆。 我猜Player.bounds()可以提供一組合適的坐標。
如果32x32網格導致過多條目,則始終可以使用較粗糙的網格。
在開發自上而下的RPG時,我曾經有過相同的認識。 在自上而下的RPG中,牆壁比你想象的要多。
這是我解決它的方式:
第一:將地圖划分為區域,即。)在紙上或其他東西上繪制地圖並將其切割成部分。
第二:記錄地圖的每個分段部分的像素邊界。
第三:檢查球員位置相對於邊界的位置。
最后:只檢查這些邊界內的牆壁。
在無限牆的領域,這不是更有效(談論大O)但是出於所有實際目的,這在減少查找時間方面是有效的
if (boundary1.contains(player1)) {
for(Wall w : Boundary1Walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
}
else if (boundary2.contains(player1)) {
for (Wall w : Boundary2Walls) {
if(w.bounds().contains(player.bounds()) {
// handle collision
}
}
}
......繼續以這種方式
請注意......我在上大學進行軟件開發之前是這樣做的,所以我沒有使用BST這樣的數據結構,可以用來存儲與坐標相關的牆。 使您的查詢時間非常快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.