2014-05-09 66 views
0

在我的基於瓦片的自上而下的遊戲中,有點像Terraria,我需要在某些情況下有效地更新瓦片。我目前正在處理的情況是繪製瓦片之間的連接。有效處理所有遊戲磁貼更新?

通過連接我的意思是借鑑取決於其位置上的每個瓦片上重疊,因此,如果瓷磚是在一個角落裏,將有它連接到其他疊加一個角落覆蓋。有點像Minecraft中的紋理,而非任何瓷磚遊戲中最有可能連接的紋理。

我現在我遇到的問題是如何處理更新覆蓋。例如,如果我摧毀了一個貼磚,則必須更新所有相鄰貼磚的疊加層,因爲不再有要連接的貼磚。這部分是容易的,因爲我可以做這樣的事情:

updateOverlay(x+1, y); 
updateOverlay(x-1, y); 
updateOverlay(x, y+1); 
updateOverlay(x, y-1); 

這是哪裏出了問題進來,如果當我打電話的updateOverlay(X + 1,Y),在此覆蓋變化,會發生什麼情況該貼磚的相鄰貼磚需要覆蓋更新,以及如果其中一個相鄰貼磚導致相同的事情會發生什麼?那麼這是一大串更新。

我嘗試了遞歸實現有點像以下:

如果
public boolean updateOverlay(int x, int y){ 
    changeOverlayAccordingly(); 

    if(overlayHasChanged) return true; 

     updateOverlay(x+1, y); 
     updateOverlay(x-1, y); 
     updateOverlay(x, y+1); 
     updateOverlay(x, y-1); 

    return false; 
} 

的(overlayHasChanged)語句應該停止從發生的歷史無限遞歸循環,但它並沒有真正做任何事情,因爲我仍然有堆棧溢出錯誤。此問題的遞歸解決方案可能不是最好的,因爲它不會那麼穩定。

再次,我明白,我可以只更新所有相鄰的疊加,並用它做,但如果被要求將這些更新會導致什麼更多的更新?

[2] [6] 
[1][x][3][5][8] 
    [4] [7] 

爲了進一步說明我的觀點,看上面圖。

如果[X]是被更新的原始覆蓋,[1] [2] [3]和[4]將被更新。但是,如果[3]發生變化以致[5]需要並更新,會發生什麼?如果[5]發生了變化,[6] [7]和[8]需要更新,會發生什麼?

還有沒有其他的解決方案來處理更新圖塊疊加層?

任何幫助將不勝感激

+1

你的func的第一行也是遞歸的.. – user2746020

+0

@ user2746020哎呀是啊我修正了 – grimrader22

回答

1

你需要的是把事情的透視。給予某些更新的優先權,你會避免無限循環。我會嘗試將它更新到頂端,然後檢查一切是否正常;然後,只是調整一些點。

但是,那麼,你爲什麼會甚至需要上鍊更新的東西呢?如果在一次操作中它是一個塊,那麼半徑大於一個塊的變化將不會發生。 (請解釋,我將相應編輯)。如果它涉及破壞相鄰的瓷磚,請嘗試從中心到邊界,忽略指向中心的塊。

+0

PS:我在想Terraria。 – radgeRayden

+0

進出口猜測他有某種模式,應該連接到雙方的瓷磚,認爲管道,你不想要一個管道,試圖連接到沒有現有的瓷磚。 – user2746020

+0

@radgeRayden我會嘗試一下並回復你 – grimrader22