【问题标题】:SpriteKit Magnetic/Electric fields producing no resultsSpriteKit 磁场/电场不产生结果
【发布时间】: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发送到各处。

使用电场而不是磁场也不会产生任何结果。

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

谁能看出我哪里出错了?

【问题讨论】:

    标签: ios iphone sprite-kit ios8


    【解决方案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 文件加载节点树的更简单方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2017-05-12
      • 2018-08-26
      • 2015-01-25
      相关资源
      最近更新 更多