Как удержать узел от перемещения (за пределы) другого узла

#swift #sprite-kit #skphysicsbody #sknode

#swift #sprite-kit #skphysicsbody #sknode

Вопрос:

У меня есть несколько узлов квадратной формы (например, напольные плитки), расположенных вдоль экрана, и я хотел бы ограничить перемещение моего узла player (P) в пределах этих узлов.

 ---------------------------------
|   | P |   |   |   |   |   |   |    <- Want no movement allowed 
---------------------------------       outside of these squares.
            |   |
        -------------
        |   |   |   | ...  
        -------------
 

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

Спасибо!

Ответ №1:

SKConstraint Объект описывает математическое ограничение на положение или ориентацию узла.

Вы можете использовать SKConstraint , чтобы удерживать узел на определенном расстоянии от определенной точки на горизонтальной оси:

 let center = size.width/2.0, difference = CGFloat(170.0)
let leftConstraint = SKConstraint.positionX(SKRange(constantValue: center - difference))
let rightConstraint = SKConstraint.positionX(SKRange(constantValue: center   difference))    
player.constraints = [leftConstraint, rightConstraint]
 

Вы также можете включить или отключить определенное ограничение во время игры:

 leftConstraint.enabled = false
 

Ответ №2:

Вы используете физические тела на основе ребер, а не физические тела на основе объемов. Итак, при построении физического тела ищите все edge , что есть в конструкторе. Теперь, если вы хотите иметь возможность ходить между плитками, вам нужно будет создать 1 физическое тело для внешней стены вашего этажа, потому что выполнение этого плитка за плиткой будет означать, что вы застряли в отдельных плитках.