Мне действительно нужно знать, как заблокировать ось x SKSpriteNode и его физическое устройство. Мне нужно сохранить SKSpriteNode dynamic
и affectedByGravity
. Узел находится на склоне, поэтому именно поэтому ось х перемещается из-за силы тяжести. Тем не менее, я не хочу, чтобы ось x этого SKSpriteNode двигалась из-за силы тяжести. Есть ли способ заблокировать ось x, чтобы достичь этого? Спасибо за любую помощь :D
Swift 3 (SpriteKit): Блокировка оси x для SKSpriteNode и ее физика.
Edit: Я попытался применить ограничение к значению х, как это:
let xConstraint = SKConstraint.positionX(SKRange(constantValue: 195))
node.constraints?.append(xConstraint)
Однако это не работает, и я не знаю, почему и как Исправить это. Кто-нибудь знает о решении?
Редактировать 2:SKPhysicsJointPin
на самом деле выглядит более перспективным. В комментариях первого ответа/ответа на этот вопрос я пытался понять, как правильно использовать его в моей ситуации.
Пример моего кода:
let node = SKSpriteNode(imageNamed: "node")
enum collisionType: UInt32 {
case node = 1
case ground = 2
case other = 4 //the other node is unrelated to the ground and node
}
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMove(to view: SKView) {
//Setup node physicsBody
node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
node.physicsBody?.categoryBitMask = collisionType.node.rawValue
node.physicsBody?.collisionBitMask = //[other node that isn't the ground or the node]
node.physicsBody?.contactTestBitMask = //[other node that isn't the ground or the node]
node.physicsBody?.isDynamic = true
node.physicsBody?.affectedByGravity = true
addChild(node)
//Physics Setup
physicsWorld.contactDelegate = self
}
узел находится на поверхности земли, а земля состоит из различных SKSpriteNode линий, которые имеют volumeBased physicsBody. Земля продолжает добавлять новые линии спереди и удалять их сзади, а также изменять значение x каждой строки отрицательным (так что земля кажется движущейся - этот процесс выполняется в SKAction). Эти линии (части земли) находятся под углом, поэтому перемещается ось x узла. Я хочу, чтобы узел всегда находился в передней части земли (например, всегда поверх вновь созданной строки). В настоящее время, устанавливая положение узла, как это блокирует ось х (решение моего вопроса):
override func didSimulatePhysics() {
//Manage node position
node.position.x = 195
node.position.y = CGFloat([yPosition of the first line of the ground - the yPosition keeps changing])
}
Примечания:^Эта^функция внутри класса GameScene
Оси й на самом деле остается такой же как это. Однако, проблема в том, что теперь физический элемент узла ниже центра узла (чего раньше не было).
Вы говорите, что это ограничение не работает. Разве что это вообще не работает, как никакой эффект? – Confused
Что значит, что вы не хотите, чтобы ось x двигалась из-за силы тяжести? Гравитация не влияет на спрайт на оси x, возможно, вам нужно объяснить проблему лучше – Knight0fDragon
@Confused Да, вот что я имею в виду, но фонд didSimulatePhysics() работает намного лучше, но теперь у вас есть новая проблема - прочитайте мое редактирование. –