B站老哥的思路比较简单,就是逐像素读取信息然后根据颜色生成对应模型,局限就是只能做成3d,而且画地图流程和游戏逻辑流程没有分开,其实是个隐患,对画地图的要求也稍高一点,因为要求每块的颜色都不同。
根据以上问题可以进行第一次改进,老哥的方法是全图锁定唯一色号生成目标地块,但其实我们可以用bfs提取颜色相同(或相近,需要容差),的像素点生成地图块,然后对地图块进行编号。这样根据四色定理,我们只需要四种颜色就可以画出我们想要的每一张平面地图,然后画地图流程和游戏逻辑部分采用编号进行沟通,在后续的游戏制作中也比较有好处。这样对于3d游戏就已经够用了,但是对2d游戏却仍然没法用,只能生成一张方形的texture,要实现点击还需要自己完成判断点击的部分,比较麻烦(当然也不是不能做)。
接下来就是进一步的改进:通过一定方法描出色块的边,使用的时候根据边点来生成多边形即可。当然说着好像很容易,只要找到边就好,那么在bfs的过程中判断是不是边就行了。一开始我也是这么干的,笑死,根本画不出来。因为图形api绘制多边形是一个点一个点连起来,然后填充内部,就是需要点序列顺序相连,能构成一个单连通区域。
要解决这个问题,就比较麻烦了,可以首先找到一个边点,然后检查周围的点,如果有合法(即没有超出当前色块)的点,就向那个点前进。但是按什么顺序检查周围的点就成了问题……。最终方案是从前一个点顺时针(当然逆时针也行,只不过要全图统一)旋转,向找到的第一个点前进,当目标等于起始点时退出即可。这里的旋转就要引入旋转矩阵了,具体的可以参考线代教材。到这里核心部分就算完成了,复杂度应该是o(n),还是可以的。其实算法本身挺简单的,但也不至于入门级水平,不知道为什么不见人讨论。
剩下能做的还有寻邻和边点压缩,还没做就不赘述了。
根据以上问题可以进行第一次改进,老哥的方法是全图锁定唯一色号生成目标地块,但其实我们可以用bfs提取颜色相同(或相近,需要容差),的像素点生成地图块,然后对地图块进行编号。这样根据四色定理,我们只需要四种颜色就可以画出我们想要的每一张平面地图,然后画地图流程和游戏逻辑部分采用编号进行沟通,在后续的游戏制作中也比较有好处。这样对于3d游戏就已经够用了,但是对2d游戏却仍然没法用,只能生成一张方形的texture,要实现点击还需要自己完成判断点击的部分,比较麻烦(当然也不是不能做)。
接下来就是进一步的改进:通过一定方法描出色块的边,使用的时候根据边点来生成多边形即可。当然说着好像很容易,只要找到边就好,那么在bfs的过程中判断是不是边就行了。一开始我也是这么干的,笑死,根本画不出来。因为图形api绘制多边形是一个点一个点连起来,然后填充内部,就是需要点序列顺序相连,能构成一个单连通区域。
要解决这个问题,就比较麻烦了,可以首先找到一个边点,然后检查周围的点,如果有合法(即没有超出当前色块)的点,就向那个点前进。但是按什么顺序检查周围的点就成了问题……。最终方案是从前一个点顺时针(当然逆时针也行,只不过要全图统一)旋转,向找到的第一个点前进,当目标等于起始点时退出即可。这里的旋转就要引入旋转矩阵了,具体的可以参考线代教材。到这里核心部分就算完成了,复杂度应该是o(n),还是可以的。其实算法本身挺简单的,但也不至于入门级水平,不知道为什么不见人讨论。
剩下能做的还有寻邻和边点压缩,还没做就不赘述了。