SpriteKit磁场/电场没有产生任何结果

时间:2014-08-25 13:57:43

标签: ios iphone sprite-kit ios8

我正在玩一些新的SpriteKit工具,我遇到了令人沮丧的问题。

如您所知,iOS 8引入了SKFieldNode类,使用户可以创建影响其他SKNode的自定义“强制字段”。我使用springField和radialGravityField获得了很好的结果,但是我还没有弄清楚如何使用magneticField和electricField类型。

让我解释一下。

以下代码对我希望受SKFieldNode影响的节点4(SKSpriteNode)完全没有影响。

SKSpriteNode *node4 = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:@"Red"] size:CGSizeMake(25.0, 25.0)];
node4.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:12.5];
node4.position = CGPointMake(300.0, 250.0);
node4.physicsBody.dynamic = YES;
node4.physicsBody.charge = 30;
node4.physicsBody.linearDamping = 3;
node4.physicsBody.affectedByGravity = NO;
node4.physicsBody.collisionBitMask = 0;
node4.physicsBody.mass = 1;


SKFieldNode *centerNode = [SKFieldNode magneticField];
centerNode.position = CGPointMake(150.0, 200.0);
centerNode.strength = 100000000000;
centerNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
centerNode.physicsBody.charge = -30;
centerNode.physicsBody.dynamic = NO;
centerNode.falloff = 0;

节点在屏幕上绘制,但保持完全静态。如您所见,即使衰减为0且强度为10000000000,也会发生这种情况。

更改行:

SKFieldNode *centerNode = [SKFieldNode magneticField];

分为:

SKFieldNode *centerNode = [SKFieldNode springField];

使centerNode充当springField,并将node4发送到整个地方。

使用electricField而不是magnetField也不会产生任何结果。

在有人问之前,是的,我正在将两个节点添加到场景中,我只是没有包含这些行。

谁能看到我出错的地方?

2 个答案:

答案 0 :(得分:1)

这里没有足够的代码让我完全测试它,但我预先看到两个可能的问题:

如果node4没有开始移动,则磁场对其没有影响。 SpriteKit的磁场模拟了洛伦兹力方程(F = qv ⨯ B)的后半部分,其中粒子上的力与其电荷和速度有关。

您将node4的线性阻尼设置为大于最大值。 linearDamping属性的值介于0和1之间,其中1.0完全阻止了一个正文的运动。大于1的值可能会被限制在1.0,所以即使被巨大的力量击中,你的身体也不应该移动。

可能不相关:除非您希望该节点受其他电/磁场影响,否则您不需要向字段节点添加带电物理主体。

答案 1 :(得分:-1)

只有在通过编写代码创建节点时才会遇到同样的问题。如果你使用SpriteKit编辑器,它运作良好!

您可以添加新的sks文件,然后通过以下代码将其归档到SKScene:

extension SKScene {
class func unarchiveFromFile(file : NSString) -> SKNode? {
    if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
        var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
        var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKScene
        scene.size = GameKitHelper.sharedGameKitHelper().getRootViewController().view.frame.size
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
}
}

打开sks文件并在场景上拖动精灵,它确实很有效。