添加关于SpriteNode

时间:2016-06-22 00:31:45

标签: swift sprite-kit

我有一个角色的游戏,当他跳过平台时会受到正常重力的影响。他收集硬币和电源。我正在加强使硬币吸引到characterSpriteNode。

如果magneticPowerUp = true我希望它出现引力场已激活关于仅使 <+ em>的角色吸引到角色,就像磁场一样。

我一直在跟Epic Bytes SO回答here,但我没有太多运气,因为我对矢量没有太多经验而且没有太深入physicsBody

所以当我确定硬币足够接近以移动到焦炭时,我就无法解决使硬币移动的部分。

我的想法是这样的:

override func update(currentTime: NSTimeInterval) {

        if magneticPowerUp {

            for coin in scoreNode.children {

                let disp = CGVector(dx: coin.position.x-character.position.x, dy: coin.position.y-character.position.y)
                let radius = sqrt(disp.dx*disp.dx+disp.dy*disp.dy) // Distance between character and coin

                if radius < character.frame.height * 3 {

                     // Use physics methods here to push the coin to the character
                    let dt: CGFloat = 1.0/60.0
                    let strength: CGFloat = 10000

                    let m1 = character.physicsBody!.mass*strength
                    let m2 = coin.physicsBody!.mass*strength

                    let force = (m1*m2)/(radius*radius);
                    let normal = CGVector(dx: disp.dx/radius, dy: disp.dy/radius)
                    let impulse = CGVector(dx: normal.dx*force*dt, dy: normal.dy*force*dt)

                    // Something wrong with this?
                    coin.physicsBody!.velocity = CGVector(dx: coin.physicsBody!.velocity.dx + impulse.dx, dy: coin.physicsBody!.velocity.dy + impulse.dy)



                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

SpriteKit具有 SKFieldNode ,用于创建适用于身体的重力和磁铁。通常它偏转带电体,而不是像现实世界中的铁磁性那样吸引它们。

如果你想要一个吸引东西的领域,那么你的英雄需要IID_IDropTarget方法。要吸引像硬币这样的特定事物,你可以在英雄字段上使用radialGravityField(),在你想要吸引的硬币精灵上使用categoryBitMask

使用fieldBitMask方法,你也可以让你的英雄用更强或更弱的力量吸引不同的身体。甚至可以同时吸引和击退不同的身体。您可以使用物理实体的electricField()属性。

代码示例:

charge

SKFieldNode 的Apple文档非常棒。 https://developer.apple.com/reference/spritekit/skfieldnode

这是两个很酷的YT视频,显示效果。

https://www.youtube.com/watch?v=-mjRPgP0oAE

https://www.youtube.com/watch?v=JGk3agy-c50