2016-12-01 4 views
2

Ich arbeite derzeit in Xcode 8, mit Swift 3 und dem neuen SKTileMapNode von SpritKit, um einen 2D-Dungeon-Crawler-Spieltyp zu erstellen. Ich habe Probleme, GKObstacleGraph mit der Kachel zu arbeiten. Bitte helfen Sie! Ich habe versucht, alle Kacheln innerhalb der Hindernis-Ebene der Kachelkarte zu durchlaufen und ein Polygon für jede Kachel zu erstellen und im GKO-Hindernis-Graphen zu speichern. Jede Kachel in der Hindernisschicht ist eine Wandfliese. Die Karte sieht wie eine Art Dungeon-Crawler aus, also ist die Wand überall verteilt. Ich habe so etwas wie unten:GKObstacleGraph zur Arbeit mit SKTileMapNode

for row in 0..<tileMapNode.numberOfRows { 
    for column in 0..<tileMapNode.numberOfColumns { 
    let tile = tileMapNode.tileDefinition(atColumn: column, row: row) 
    let tileCenter = tileMapName.centerOfTile(atColumn: column, row: row) 
    //find 4 corners of each tile from its center 
    let bottomLeft = float2(CGPointMake(tileCenter.x - tile.size.width/2, tileCenter.y - tile.size.height/2)) 
    let bottomRight = float2(CGPointMake((tileCenter.x - tile.size.width/2, tileCenter.y + tile.size.height/2)) 
    let topRight = float2(CGPointMake((tileCenter.x + tile.size.width/2, tileCenter.y + tile.size.height/2)) 
    let topLeft = float2(CGPointMake((tileCenter.x - tile.size.width/2, tileCenter.y + tile.size.height/2)) 
    var vertices = [topLeft , bottomLeft , bottomRight , topRight ] 
    let obstacle = GKPolygonObstacle(points: &vertices, count: 4) 
    obstacleGraph.add(obstacle) 
    } 
} 

Allerdings, wenn ich die App ausführen es zeigt, dass es mehr als 80000 Knoten, viel zu viel Wegfindung pathes. Jede Hilfe wäre willkommen.

Antwort

0

Ich bin nicht sicher, dass GKObstacleGraph hier die richtige Wahl der Grafik ist. Nach dem GameplayKit documentation:

Zum Beispiel können Sie einen Level-Design mit dem SpriteKit Szene Editor in Xcode und Physik Körper verwenden Regionen zu markieren, die der Spieler (oder ein anderes Spiel Entitäten) nicht passieren kann, dann die obstaclesFromNodePhysicsBodies verwenden : Methode zum Erzeugen von GKPolygonHindernis-Objekten, die unpassierbare Bereiche markieren.

Die Funktion obstaclesFromNodePhysicsBodies wird verwendet, um Hindernisse zu entfernen und den Graphen zu erstellen;

let obstacles = SKNode.obstaclesFromNodePhysicsBodies(self.children) 
graph = GKObstacleGraph(obstacles: obstacles, bufferRadius: 0.0) 

Für ein SKTilemapNode ein kartesisches Gitter darstellt, scheint die GKGridGraph die wahrscheinliche Wahl.

+0

Dank Mark. Ich habe versucht, die Funktion objectsFromNodePhysicsBodies zu verwenden, aber es endete damit, dass ich dieselben Ergebnisse erhielt, was sinnvoll ist, weil jede Wandfliese einen eigenen Physikkörper hat und es Hunderte von ihnen auf der Karte gibt. Ich habe über GKGridGraph nachgedacht, bin mir aber nicht sicher, ob es gut passt, denn die Entitäten in meinem Spiel bewegen sich frei auf der Karte, es ist kein Gitter-basiertes Spiel. Kann ich GKGridGraph für die Pfadsuche auch dann verwenden, wenn das Spiel nicht gridbasiert ist? – Bob

+0

Eine weitere Sache. Ich beabsichtige mit GKAgent feindliche Einheiten zu bewegen. etwas wie: GKGoal (toFollowPath: path, maxPredictionTime: 1.0, forward: true). Daher muss der Pfad GKGraphNodes enthalten, nicht GKGridGraphNodes. – Bob

+0

Der 'GKGridGraphNode' erbt von' GKGraphNode', also kein Problem mit 'GKGoal'. –