2012-12-02 29 views
4

我玩2D遊戲編程。我的玩具項目是一個帆船比賽與探索的島嶼多,但在那一刻,我試圖找到應用「海灘」(即軟接頭),否則相當粗糙島嶼的最佳方式。平鋪尺寸是64x48。2D渲染 - 識別島嶼並應用「海灘」的算法?

enter image description here

我現在的解決方案是通過每瓦迭代和尋找周圍的地磚,並根據他們的周圍,用正確的紋理代替水瓷磚。

我意識到,這是一個非常有缺陷的方法,因爲它是:

  • 令人難以置信的是低效的,因爲環繞方法被調用爲每瓦,甚至那些受變化
  • 執行的順序可能暗示一些瓷磚更改被覆蓋

你們有一個想法,我可以解決這個問題,並以更好的方式解決這個問題嗎?

謝謝!

編輯

正在加載的地圖當執行該算法。

回答

2

的算法在每行單次檢測的邊界(但不角落起初)/行會:

for each horizontal line 
    previousTag = getTag(first line pixel) // land or water in our example 
    for each pixel of the line 
    currentTag = getTag(this pixel) 
    if (previousTag == currentTag) 
     continue // not a border 
    else 
     // We got a vertical border, do what is needed 

    previousTag = currentTag 
    endforeach 
endforeach 

這同樣適用於垂直線(而不是遞增x,你增加ÿ我們可以在這裏也知道,如果我們得到了一個角球,而不是垂直邊界:

for each vertical line 
    previousTag = getTag(first line pixel) // land or water in our example 
    for each pixel of the line 
    currentTag = getTag(this pixel) 
    if (previousTag == currentTag) 
     continue // not a border 
    else 
     if (pixel on the right or on the left is a border) 
     // we got a corner 
     else 
     // we got a horizontal border 

    previousTag = currentTag 
    endforeach 
endforeach 

這應該是一個預處理,除非你的地形動態,不要那樣做每幀!

2

至少,我會標記這個瓦片,這樣您在第一次渲染瓦片時就必須執行此操作,然後重新使用該標誌值而不是重新計算出來。

如果你在渲染的時候這樣做,假設你一次只顯示一部分地圖,那麼它比一次完成整個地圖要高效得多。

除此之外,我想不出的另一種方法,使算法更有效。根據定義,「海灘」標題的定義就像水瓦邊緣的土地的存在。所以,你有沒有其他的選擇,而不是看它周圍的瓷磚...