2016-12-06 66 views
2

现在,我有一个平铺地图,它是一个包含瓷砖的二维数组。没什么奇特:tiledMap [column] [row]。瓷砖是包含瓷砖类型的自定义SKSpriteNode对象,无论它是否可穿越等。影响瓷砖地图中特定瓷砖的正确和有效的方法

从1瓷砖到下一个瓷砖的字符移动被锁定&工作得很好。但是,现在我试图重构角色移动以便只能移动到突出显示的选定图块时遇到了障碍。这些突出显示的瓷砖将在他被选中时包围角色。

当前破碎的突出显示周围的瓷砖正在通过一个令人讨厌的循环,只是检查右侧,顶部,左侧的瓷砖&底部从角色所在的瓷砖开始。我设法扩展了通过单个瓷砖进一步检查瓷砖的能力,但它看起来像是一个亮点。我希望能够突出显示我希望的任何模式。悲剧是我无法弄清楚如何将简单地输入平铺模式的能力(可能是一些数字放到数组中?)需要突出显示。这是非常重要的,因为随着角色逐渐增长,他可以在他周围显示更复杂的方块图案,以便进行更多样化的动作。请帮忙。

回答

1

你可以尝试一个递归函数,其输入参数指示要操作的图块和递归深度,输出将是要突出显示的图块数组。因此,初始调用函数将包括开始瓦片和深度,随后的调用将通过相邻的瓦片和深度 - 1.当深度达到0时,您可以返回tiles数组并将其附加到前一次调用。

这是一个草案的例子。您需要提供您自己的实施getAdjacentTilesFABTile是您的自定义图块。

- (NSArray *)tilesToHighlight:(FABTile *)tile withDepth:(int)depth { 
    NSMutableArray *result = [NSMutableArray array]; 
    if (depth == 0) { 
     return result; 
    } 

    NSArray *adjacentTiles = [self getAdjacentTiles:tile]; 
    for (FABTile *adjacentTile in adjacentTiles) { 
     if (![result containsObject:adjacentTile]) { 
      [result addObject:adjacentTile]; 
     } 
     NSArray *tilesToHighlight = [self tilesToHighlight:adjacentTile withDepth:depth - 1]; 
     for (FABTile *tileToHighlight in tilesToHighlight) { 
      if (![result containsObject:tileToHighlight]) { 
       [result addObject:tileToHighlight]; 
      } 
     } 
    } 

    return result; 
} 

调用这样的方法。

NSArray *tilesToHighlight = [self tilesToHighlight:startTile withDepth:2]; 
+0

嗯,我试图找出如何应用这个,但我有一些困难。目前,我有一个方法返回一个瓷砖索引作为CGPoint。我如何将斐波纳契转换为结构? – Krekin

+0

我更新了示例,应该让你接近解决方案。这[示例](http://www.stone.com/The_Cocoa_Files/Recursion.html)很有帮助。我很感兴趣,看看这将如何工作,因为我很快就需要它:) –

+0

工程很漂亮。我的'getAdjacentTiles'方法以标准方式检查每个拼贴:检查右侧,顶部,左侧和底部拼贴。 – Krekin