2013-03-19 127 views
1

我正在開發純Java中的2D遊戲,直到現在我已經有了一個噪聲映射系統,可以和像Minecraft一樣的塊(和實體)一起工作。Java中的2D平鋪遊戲優化

我存儲瓷磚的方式是通過創建int[s * s]陣列,其中s是塊的一側具有的大小(以瓷片爲單位)。然後,我有一個Tiles的靜態數組,它包含遊戲中每個可能的切片,用一個整數索引。這些是在每個塊中存儲在int[s * s]中的整數。現在,我希望能夠覆蓋瓷磚,比如看不見的產卵瓷磚,牆壁,樹木和過渡瓷磚(例如,當草變成沙子時:沙子上應該有草邊,這將是一塊新瓷磚)。

問題是隻有一個整數可以存儲在塊的每個座標中。另一種方法是將瓷磚的實際實例放入塊中,並將疊加的瓷磚指向它們正下方的塊(如堆棧),但我認爲這是一種不好的方法。我測試的另一種方法是製作一系列瓷磚列表,這也非常糟糕。

這將是一個很好的方法來實現這一目標?

回答

1

通常你會分開存儲瓷磚和對象。

  • 你將不得不爲自己瓦片, 這將只允許每平方一個區塊的int [w*h]或相似。
  • 另外,您可以有一個ArrayList [w*h],它在每個方塊中存儲一個 實體列表。此陣列將包含空格 正方形的null,因此大多數方格( 中沒有實體)的額外存儲成本最小。

當然還有其他的方法,但這有一個優點,它既簡單又非常高效。

唯一不利的是,你將不得不編寫單獨的代碼處理瓷磚和實體 - 但由於你通常以不同的方式處理瓷磚和實體,所以這不太可能是一個大問題。

+0

好的,所以通過這樣做,我不得不把我的樹木,產卵者等變成實體,實際上這沒有問題。這很好。但是如果我想「混合」瓷磚呢?一個例子是從草地到沙地的過渡:我需要在沙地磚內有一塊草地。我想要做的是將這個邊框設置爲一個新的Tile,並將它繪製在沙地上,這需要在同一個地方放置兩塊瓷磚(或不是?)。 – Thiago 2013-03-19 03:00:31

+0

你可以實現邊界的幾種方法:a)檢測它們並在渲染時繪製它們b)將它們作爲實體c)實現圖塊疊加(每個方塊多個圖塊,如實體)d)自動生成具有邊框的多個圖塊版本。我通常可能更喜歡a),但是YMMV,這取決於您的整體發動機設計以及您希望擁有的藝術靈活性。 – mikera 2013-03-19 03:37:02

+0

我會嘗試第一種方式,謝謝。 – Thiago 2013-03-19 15:30:26