我的目标是创建一个与SKSpriteNode的轮廓相匹配的CGPath。
这对于创建SKSpriteNodes的发光/轮廓以及物理路径非常有用。
我曾经有过一个想法,但我对CIImage一点都不太熟悉,所以我不知道是否有办法在像素级别上访问/修改图像。
那么也许我可以将这样的东西移植到Objective-C:
http://www.sakri.net/blog/2009/05/28/detecting-edge-pixels-with-marching-squares-algorithm/
对于使这个过程自动化的其他方法也非常开放,而不是为我为物理或轮廓/发光效果创建的每个精灵创建形状路径。
答案 0 :(得分:5)
您正在寻找的是轮廓跟踪算法。 Moore neighbor tracing很受欢迎,适用于图片和图块地图。但请check out the alternatives,因为它们可能更适合您的目的。
AFAIK行进方块和轮廓跟踪密切相关,如果不是相同(类)算法。
瓦片图的实现(从瓦片创建物理形状)包含在Kobold Kit中。算法的主体位于traceContours method of KKTilemapLayerContourTracer.m。
它看起来比实际上更复杂,另一方面它需要一段时间才能绕过它,因为它是一种“行走”算法,这意味着先前步骤的结果用于当前步骤以做出决策。
KK实现还包括一些专门用于tilemaps的小修复(即两个或多个水平或垂直连接的tile成为单行,而不是将行划分为tile大小的段)。它也是使用自定义点数组结构创建的,当我将它移植到SK时,我决定继续使用它并且只在最后将点数组转换为CGPath对象。
如果您可以安全地假设您尝试跟踪的形状不会触及边框,并且不能存在仅对角连接的任何图块,则可以进行某些优化。当您为自己的目的实际实现算法时,所有这些都变得更加清晰。
但就现成的,适合所有目的的解决方案而言:没有一个。