【问题标题】:SKPhysicsJointFixed doesn't keep nodes together while moving oneSKPhysicsJointFixed 在移动节点时不会将节点保持在一起
【发布时间】:2017-07-18 18:06:11
【问题描述】:

我创建了 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))
}


}

【问题讨论】:

  • 尝试通过物理(力或脉冲)移动它们,看看会发生什么......
  • 我认为这可能是因为您使用 SKAction 直接移动节点,而不是使用物理(即向物理体施加脉冲或力)。尝试将动作改为冲动。
  • 很确定以上两个是正确的。
  • @Fluidity 不,我使用了冲动和力量,但仍然得到了相同的结果

标签: swift sprite-kit skphysicsjoint


【解决方案1】:

这确实很奇怪,但我以前也遇到过类似的事情。 造成问题的是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

【讨论】:

  • 一切都是关于.allowsRotation。非常感谢!
  • 如果你真的需要allowRotation = false。你可以使用距离约束。或者只是将第二个节点的位置更新为始终在第一个节点旁边。 developer.apple.com/documentation/spritekit/skconstraint
  • 但真正的问题是节点不应该在我的应用程序中旋转:/
  • 那我建议使用距离约束
  • let con = SKConstraint.distance(SKRange(lowerLimit: 50, upperLimit: 50), to: node1) node2.constraints = [ con ] 你可以把关节完全去掉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多