2017-02-06 3 views
0

Ich benutze SKTilemapNode. Wie kann ich das Pathfinding mit GameplayKit richtig nutzen?Pathfinding on Tilemap mit GameplayKit

Einige Info: Die Wände sind alle Fliesen und keine Fliesen sind ‚Wege‘

+1

dieses youtuber verwendet pathfinding innerhalb des SKEditor ziemlich ausgiebig .. Es ist kein Tutorial, aber er hat Wegfindung erfolgreich in seinem Spiel implementiert. https://www.youtube.com/user/Veeneck/videos. Außerdem müssen Sie wahrscheinlich die verwandten WWDC 2016-Videos, die Apple auf ihrer Website dazu hat, ansehen. – Fluidity

Antwort

2

Die Grundidee ist es, eine SKGridGraph von verbundenen Knoten zu erstellen, dann die Knoten entfernen, die auf sein nicht ging. Die GameplayKit Guide zeigt ein Beispiel (Listing 6-1 Generieren eines Grid-Graphen). Also in Ihrem Fall mit SKTilemapNode die Graphen Breite und Höhe wird durch die Anzahl der Breite und Höhe auf der Karte z. Wenn Ihre Karte 32 Fliesen breit und 18 Fliese hoch ist, initialisieren dann die Grafik mit einer Breite von 32 und eine Höhe von 18

+0

Haben Sie ein gutes Tutorial für SKGridGraph? der Guide, den du gepostet hast, ist nicht so gut für mich – Lirf

+0

[Dieses Tutorial] (http://in8bits.com/gameplaykit-in-swift-a-tower-defence-game-part-3/) ist ein gutes Beispiel für den Aufbau eines Tower Defense Spiel mit SpriteKit und GameplayKit. Es verwendet den 'SKGridGraph'. –

4

Dies ist, wie ich einen GKGridGraph mit dem Inhalt eines meiner Fliese Karten implementiert:

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) 

ich hatte die isObstacle Eigenschaft im Userdata Feld meines Hindernis Fliese zu setzen:

enter image description here

diese Weise können Sie das resultierende Raster Graphen erhalten, ohne die osbtacles.

+0

Für jeden, der dieses Snippet verwendet, wird das Diagramm für die falschen Dimensionen eingerichtet. Es ist Setup für Wide = Spalten und Höhe = Spalten. Wenn Sie ein rechteckiges Raster haben, müssen Sie es in height = rows ändern –