2016-07-25 26 views
3

ähnlich eine Frage, die ich here Beiträge geschrieben habe, bin ich jetzt erkennen, dass das Problem trivial ist, dass ich erwartet, da dies für einige Elemente von GameplayKit anderen aber nicht funktioniert ..GameplayKit GKPolygonObstacle Nicht Arbeiten mit GKGoal

I habe ein Hindernis, ein SKNode, das ich versuche zu definieren, wie ein GKPolygonObstacle, der von einem Agenten verwendet werden kann, ein GKAgent2D, als ein Hindernis zu vermeiden, wenn ich in einem SKScene Ich habe eingerichtet.

Ich habe in zu Apple's AgentsCatalog schaute, um zu sehen, wie sie GKObstacle mit einem Agenten in der GameplayKit Methode verwenden:

goalToAvoidObstacles:(nonnull NSArray<GKObstacle *> *) maxPredictionTime:(NSTimeInterval) 

Wenn ich den folgenden Code in meinem eigenen Projekt verwenden GKCircleObstacle Objekte zu erstellen, ich, dass die finden Agent ganz schön navigiert herum und vermeidet diese kreisförmigen Hindernisse ganz schön abhängig von dem Gewicht gebe ich es (Wichtigkeitsgrad). Hier

ist der Code, den ich verwende:

NSArray<GKObstacle *> *obstacles2 = @[ 
    [self addObstacleAtPoint:CGPointMake(CGRectGetMidX(self.frame), 
          CGRectGetMidY(self.frame) + 150)], 
    [self addObstacleAtPoint:CGPointMake(CGRectGetMidX(self.frame) - 200, 
          CGRectGetMidY(self.frame) - 150)], 
    [self addObstacleAtPoint:CGPointMake(CGRectGetMidX(self.frame) + 200, 
          CGRectGetMidY(self.frame) - 150)], ]; 

enemy.avoidGoal = [GKGoal goalToAvoidObstacles:obstacles2 maxPredictionTime:1]; 
[enemy.agent.behavior setWeight:100 forGoal:enemy.avoidGoal]; 

Mit dem folgenden Verfahren, das schafft und fügt diese Hindernisse: (dies direkt von der Apple-Quellcode für die AgentsCatalog gezogen wird)

- (GKObstacle *)addObstacleAtPoint:(CGPoint)point { 
    SKShapeNode *circleShape = [SKShapeNode shapeNodeWithCircleOfRadius:50]; 
    circleShape.lineWidth = 2.5; 
    circleShape.fillColor = [SKColor grayColor]; 
    circleShape.strokeColor = [SKColor redColor]; 
    circleShape.zPosition = 1; 
    circleShape.position = point; 
    [self addChild:circleShape]; 

    GKCircleObstacle *obstacle = [GKCircleObstacle obstacleWithRadius:50]; 
    obstacle.position = (vector_float2){point.x, point.y}; 

    return obstacle; 
} 

Das funktioniert gut, wenn der Gegner diese Kreise vermeidet, während er versucht, sich an eine bestimmte Position in der Szene zu bewegen.

AUSGABE

Wenn ich durch die Verwendung GKPolygonObstacle Objekte anstelle der GKCircleObstacle Objekte dieses GKGoal Verhalten nachzubilden versuche, können die feindlichen Agenten nicht scheinen, um die Polygon Hindernisse zu identifizieren, als Hindernisse für das Verhalten Ziel zu vermeiden. Hier ist, wie ich diese Hindernisse hinzufügen bin versucht:

NSArray<GKObstacle *> *obstacles = [SKNode obstaclesFromNodePhysicsBodies:innerMapArray]; 

// Take this array of GKPolygonObstacle objects and add it 
// to the GKGoal of the enemy as obstacles to avoid 

enemy.avoidGoal = [GKGoal goalToAvoidObstacles:obstacles maxPredictionTime:1]; 
[enemy.agent.behavior setWeight:100 forGoal:enemy.avoidGoal]; 

Was die meisten frustrierend über dieses ist, ist, dass ich weiß, dass das Array richtig ein NSArray von GKPolygonObstacle Objekte schafft, wie ich diesen Ansatz für Wegfindung verwendet haben, als auch (bevor ich mich entschied, GameplayKit schmerzhaft zu implementieren und es Ziele suchen, vermeiden und wandern). Hier ist, wie ich mit diesem innerMapArray:

- (NSArray *)findPathWithNode:(SKNode *)nodeToFindPath { 

    NSArray *obstacles = [SKNode obstaclesFromNodePhysicsBodies:innerMapArray]; 
    GKObstacleGraph *graph = [GKObstacleGraph graphWithObstacles:obstacles bufferRadius:35.0f]; 


    // Set up enemy and target 
    GKGraphNode2D *target = [GKGraphNode2D nodeWithPoint:vector2((float)character.position.x, (float)character.position.y)]; 
    GKGraphNode2D *enemy = [GKGraphNode2D nodeWithPoint:vector2((float)nodeToFindPath.position.x, (float)nodeToFindPath.position.y)]; 

    [graph connectNodeUsingObstacles:enemy]; 
    [graph connectNodeUsingObstacles:target]; 

    /// Create tracking path 
    NSArray *pathPointsFound = [graph findPathFromNode:enemy toNode:target]; 


    return pathPointsFound; 
} 

Diese Methode ganz gut die Punkte gibt, an denen der effizienteste Weg umfassen sollte Hindernisse zu umgehen ich den Feind sage zu vermeiden, wenn sie versuchen, eine Position zu erreichen, .

  • Die eigentliche Frage ist: warum die GKGoalGKCircleObstacle Objekte akzeptieren, aber nicht GKPolygonObstacle Objekte?

Wenn jemand mir helfen, herausfinden, wie diese SKNode Objekte in akzeptable Hindernisse zu konvertieren, die mit den GKGoal registrieren würde ich sehr dankbar sein. Vielen Dank.

Antwort

2

Dies ist eine sehr seltsame/einfache Antwort, und ich fürchte, ich habe jetzt die Hindernisse vermieden (mehr als nicht mindestens ..) vom Feind.

  • Erteilen des GKGoal zur Vermeidung von Hindernissen eine sehr niedrigenmaxPredictionTime (t < 10) scheint das Mittel, um vollständig die Hindernisse zu ignorieren. Jede Vorhersagezeit von 10 oder mehr + ein Gewicht von 100+ scheint korrektes Verhalten zu verursachen.
+0

Leider ist dieses Verhalten nicht auf den Grenzknoten angelegt wird, die ich habe ... –

+0

Interessant -> Ich habe das entgegengesetzte Verhalten t <10 fein gearbeitet, aber t> = 10 nur alles – ColdSteel

+2

ignorierte Ich wünsche, hatte Apple erzeugte eine etwas gründlichere Plattform. Es hat ein großes Potenzial, nur nicht richtig ausgeführt die ersten gehen herum. hoffe auf ein update bald .. –