我正在玩一些新的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也不会产生任何结果。
在有人问之前,是的,我正在将两个节点添加到场景中,我只是没有包含这些行。
谁能看到我出错的地方?
答案 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
文件并在场景上拖动精灵,它确实很有效。