Ios7 SpriteKit:如何模拟磁力

Ios7 SpriteKit:如何模拟磁力,ios7,sprite-kit,game-physics,Ios7,Sprite Kit,Game Physics,我正在开发一款使用iOS SpriteKit的游戏。我试图在这个游戏中制造一个物体,将物体拉向它,当物体靠近它时,力会变得更大,想象一下磁铁或黑洞。我一直很难弄清楚要更改哪些属性才能使此节点物理实体吸引其他节点通过。在iOS 8和OS X 10.10中,SpriteKit用于创建应用于某个区域中实体的力。这对于浮力、面积比重和“磁铁”等方面都很有用 不过要注意,你从那门课上得到的可能不是你想要的那种“磁铁”游戏。磁场的行为符合。。。也就是说,它使移动的带电物体偏转。我们通常认为的磁铁——粘在冰箱

我正在开发一款使用iOS SpriteKit的游戏。我试图在这个游戏中制造一个物体,将物体拉向它,当物体靠近它时,力会变得更大,想象一下磁铁或黑洞。我一直很难弄清楚要更改哪些属性才能使此节点物理实体吸引其他节点通过。

在iOS 8和OS X 10.10中,SpriteKit用于创建应用于某个区域中实体的力。这对于浮力、面积比重和“磁铁”等方面都很有用

不过要注意,你从那门课上得到的可能不是你想要的那种“磁铁”游戏。磁场的行为符合。。。也就是说,它使移动的带电物体偏转。我们通常认为的磁铁——粘在冰箱上、捡起废弃汽车或让气垫板飞起来的磁铁——就是这种力量

如果你想要一个吸引附近任何东西(或某些特定物体)的场,你真正想要的就是一个
径向引力场。(为了只吸引特定的东西,请在字段上使用
categoryBitMask
,在应该/不应该与其交互的主体上使用
fieldBitMask
。)

如果您想要一个或多或少能吸引不同事物的磁场,或者吸引一些事物而排斥另一些事物,那么
电场
是一个不错的选择。您可以使用物理体的
电荷
属性使它们受到吸引或排斥(负值或正值),或或多或少受到场的强烈影响(绝对值更大或更小)


在iOS 8和OS X 10.10之前,SpriteKit的物理模拟不包括这种力


不过,这并不能阻止你自己模拟它。在场景的
更新:
方法中,可以找到物体之间的距离,计算与该距离成比例的力(以及模拟的磁场强度),然后对每个物体施加力

是的,您可以在精灵套件中创建磁力

-(void)模拟物理
{
[自我更新密码];
}
-(void)updateCoin
{
[使用block:^(SKNode*node,BOOL*stop)的名称为@“coin”的自枚举子节点{
点位;
位置=节点位置;
//将硬币从右向左移动
位置x-=10;
node.position=位置;
//在英雄和硬币之间施加磁力
[自我应用磁力:硬币];

如果(node.position.x自从苹果在iOS 8中推出以来,现在你似乎可以了。

你可以使用下面的代码片段来完成你想要的任务,但是它没有吸引和排斥属性

机构代码:

let node = SKSpriteNode(imageNamed: "vortex")
                            node.name = "vortex"
                            node.position = position
                            node.run(SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat.pi, duration: 1)))
                            node.physicsBody = SKPhysicsBody(circleOfRadius: node.size.width / 2)
                            node.physicsBody?.isDynamic = false

                            node.physicsBody?.categoryBitMask = CollisionTypes.vortex.rawValue
                            node.physicsBody?.contactTestBitMask = CollisionTypes.player.rawValue
                            node.physicsBody?.collisionBitMask = 0
                            addChild(node)
当和那个黑洞体接触时:

func playerCollided(with node: SKNode) {
        if node.name == "vortex" {
            player.physicsBody?.isDynamic = false
            isGameOver = true
            score -= 1

            let move = SKAction.move(to: node.position, duration: 0.25)
            let scale = SKAction.scale(to: 0.0001, duration: 0.25)
            let remove = SKAction.removeFromParent()
            let sequence = SKAction.sequence([move, scale, remove])

            player.run(sequence) { [unowned self] in
                self.createPlayer()
                self.isGameOver = false
            }
        }

不能使用简单的属性。您必须计算对象与吸引子之间的距离,并根据对象与吸引子之间的距离和吸引子的假定权重,向吸引子方向的对象应用脉冲。如果需要全尺寸重力模拟(每个对象也是吸引子)这可能会非常昂贵,因为计算的数量会随着对象的数量呈指数增长。谢谢,这很有意义。有没有这样的例子?太好了,谢谢你的帮助,这应该能让我解决这个问题!