Вот мой вопрос:Препятствие С GameplayKit
- Как я могу преобразовать
SKSpriteNode
массив в массивGKObstacles
так, что агент может надлежащим образом избежать этих препятствий с помощьюgoalToAvoidObstacles:(nonnull NSArray<GKObstacle *> *) maxPredictionTime:(NSTimeInterval)
/?
кажется, что путь, в котором я создаю GKObstacle
массив не позволяет GKGoal
не правильно идентифицировать их как препятствия, независимо от того, какой вес я даю цели.
У меня в настоящее время несколько SKNode
сек, которые добавляются к SKScene
chapterScene. Каждый из этих узлов добавляется к массиву, который я храню, называется препятствиямиArray. Я создал тест следующим образом, что работает очень хорошо:
РАБОТАЮЩЕГО ПРЕПЯТСТВИЯ
- (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;
}
Хотя это прекрасно работает, то проблема, которую я имею что я не могу получить поведение в идентифицируйте массив тел SKNode
, который у меня есть как препятствия. Я могу получить только эти вручную созданные файлы GKCircleObstacle
, чтобы зарегистрировать как допустимые препятствия, которые агент избегает. Причина в том, что это проблема, потому что я полагаюсь на многие препятствия, которые на самом деле не простые круги, а многоугольные структуры - некоторые сложные, некоторые более простые. Тем не менее, я пытался следующий, но мой агент не похоже, чтобы избежать какой-либо из препятствий, которые имеют SKNode
таким образом:
НЕ РАБОТАЕТ ПРЕПЯТСТВИЯ
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]];
К сожалению, это не похоже на работу как бы ни был я настроен вес, агент никогда не реагирует, чтобы избежать препятствий. Вот лог массива я передаю ему:
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>"
)
Каждый из которых все было четко и надлежащим образом инициализируется и добавляется к сцене. Каждый из этих элементов на самом деле реагирует на метод , поэтому кажется, что узлы правильно передают границы, которые они должны иметь.
Если кто-то знает, что я делаю неправильно, или лучший способ превратить каждый из этих «препятствий» в GKObstacle
, я был бы очень благодарен. Заранее спасибо!
UPDATE: Вот узел с физическим телом, которое я тестирую:
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];
Вот что тело выглядит с skView.showsPhysics = YES;
:
Так что я знаю что физический организм - это то, что мне нужно. Однако, когда я пытаюсь создать GKObstacle
из этого тела, он, похоже, не регистрируется в качестве препятствия при назначении цели goalObstacles.
Физические тела не являются бесплатными, вам необходимо создать их для своих узлов. Я не вижу этого нигде в коде. – Knight0fDragon
Извините, у меня есть TONS узлов с PB, поэтому я не предоставил код для меня. Я приведу один пример в обновлении моего вопроса –
Возможно, у вас есть вопрос с порядком событий? вы проверяете перед «препятствиями», чтобы узнать, высоки ли узлы в массиве? – Knight0fDragon