Предотвратить выход узла за границу

Я использую GameplayKit для создания путей вокруг препятствий на заданной границе карты (скажем, прямоугольник 1000x1000).

Я знаю, что вы можете заставить определенные узлы избегать «препятствий» при поиске пути, что я довольно хорошо использую. Что меня интересует, однако, таково:

  • Есть ли способ использовать ту же логику и считать все, не на границе карты, «препятствием»?

Обходным решением было бы создать 2 SKNode и соединить их вместе, чтобы создать внутреннюю «дыру», которая становится 1000x1000, но я пытаюсь избежать ненужного добавления узлов, если есть лучший способ. Ниже я показываю, что я мог сделать.

В идеале я хочу, чтобы красно-черная область рассматривалась как препятствие, чтобы все пути оставались внутри главной площади.

введите здесь описание изображения

ОБНОВЛЕНИЕ: я использую GameplayKit, как я уже сказал, и алгоритм поиска пути не может учитывать области, НЕ включенные в данное физическое тело, как препятствие. Он может считать препятствия только замкнутыми полигонами, лежащими в пределах области. Создание двух узлов, как показано выше, работает, потому что поиск пути теперь не сможет создать точки, лежащие за пределами зеленого прямоугольника.


person Will Von Ullrich    schedule 03.03.2016    source источник


Ответы (1)


Просто сделайте так, чтобы ваша игра была многоуровневой

Scene
  SKNode topshape
  SKNode bottomshape
  SKNode innerbox <-- This is the size of your inner square
    SKNode  gamenodes <-- Place all inner nodes here
    ...

Затем прикрепите SKPhysicsBody, используя прямоугольник контура ребра размером с внутренний блок, к innerbox SKNode и сделайте его категорией стены, это сохранит все ваши узлы внутри, при условии, что ваши узлы не будут двигаться с безумной скоростью, ломая двигатель.

Вы бы добавили 1 дополнительный узел вместо 2 (технически вы могли бы сделать нижний и верхний 1 узел, сделав его 0 добавленными узлами), но вся обработка будет выполняться во внутреннем узле, поэтому не будет добавлено много накладных расходов.

person Knight0fDragon    schedule 03.03.2016
comment
как бы вы сделали верхний и нижний узел? физическое тело с внутренней дырой?..не думал, что так можно сделать - person Will Von Ullrich; 04.03.2016
comment
из того, что вы предоставляете, вы можете сделать его 1 узлом с текстурой того, что вы отображаете, тогда внутренний узел будет вашей фактической игровой областью. - person Knight0fDragon; 04.03.2016
comment
правильный. так у меня сейчас. Мне нужно, чтобы эта внешняя область была физическим телом, а не определенной областью, чтобы алгоритм поиска пути мог идентифицировать ее как препятствие, а не использовать текстуру для определения периметра. Рис. 6-1 developer.apple.com/library/ ios/documentation/General/ К сожалению, у них нет возможности сделать область без узла и препятствие - person Will Von Ullrich; 04.03.2016
comment
почему вам нужно, чтобы внешняя область была физическим телом, это будет что-то иное, чем квадрат? - person Knight0fDragon; 04.03.2016
comment
да. какой-то многоугольник (несколько минут назад я редактировал свой вопрос) - person Will Von Ullrich; 04.03.2016
comment
хорошо, хорошо, если вы хотите, чтобы это был какой-то многоугольник, тогда ваш внутренний узел становится SKShapeNode вместо прямоугольника с формой, являющейся вашим многоугольником - person Knight0fDragon; 04.03.2016
comment
Давайте продолжим это обсуждение в чате. - person Will Von Ullrich; 04.03.2016