#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 физическое тело для внешней стены вашего этажа, потому что выполнение этого плитка за плиткой будет означать, что вы застряли в отдельных плитках.