SpriteKit 磁场/电场不产生结果
Posted
技术标签:
【中文标题】SpriteKit 磁场/电场不产生结果【英文标题】:SpriteKit Magnetic/Electric fields producing no results 【发布时间】:2014-08-25 13:57:43 【问题描述】:我正在使用一些新的 SpriteKit 工具,但遇到了一个令人沮丧的问题。
如您所知,ios 8 引入了 SKFieldNode 类,它使用户能够创建影响其他 SKNode 的自定义“力场”。我使用 springField 和radialGravityFields 得到了很好的结果,但是我还没有弄清楚如何使用磁场和电场类型。
让我解释一下。
以下代码对 node4 绝对没有影响,我希望受 SKFieldNode 影响的 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发送到各处。
使用电场而不是磁场也不会产生任何结果。
在有人问之前,是的,我正在将两个节点都添加到场景中,只是没有包括这些行。
谁能看出我哪里出错了?
【问题讨论】:
【参考方案1】:这里没有足够的代码让我对其进行全面测试,但我看到了两个可能的问题:
如果node4
一开始没有移动,则磁场对其没有影响。 SpriteKit 的磁场模拟洛伦兹力方程的后半部分 (F = qv ⨯ B
),其中粒子上的力与其电荷和速度有关。
您将node4
的线性阻尼设置为大于最大值。 linearDamping
属性取一个介于 0 和 1 之间的值,其中 1.0 完全阻止身体的运动。大于 1 的值可能会被限制为 1.0,因此即使受到巨大的打击,您的身体也不应该移动。
可能不相关:您不需要向场节点添加带电物理体,除非您希望该节点受到其他电场/磁场的影响。
【讨论】:
【参考方案2】:只有当我通过编写代码创建节点时,我才会遇到同样的问题。如果您使用 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
文件并在场景中拖动精灵,效果真的很好。
【讨论】:
我想我真的提供了答案:使用 SpriteKit 编辑器而不是编写代码。(使用 sks 文件)请仔细阅读我的答案。nodeWithFileNamed
是从 .sks 文件加载节点树的更简单方法。以上是关于SpriteKit 磁场/电场不产生结果的主要内容,如果未能解决你的问题,请参考以下文章