2017-02-06 2 views
0

Я использую SKTilemapNode. Как я могу правильно использовать Pathfinding с GameplayKit?Pathfinding на Tilemap с GameplayKit

Некоторые Информация: Стены все плитки и нет плитки не

+1

Этот youtuber довольно широко использует pathfinding внутри 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/) является хорошим примером построения Игра Tower Defense с 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 свойство в области USERDATA моего препятствия плитки:

enter image description here

Таким образом, вы получаете в результате сетки график без osbtacles.

+0

Для всех, кто использует этот фрагмент ... график настроен на неправильные размеры. Это настройка для столбцов wide = columns и height =. Если у вас есть прямоугольная сетка размера, вам придется изменить ее на height = rows –

Смежные вопросы