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 磁场/电场不产生结果的主要内容,如果未能解决你的问题,请参考以下文章

高中物理 磁场 帮忙画一下叠加的图哈 谢谢

搞清楚电场Ex,Ey,Ez,normE(电场模)场分布的影响,看懂了这些不需要看磁场就能明白基本上所有的场分布知识

关于电磁场中的E.B.D.H的理解

ANSYS APDL谐性电磁场仿真问题?

平面波的传播

电子基础篇3---电感篇