我需要知道如何锁定SKSpriteNode及其物理体的x轴。我需要保持SKSpriteNode的dynamic和affectedByGravity状态。由于节点在斜坡上,所以它的x轴会因重力而移动。但是,我不希望这个SKSpriteNode的x轴因重力而移动。有没有一种方法可以锁定x轴以实现这一点?
谢谢任何帮助:D
编辑:我尝试将约束应用于x值,如下所示:
节点位于地面之上,而地面由各种具有基于体积的物理属性的SKSpriteNode线条组成。地面在前方不断添加新的线条,删除后方的线条,并将每个线条的x值更改为负数(这样地面似乎在移动-此过程在SKAction中执行)。这些线条(地面的部分)呈角度状,这就是为什么节点的x轴移动的原因。我希望节点始终位于地面的前端(例如,始终位于新创建的线条之上)。目前,像这样设置节点的位置会锁定x轴(解决了我的问题):
编辑:我尝试将约束应用于x值,如下所示:
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线条组成。地面在前方不断添加新的线条,删除后方的线条,并将每个线条的x值更改为负数(这样地面似乎在移动-此过程在SKAction中执行)。这些线条(地面的部分)呈角度状,这就是为什么节点的x轴移动的原因。我希望节点始终位于地面的前端(例如,始终位于新创建的线条之上)。目前,像这样设置节点的位置会锁定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类中
实际上,x轴保持不变就像这样。然而,问题在于节点的物理体现在比节点的中心低(这在之前是不会发生的)。
SCNPhysicsSliderJoint
,其中你可以欺骗第二个物体(没有质量、碰撞、接触等)。 - Confused