SpriteKit:如何模拟磁力

时间:2014-02-23 17:07:54

标签: ios7 sprite-kit game-physics

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

4 个答案:

答案 0 :(得分:18)

在iOS 8和OS X 10.10中,SpriteKit具有SKFieldNode,用于创建适用于区域中的实体的力。这对于浮力,面积比重和“磁铁”等很有用。

但请注意 - 你从该课程中获得的magneticField可能不是你想要的那种你想要的“磁铁”游戏。磁场表现为real-world physics at the micro level ...即,它偏转移动的带电体。我们通常认为的是磁铁 - 那种粘在你的冰箱上,拿起垃圾汽车,或者做一个悬浮飞行的飞机 - 是a higher-level effect的力量。

如果你想要一个只吸引附近任何东西(或某些特定东西)的领域,radialGravityField就是你真正追求的。 (要仅吸引特定内容,请使用字段上的categoryBitMask和应该/不应与之交互的主体上的fieldBitMask。)

如果你想要一个或多或少地吸引不同东西的领域,或吸引一些东西并排斥其他东西,electricField是一个不错的选择。您可以使用物理实体的charge属性使其被吸引或排斥(负值或正值)或受到或多或少强烈影响(绝对值大于或小于绝对值)。


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

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

答案 1 :(得分:2)

是的,你可以在精灵套件中创造磁力

-(void)didSimulatePhysics
{
  [self updateCoin];
}

-(void) updateCoin
{
    [self enumerateChildNodesWithName:@"coin" usingBlock:^(SKNode *node, BOOL *stop) {
        CGPoint position;
        position=node.position;
        //move coin right to left
        position.x -= 10;
        node.position = position;
        //apply the magnetic force between hero and coin
        [self applyMagnetForce:coin];
        if (node.position.x <- 100)
            [node removeFromParent];

    }];
}

-(void)applyMagnetForce:(sprite*)node
{
    if( gameViewController.globalStoreClass.magnetStatus)
    {
        //if hero under area of magnetic force
        if(node.position.x<400)
        {
            node.physicsBody.allowsRotation=FALSE;
            ///just for fun
            node.physicsBody.linearDamping=10;
            node.physicsBody.angularVelocity=10*10;
            //where _gameHero is magnet fulling object
            [node.physicsBody applyForce:CGVectorMake((10*10)*(_gameHero.position.x-      node.position.x),(10*10)*(_gameHero.position.y-node.position.y)) atPoint:CGPointMake(_gameHero.position.x,_gameHero.position.y)];

        }
    }
}
记住英雄和硬币身体都需要动态

答案 2 :(得分:1)

好像现在你可以,因为Apple在iOS 8中引入了SKFieldNode

答案 3 :(得分:0)

好吧,您可以使用以下代码段来完成所需的操作,但是它没有long fibonacci(int fibonacci) { if (fibonacci < 0) { throw new IllegalArgumentException("n value cannot be negative number"); } if (fibonacci == 0 || fibonacci == 1) { return 1; } int beforeLast = 1; int last = 1; int i; int fib = 1; for (i = 2; i <= fibonacci; i++) { fib = last + beforeLast; beforeLast = last; last = fib; } return fib; } attraction属性

身体代码:

repulsion

与那个黑洞物体接触时:

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)