【问题标题】:SpriteKit physics bodies not colliding when connected with jointsSpriteKit 物理体在与关节连接时不会发生碰撞
【发布时间】:2016-03-26 05:53:24
【问题描述】:

我正在评估 iOS SpriteKit 物理引擎,为了测试,我使用 Xcode 创建了一个包含两个圆形节点的简单场景:

两个节点都有圆形的物理体和 5 公斤的质量。 我用SKPhysicsJointSpring 连接两个节点。这是整个设置(viewDidLoad()):

let path = NSBundle.mainBundle().pathForResource("MyScene", ofType: "sks")!
let scene = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as! SKScene

let border = SKPhysicsBody(edgeLoopFromRect: scene.frame)
border.restitution = 0;
border.friction = 0;
scene.physicsBody = border

let player = scene.childNodeWithName("player")! // large ball
let tail1 = scene.childNodeWithName("tail1")! // smaller ball

player.physicsBody!.usesPreciseCollisionDetection = true
tail1.physicsBody!.usesPreciseCollisionDetection = true

let spring1 = SKPhysicsJointSpring.jointWithBodyA(player.physicsBody!, bodyB: tail1.physicsBody!, anchorA: player.position, anchorB: tail1.position)
spring1.damping = 1
spring1.frequency = 3
scene.physicsWorld.addJoint(spring1)

spriteKitView.presentScene(scene)

注意:在场景编辑器中重力设置为 (0,0)。

当我移动较大的节点时(例如,通过使用 touchesBegan() 捕获触摸并将节点的位置设置为触摸位置),另一个根据弹簧参数跟随。

但是,如果我移动节点的速度足够快,以至于弹簧力变得极端,那么当弹簧收缩时,两个节点都会重叠。我希望它们相互碰撞,因为它们的collisionBitMask 默认设置为-1(所有位设置)。我启用了usesPreciseCollisionDetection,但效果仍然可见。

当我在场景周围添加一个边缘循环时,它们确实会按预期与该边缘发生碰撞。与具有物理主体(但未连接关节)的其他节点相同。

我的印象是弹簧的存在以某种方式使引擎忽略了与关节连接的节点之间的碰撞。 其他人也观察到这一点吗? 我忘了什么吗?还是按预期工作?

【问题讨论】:

    标签: ios collision skphysicsbody skscene


    【解决方案1】:

    试图回答我自己的问题。

    我发现其他关节(例如SKPhysicsJointLimit)也禁用了连接节点之间的碰撞。我唯一的结论是,所有 SpriteKit 关节都以某种方式将两个对象视为一个对象,而碰撞被认为是不可取的。虽然在我的应用程序中我更愿意启用碰撞。也许我应该在 Apple 开发者反馈中提交增强功能。

    到目前为止,我的解决方法包括:

    1. 通过将SKFieldNode.springFieldSKFieldNode.dragField 作为子节点添加到精灵节点来创建弹簧行为。 Pro:作为孩子,这些字段会自动跟随其父位置;缺点:这会花费 2 个宝贵的 fieldBitMask 比特,这自然会限制此类节点的数量。
    2. 在每一帧手动应用一些弹簧 + 阻力。优点:不会浪费 fieldBitMask 的点数,缺点:手动计算弹簧力 + 阻力。

    所以我倾向于选择 2。

    总结一下:如果您希望在保持碰撞的同时在 2 个节点之间进行弹簧行为,请手动实施力并且不要使用关节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多