2016-12-06 122 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