GameplayKit GKPolygonObstacle не работает с GKGoal

Подобно вопросу, который я опубликовал здесь , я теперь понимаю, что проблема более тривиальная, которую я ожидал, поскольку это работает для некоторых элементов GameplayKit но не для других.

У меня есть препятствие, SKNode , которое я пытаюсь определить как GKPolygonObstacle который может использоваться агентом GKAgent2D , как препятствие, которое следует избегать при перемещении в SKScene я создал.

Я заглянул в Apple AgentsCatalog, чтобы узнать, как они используют GKObstacle с агентом в методе GameplayKit :

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

Когда я использую следующий код в своем собственном проекте для создания объектов GKCircleObstacle , я обнаружил, что агент довольно хорошо перемещается и избегает этих круговых препятствий довольно хорошо в зависимости от веса, который я им даю (уровень важности).

Вот код, который я использую:

 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]; 

С помощью следующего метода, который создает и добавляет эти препятствия: (это напрямую извлекается из исходного кода Apple для AgentsCatalog)

 - (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; } 

Это отлично работает, так как враг избегает этих кругов, пытаясь переместиться в определенную меняющуюся позицию на сцене.

ВОПРОС

Когда я пытаюсь воссоздать это поведение GKGoal , используя объекты GKPolygonObstacle объектов GKCircleObstacle , вражеский агент, похоже, не может идентифицировать полигональные препятствия как препятствия, чтобы избежать поведенческой цели. Вот как я пытаюсь добавить эти препятствия:

 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]; 

Самое неприятное в этом – это то, что я знаю, что массив правильно создает NSArray объектов GKPolygonObstacle поскольку я использовал этот подход для поиска пути (до того, как я решил болезненно реализовать GameplayKit и он ищет, избегает и блуждает по целям) , Вот как я использовал этот 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; } 

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

  • Итак, возникает реальный вопрос: почему GKGoal принимает объекты GKCircleObstacle но не объекты GKPolygonObstacle ?

Если кто-то может помочь мне разобраться, как преобразовать эти объекты SKNode в приемлемые препятствия, которые регистрируются в GKGoal я был бы чрезвычайно благодарен. Спасибо.

Это очень странный / простой ответ, и я боюсь, что теперь у меня есть препятствия, которые можно избежать (более чем, по крайней мере, …) врагом.

  • Предоставление GKGoal для избежания препятствий очень мал maxPredictionTime (t <10), кажется, заставляет агента полностью игнорировать препятствия. Любое время прогнозирования 10 или больше + вес 100+, по-видимому, вызывает правильное поведение.
  • Как добавить жестом салфетки к узлу в spritekit
  • HitTest для SKSpriteNode
  • SKAction playSoundFileNamed без звука через динамик iphone
  • Как ограничить кран мяча в Swift 3 / SpriteKit?
  • Оптимизация SKLabelNode для снижения производительности
  • Как добавить указатели жестов в сцену комплекта спрайтов
  • Кадр SKShapeNode содержит точку (0, 0), даже если CGPath не
  • SpriteKit: Предварительно загрузите звуковой файл в память перед воспроизведением?
  • Как я могу перезапустить SKScene?
  • SpriteKit - остановка объектов наложения
  • iOS 7.1 Sprite Kit AVAudioSession Crash при вводе фона
  • Interesting Posts

    Изменение фазы изображения шаблона

    FBSDKGraphRequest не работает (iOS)

    Как ограничить мое приложение только iPhone 6 и 6 Plus?

    iOS: код аутентификации Google

    UIScrollView: клавиатура убирается в интерактивном режиме

    Ошибка после обновления до xcode 4.6 и iOS 6.1 "используется как имя предыдущего параметра, а не как часть селектора"

    Потоковая передача пользовательских треков из звукового облака в приложение

    могу ли я изменить язык результатов API Google Places для iOS?

    Избегание нарушения LSP при подклассе

    iOS Airplay – «Игра на вашем телевизоре»

    Загрузите несколько фотографий в виде одной публикации, например, фотографий в хронологическом порядке, не похожих на альбом в Facebook, используя iOS SDK

    Установите фоновое изображение для пользовательского UIView

    Глобальные иконки favicon.ico и iOS

    Xcode 4.5: «не имеет доступа к iOS 5.1 симулятору»

    Безопасный dealloc объекта ObjC на устройстве iOS

    Давайте будем гением компьютера.