1

我正在使用 SpriteKit 为项目创建一个有趣的 Hotspot UI。应该很简单!只是一个背景图像,上面有很多点。当您点击一个点时,它会放大。当您再次点击时,它会恢复到正常大小和位置。但是,更重要的是,每个点都有物理特性,所以当它放大时,其他点会暂时移到一边。当点恢复到正常比例时,它们会弹回原位。

为了实现这一点,我在页面上放置了一堆 SKShapeNodes。我还在创建一个附加到场景physicsBody 和SKShapeNode 的SKPhysicsJointSpring。

这是场景的代码:

override func didMoveToView(view: SKView) {

    name = "Hotspot test"
    physicsWorld.gravity = CGVectorMake(0, 0)

    let physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    self.physicsBody = physicsBody


    for i in 1...10 {

        let j:__uint32_t = 0x1 << UInt32(i) // <- IGNORE THIS. IRRELEVANT
        let shape = DotNode(circleOfRadius: 60, name: "Ball"+String(i), id: i, bitmask: j)

        // Position objects in a circle around the center
        let degrees = (360/10)*i
        let radians = degrees.degreesToRadians
        let radius = CGFloat(300)
        let cosR = cos(radians)
        let sinR = sin(radians)
        let xPos = radius*cosR+frame.size.width/2
        let yPos = radius*sinR+frame.size.height/2

        let pos = CGPoint(x: xPos, y: yPos)
        shape.position = pos

        addChild(shape)

        let spring = SKPhysicsJointSpring.jointWithBodyA(self.physicsBody!, bodyB: shape.physicsBody!, anchorA: pos, anchorB: pos)
        spring.damping = 0.01
        physicsWorld.addJoint(spring)
    }

DotNode 是 SKShapeNode 子类。这是它在屏幕上的样子:

节点静态

这就是他们扩大规模时的样子:

在此处输入图像描述

看到问题了吗?他们现在不互相交流了。当我拖动其中一个时,我可以看到弹簧接头已连接:

在此处输入图像描述

对象不再相互交互有什么原因吗?

如果您只是移除关节,就会发生这种情况:

在此处输入图像描述

物体相互推动。这必须是可以实现的。我究竟做错了什么?

4

1 回答 1

1

可悲的是,SpriteKit 似乎无法做到这一点。这篇文章:SKPhysicsJoint:Contacts and collisions not working证实了这一点。

我不得不说,这似乎很疯狂。为什么你不想创建关节和弹簧,然后让你连接的节点在物理世界中发生碰撞和反应?

看来我将不得不失去弹簧,只需对节点进行编码以不断漂移回其原始位置。这样,当他们中的一个人扩大并将其他人推开时,他们总是会尝试回家。

于 2016-04-28T09:47:02.757 回答