Hier ist meine Frage:Hindernisse Mit GameplayKit
- Wie kann ich ein
SKSpriteNode
Array in ein Array vonGKObstacles
so umwandeln, dass ein Agent kann in geeigneter Weise diese Hindernisse vermeiden, indem diegoalToAvoidObstacles:(nonnull NSArray<GKObstacle *> *) maxPredictionTime:(NSTimeInterval)
mit /?
Es scheint, dass die Art und Weise, in der ich die GKObstacle
Array ermöglichen nicht die GKGoal
richtig diese als Hindernisse zu identifizieren, erschaffe, egal, was Gewicht, das ich mit dem Ziel geben.
Ich habe derzeit mehr SKNode
s, die zu einem SKScene
chapterScene hinzugefügt werden. Jeder dieser Knoten wird zu einem Array hinzugefügt, das ich als hoodlesArray bezeichnet. Ich habe einen Test in der folgenden Art und Weise aufgebaut, die sehr gut funktioniert:
ARBEITS HINDERNISSEN
- (void)didMoveToView:(nonnull SKView *)view {
[super didMoveToView:view];
// Add three obstacles in a triangle formation around the center of the scene.
NSArray<GKObstacle *> *obstacles = @[
[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)],
];
// The player agent follows the tracking agent.
self.player = [[OPlayer alloc] initWithScene:self
radius:50
position:CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame))];
self.player.agent.behavior = [[GKBehavior alloc] init];
[self.agentSystem addComponent:self.player.agent];
// Create the seek goal, but add it to the behavior only in -setSeeking:.
self.seekGoal = [GKGoal goalToSeekAgent:self.character];
// Add an avoid-obstacles goal with a high weight to keep the agent from overlapping the obstacles.
[self.player.agent.behavior setWeight:100 forGoal:[GKGoal goalToAvoidObstacles:obstacles maxPredictionTime:1]];
}
- (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;
}
Während dies funktioniert gut, das Problem, das ich habe ist, dass ich nicht das Verhalten bekommen kann Identifizieren Sie das SKNode
Körper-Array, das ich als Hindernisse habe. Ich kann nur diese manuell erzeugten Elemente als gültige Hindernisse erhalten, die der Agent vermeidet. Der Grund, warum dies ein Problem ist, liegt darin, dass ich mich auf viele Hindernisse stütze, die in Wirklichkeit keine einfachen Kreise sind, sondern vielschichtige Polygonstrukturen, einige einfacher. Trotzdem war ich versucht, die folgenden aber mein Agent schien nicht alle Hindernisse zu vermeiden, dass diese Art der SKNode
sind:
NICHT
NSArray *obstacles = [SKNode obstaclesFromNodePhysicsBodies:obstaclesArray];
/*
The other code seen above
*/
// Add an avoid-obstacles goal with a high weight to keep the agent from overlapping the obstacles.
[self.player.agent.behavior setWeight:100 forGoal:[GKGoal goalToAvoidObstacles:obstacles maxPredictionTime:1]];
Leider HINDERNISSEN ARBEITEN, das scheint nicht zu funktionieren Egal wie hoch ich das Gewicht anlege, der Agent reagiert nie darauf, die Hindernisse zu umgehen. Hier ist ein Protokoll des Arrays ich bin es vorbei:
2016-07-24 22:32:24.907 <GAME>[1516:475581] obstacles: (
"<GKPolygonObstacle: 0x14d20d70>",
"<GKPolygonObstacle: 0x14d20e10>",
"<GKPolygonObstacle: 0x14d20ba0>",
"<GKPolygonObstacle: 0x14d20bb0>",
"<GKPolygonObstacle: 0x14d20bc0>",
"<GKPolygonObstacle: 0x14d20a60>",
"<GKPolygonObstacle: 0x14d208b0>",
"<GKPolygonObstacle: 0x14d207d0>",
"<GKPolygonObstacle: 0x14d20a70>"
)
Jeder von denen alle klar und entsprechend initialisiert und in die Szene. Jedes dieser Elemente reagiert tatsächlich mit der SpriteKit
didBeginContact:(SKPhysicsContact *)contact
Methode, so dass es scheint, dass die Knoten die Grenzen richtig übergeben, die sie haben sollten.
Wenn jemand weiß, was ich falsch mache oder eine bessere Möglichkeit, jeden dieser "Hindernisknoten" in GKObstacle
zu verwandeln, wäre ich sehr dankbar. Danke im Voraus!
UPDATE: Hier ist ein Knoten mit einem Physik-Körper, den ich testen bin:
SKSpriteNode *innerMap1 = [SKSpriteNode spriteNodeWithImageNamed:@"test"];
innerMap1.physicsBody = [SKPhysicsBody bodyWithTexture:[SKTexture textureWithImageNamed:@"test"] size:CGSizeMake(innerMap1.frame.size.width*0.92, innerMap1.frame.size.height*0.92)];
innerMap1.position = CGPointMake(-220, -140);
innerMap1.physicsBody.dynamic = NO;
[chapterSKSpriteNodes addObject:innerMap1];
Hier ist, was der Körper wie mit skView.showsPhysics = YES;
aussieht:
So weiß ich, dass der Physikkörper das ist, was ich brauche. Wenn ich versuche, das GKObstacle
von diesem Körper jedoch zu erstellen, scheint es nicht als ein Hindernis zu registrieren, wenn es in dem Ziel VermeidungHindernisse zugewiesen wird.
Physik Körper sind nicht frei, Sie müssen sie für Ihre Knoten erstellen. Ich sehe das nirgends in dem Code zur Verfügung gestellt – Knight0fDragon
Entschuldigung - habe TONS von Knoten mit PB so habe ich nicht den Code für mich, sie zu machen. Ich werde ein Beispiel in einem Update zu meiner Frage geben –
Vielleicht haben Sie ein Problem mit der Reihenfolge der Ereignisse? Überprüfe du vor 'hemmesFromNodePhysicsBodies', ob die Knoten im Array groß sind? – Knight0fDragon