2016-07-25 4 views
1

Вот мой вопрос:Препятствие С GameplayKit

  • Как я могу преобразовать SKSpriteNode массив в массив GKObstacles так, что агент может надлежащим образом избежать этих препятствий с помощью goalToAvoidObstacles:(nonnull NSArray<GKObstacle *> *) maxPredictionTime:(NSTimeInterval) /?

кажется, что путь, в котором я создаю GKObstacle массив не позволяет GKGoal не правильно идентифицировать их как препятствия, независимо от того, какой вес я даю цели.

У меня в настоящее время несколько SKNode сек, которые добавляются к SKScenechapterScene. Каждый из этих узлов добавляется к массиву, который я храню, называется препятствиями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;:

enter image description here

Так что я знаю что физический организм - это то, что мне нужно. Однако, когда я пытаюсь создать GKObstacle из этого тела, он, похоже, не регистрируется в качестве препятствия при назначении цели goalObstacles.

+0

Физические тела не являются бесплатными, вам необходимо создать их для своих узлов. Я не вижу этого нигде в коде. – Knight0fDragon

+0

Извините, у меня есть TONS узлов с PB, поэтому я не предоставил код для меня. Я приведу один пример в обновлении моего вопроса –

+0

Возможно, у вас есть вопрос с порядком событий? вы проверяете перед «препятствиями», чтобы узнать, высоки ли узлы в массиве? – Knight0fDragon

ответ

0

Это звучит как ошибка. Вы должны проверить возвращаемый массив от препятствийFromNodePhysicsBodies и убедиться, что вы действительно возвращаете препятствия, которые вы ожидаете. Я подозреваю, что нет.

Вы можете проверить соответствующие вершины на ваши препятствия, как, например:

https://developer.apple.com/library/ios/documentation/GameplayKit/Reference/GKPolygonObstacle_Class/index.html#//apple_ref/occ/cl/GKPolygonObstacle

Убедитесь, что они есть то, что вы ожидаете.

Смежные вопросы