SKPhysicsJointFixed 在移动一个节点时不会将节点保持在一起
SKPhysicsJointFixed doesn't keep nodes together while moving one
我创建了 2 个 SKSpriteNode,并通过 SKPhysicsJointFixed 将它们连接起来,使它们粘在一起。问题是当我对第一个应用 SKAction.move(by:, duration:)
时,它会单独移动。为什么会这样,我怎样才能将它们移动到一起?我搜索了很多,但似乎找不到任何新的或有用的信息。请帮忙。提前致谢。
代码如下:
import SpriteKit
class myGame: SKScene {
var node1: SKSpriteNode!
var node2: SKSpriteNode!
func createNode(_ position: CGPoint, color: UIColor) -> SKSpriteNode {
let node = SKSpriteNode(color: color, size: CGSize(width: 50, height: 50))
node.position = position
node.physicsBody = SKPhysicsBody(rectangleOf: node.size, center: position)
node.physicsBody?.affectedByGravity = false
node.physicsBody?.allowsRotation = false
return node
}
func setup() {
node1 = createNode(.zero, color: .red)
node2 = createNode(CGPoint(x: 0, y: -50), color: .green)
self.addChild(node1)
self.addChild(node2)
let anchor = CGPoint(x: node1.size.width/2, y: -node1.size.height/2)
let joint = SKPhysicsJointFixed.joint(withBodyA: node1.physicsBody!, bodyB: node2.physicsBody!, anchor: anchor)
physicsWorld.add(joint)
}
override func didMove(to view: SKView) {
setup()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
node1.run(SKAction.move(by: CGVector(dx: 0, dy: 100), duration: 2))
}
}
这确实很奇怪,但我以前遇到过类似的事情。
造成问题的是 physicsBody 上的 AllowRotation。
修复:
node.physicsBody?.allowsRotation = true
注意:
你的第二个节点的物理体有点偏离。我建议你这样做:
node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
并且你的关节目前在节点的右上角,修复:
let anchor = CGPoint(x: 0, y: -node1.size.height/2)
除非你希望它像 ofc 那样:)
最后一个提示,如果您还不知道的话。在你的 gameViewController 中设置 showPhysics 来查看你的物理体的轮廓。它在处理物理时确实有很大帮助。
view.showsPhysics = true
我创建了 2 个 SKSpriteNode,并通过 SKPhysicsJointFixed 将它们连接起来,使它们粘在一起。问题是当我对第一个应用 SKAction.move(by:, duration:)
时,它会单独移动。为什么会这样,我怎样才能将它们移动到一起?我搜索了很多,但似乎找不到任何新的或有用的信息。请帮忙。提前致谢。
代码如下:
import SpriteKit
class myGame: SKScene {
var node1: SKSpriteNode!
var node2: SKSpriteNode!
func createNode(_ position: CGPoint, color: UIColor) -> SKSpriteNode {
let node = SKSpriteNode(color: color, size: CGSize(width: 50, height: 50))
node.position = position
node.physicsBody = SKPhysicsBody(rectangleOf: node.size, center: position)
node.physicsBody?.affectedByGravity = false
node.physicsBody?.allowsRotation = false
return node
}
func setup() {
node1 = createNode(.zero, color: .red)
node2 = createNode(CGPoint(x: 0, y: -50), color: .green)
self.addChild(node1)
self.addChild(node2)
let anchor = CGPoint(x: node1.size.width/2, y: -node1.size.height/2)
let joint = SKPhysicsJointFixed.joint(withBodyA: node1.physicsBody!, bodyB: node2.physicsBody!, anchor: anchor)
physicsWorld.add(joint)
}
override func didMove(to view: SKView) {
setup()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
node1.run(SKAction.move(by: CGVector(dx: 0, dy: 100), duration: 2))
}
}
这确实很奇怪,但我以前遇到过类似的事情。 造成问题的是 physicsBody 上的 AllowRotation。
修复:
node.physicsBody?.allowsRotation = true
注意: 你的第二个节点的物理体有点偏离。我建议你这样做:
node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
并且你的关节目前在节点的右上角,修复:
let anchor = CGPoint(x: 0, y: -node1.size.height/2)
除非你希望它像 ofc 那样:)
最后一个提示,如果您还不知道的话。在你的 gameViewController 中设置 showPhysics 来查看你的物理体的轮廓。它在处理物理时确实有很大帮助。
view.showsPhysics = true