【问题标题】:SKPhysicsBody Change Center of MassSKPhysicsBody Change Center of Mass
【发布时间】:2015-07-27 22:36:33
【问题描述】:

我目前正在开发一款游戏,其中我有一张圆柱形物体的图片,并使用以下内容制作了一个 SKPhysicsBody:

self.oval.node.physicsBody = SKPhysicsBody(texture: self.oval.node.texture, size: self.oval.node.size)

这种方法在节点周围创建了一个漂亮的形状,但是,重心偏离了……它在椭圆的尖端保持平衡。有没有办法改变它,所以它平衡了理论上最重的部分应该在哪里?谢谢!

【问题讨论】:

  • 如果您在视图控制器中设置skView.showsPhysics = true,您将看到场景中物理实体的轮廓。它对于调试物理体问题很有用。另外,您是否更改了精灵的锚点?
  • @0x141E 身体的形状不是问题。身体完美地包围了我正在使用的图片;然而,当图片降落在地面上时,它会在其一侧而不是大部分质量应该在的位置保持平衡。

标签: ios swift sprite-kit game-physics skphysicsbody


【解决方案1】:

质心不可能偏离,它是精确的。问题是您希望您的物理体具有不均匀的密度。刚性物理体的密度始终是均匀的。除了修改物理体本身(即更改物理体的大小/形状)之外,我没有看到这样做的方法。

即使您尝试使用 SKPhysicsBody(bodies: [body1,body2]) 从多个物理体的联合创建一个物理体,密度仍然是均匀的,因为 Sprite Kit 仍然会将其模拟为一个体。

我能想到的唯一解决方案是使用如下所示的关节将 2 个波德融合在一起。

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        let node1 = SKShapeNode(circleOfRadius: 20)
        node1.physicsBody = SKPhysicsBody(circleOfRadius: 20)
        node1.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0)

        let node2 = SKShapeNode(circleOfRadius: 2)
        node2.physicsBody = SKPhysicsBody(circleOfRadius: 1)
        node2.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0+19)
        node2.physicsBody!.mass = node1.physicsBody!.mass * 0.2 //Set body2 mass as a ratio of body1 mass.

        self.addChild(node1)
        self.addChild(node2)

        let joint = SKPhysicsJointFixed.jointWithBodyA(node1.physicsBody!, bodyB: node2.physicsBody!, anchor: node1.position)

        self.physicsWorld.addJoint(joint)

        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        node1.physicsBody!.applyImpulse(CGVector(dx: -10, dy: 0))
    }
}

但是,这并不能解决圆完全居中的特殊情况。你看我应用了一个冲动来临时解决上面代码中的问题。更好的解决方案是在更新方法中检查这种特殊情况。


请注意,gif 在底部被剪掉了一点。

【讨论】:

  • 我将尝试添加一个关节体。感谢您的想法!
猜你喜欢
  • 2022-12-27
  • 1970-01-01
  • 2022-12-27
  • 2022-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多