2017-02-06 79 views
0

我正在使用SKTilemapNode。 如何正確使用GameplayKit的路徑查找?使用GameplayKit在Tilemap上尋找路徑

一些信息:牆壁都是瓷磚和地磚沒有在「辦法」

+1

這個youtuber在SKEditor中使用了很多廣泛的尋路..這不是教程,但他已經在他的遊戲中成功實現了尋路。 https://www.youtube.com/user/Veeneck/videos。此外,您可能需要觀看蘋果在其網站上發佈的有關WWDC 2016視頻。 – Fluidity

回答

2

的基本思想是建立連接的節點的SKGridGraph,然後刪除,不能踩踏的節點。 GameplayKit Guide顯示了一個示例(清單6-1生成網格圖)。因此,在您的使用SKTilemapNode的情況下,圖的寬度和高度由地圖上寬瓦高數決定,如果地圖是32瓦寬和18瓦高,則初始化爲32的寬度和高度的18

+0

你對SKGridGraph有很好的教程嗎?你發佈的指南對我來說不是那麼好 – Lirf

+0

[本教程](http://in8bits.com/gameplaykit-in-swift-a-tower-defence-game-part-3/)是構建與SpriteKit和GameplayKit的塔防遊戲。它使用'SKGridGraph'。 –

4

圖表這是我是如何實現使用我的瓦片的地圖中的一個的內容的GKGridGraph:

let graph = GKGridGraph(fromGridStartingAt: vector_int2(0,0), width: Int32(tileMap.numberOfColumns), height: Int32(tileMap.numberOfColumns), diagonalsAllowed: false) 

    var obstacles = [GKGridGraphNode]() 

    for column in 0..<tileMap.numberOfColumns 
    { 
     for row in 0..<tileMap.numberOfRows 
     { 
      let position = tileMap.centerOfTile(atColumn: column, row: row) 

      guard let definition = tileMap.tileDefinition(atColumn: column, row: row) else { continue } 

      guard let userData = definition.userData else { continue } 
      guard let isObstacle = userData["isObstacle"] else { continue } 

      if isObstacle 
      { 
       let wallNode = graph.node(atGridPosition: vector_int2(Int32(column),Int32(row)))! 
       obstacles.append(wallNode) 
      } 
     } 
    } 

    graph.remove(obstacles) 

我不得不設置isObstacle財產在我的障礙瓷磚的用戶數據領域:

enter image description here

這樣你得到的格子狀的圖形,而不osbtacles。

+0

對於任何使用此代碼段的人來說...圖表是爲錯誤的尺寸設置的。它設置爲寬=列和高=列。如果你有一個矩形大小的網格,你必須將它改爲height = rows –