4

我正在玩 2D 游戏编程。我的玩具项目是一个包含可探索岛屿和更多岛屿的航海游戏,但目前我正试图找到将“海滩”(即软末端)应用于其他相当粗糙的岛屿的最佳方式。瓷砖尺寸为 64x48。

在此处输入图像描述

我目前的解决方案是遍历每个图块并寻找周围的图块,并根据它们的周围环境,将水图块替换为正确的纹理。

我意识到这是一种非常有缺陷的方法,因为它是:

  • 令人难以置信的低效,因为每个图块都调用了环绕方法,即使是那些受更改影响的图块
  • 执行顺序可能意味着某些图块更改被覆盖

你们知道我可以如何绕过并以更好的方式解决这个问题吗?

谢谢!

编辑

此算法在加载地图时执行。

4

2 回答 2

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,而是增加 y。我们也可以在这里知道我们是否有一个角而不是垂直边框:

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

这应该是一个预处理过程,除非您的地形是动态的。无论如何不要在每一帧都这样做!

于 2012-12-02T19:20:05.357 回答
2

至少,我会标记该图块,因此您必须在第一次渲染图块时执行此操作,然后重用该标记值,而不是再次尝试找出它。

如果您在渲染时执行此操作,假设您一次只显示地图的一部分,那么它比一次性为整个地图执行此操作要高效得多。

除此之外,我想不出另一种方法来提高算法的效率。根据定义,“海滩”标题的定义是在水瓦边缘存在土地。所以你别无选择,只能看看周围的瓷砖......

于 2012-12-02T18:55:01.103 回答