2015-11-02 2 views
0

Je suis en train de configurer le pathfinding dans mon jeu. Si je place tous mes obstacles en soi, alors cela fonctionne très bien.Modifier le système de coordonnées utilisé dans SKNode.obstaclesFromNodeBounds?

Si toutefois je place mes obstacles dans un conteneur (SKSpriteNode) appelé "main", alors cela ne fonctionne pas du tout - mon joueur marche à "terminer" complètement en ignorant les obstacles.

J'ai essayé de le comprendre pour un certain temps maintenant, mais il semble que les obstacles sont encore les coordonnées de ma scène, de « soi »

Donc, ma question est de savoir comment puis-je changer la système de coordonnées utilisé avec SKNode.obstaclesFromNodeBounds? Je veux qu'il soit relatif au système de coordonnées de "principal".

Mon code est le suivant:

import SpriteKit 
import GameplayKit 

class GameScene: SKScene { 
var player:SKSpriteNode! 
override func didMoveToView(view: SKView) { 

    let main = SKSpriteNode(color: UIColor.grayColor(), size: CGSize(width: 736, height: 414)) 
    main.position = CGPoint(x: 736/2, y: 414/2) 
    self.addChild(main) 

    player = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 50, height: 50)) 
    player.position = CGPoint(x: (main.frame.size.width-player.frame.size.width)/2, y: 0) 
    main.addChild(player) 

    let end = SKSpriteNode(color: UIColor.orangeColor(), size: CGSize(width: 50, height: 50)) 
    end.position = CGPoint(x: -(main.frame.size.width-player.frame.size.width)/2, y: 0) 
    main.addChild(end) 

    let obstacle = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 50, height: 100)) 
    main.addChild(obstacle) 

    let obstacleNodes = [obstacle] 

    let obstacles = SKNode.obstaclesFromNodeBounds(obstacleNodes) 

    let graph = GKObstacleGraph(obstacles: obstacles, bufferRadius: 30) 

    for var i = 0; i < graph.obstacles.count; i++ { 
     let obs = graph.obstacles[i] 
     var string = "Count: \(obs.vertexCount)\n" 
     for var k = 0; k < obs.vertexCount; k++ { 
      let vertex = obs.vertexAtIndex(k) 
      string += "Vertex \(k): \(vertex)\n" 

     } 
     print(string) 
    } 


    let startX = player.position.x 
    let startY = player.position.y 

    let endX = end.position.x 
    let endY = end.position.y 

    let startNode = GKGraphNode2D(point: float2(Float(startX), Float(startY))) 
    let endNode = GKGraphNode2D(point: float2(Float(endX), Float(endY))) 

    print(startNode) 

    graph.connectNodeUsingObstacles(startNode) 
    graph.connectNodeUsingObstacles(endNode) 

    let path:[GKGraphNode] = graph.findPathFromNode(startNode, toNode: endNode) 
    let cgPath = CGPathCreateMutable() 
    print(path.count) 

    CGPathMoveToPoint(cgPath, nil, CGFloat(startNode.position.x), CGFloat(startNode.position.y)) 
    for node:GKGraphNode in path { 
     if let point2d = node as? GKGraphNode2D { 
      let point = CGPoint(x: CGFloat(point2d.position.x), y: CGFloat(point2d.position.y)) 

      CGPathAddLineToPoint(cgPath, nil, point.x, point.y) 
     } 
    } 

    let follow = SKAction.followPath(cgPath, asOffset: false, orientToPath: true, speed: 50) 

    player.runAction(follow) 
    player.paused = true 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    player.paused = false 

} 

override func update(currentTime: CFTimeInterval) { 
} 
} 

La sortie des obstacles est la suivante:

Vertex 0: float2(343.0, 157.0) 
Vertex 1: float2(393.0, 157.0) 
Vertex 2: float2(393.0, 257.0) 
Vertex 3: float2(343.0, 257.0) 

Mais il devrait être

-25, 50 
25, 50 
25, -50 
-25, -50 

apprécierais toute entrée!

Répondre

0

je ne pouvais trouver un moyen de le faire, mais j'ai travaillé autour d'elle en ajoutant manuellement les GKPolygonObstacles telles que celle-ci:

func getPolygonObstacleForSpriteNode(node: SKSpriteNode) -> GKPolygonObstacle { 
    let pts = [vector_float2(Float(node.x-node.widthHalf), Float(node.y-node.heightHalf)), vector_float2(Float(node.x+node.widthHalf), Float(node.y-node.heightHalf)), vector_float2(Float(node.x+node.widthHalf), Float(node.y+node.heightHalf)), vector_float2(Float(node.x-node.widthHalf), Float(node.y+node.height))] 
    let polygonObstacle = GKPolygonObstacle(points: UnsafeMutablePointer(pts), count: pts.count) 
    return polygonObstacle 
} 

Remarque: cette fonction ne fonctionne pas pour les noeuds directement self (car ils ont un système de coordonnées différent) mais seulement dans un autre nœud tel qu'un conteneur comme je l'ai.