SpriteKit场景中意想不到的物理体

我正在用SpriteKit实现一个质量弹簧系统(许多小型物理实体与SKPhysicsJointSpring实例结合在一起)。 一些粒子在穿过场景中心时会受到阻碍。

在场景中间似乎有一个小小的,静止的身体,我不知道为什么它在那里。

这是一个简单的方法来看看我在说什么:

  1. 在XCode 8中,用“游戏”模板创build一个全新的项目。
  2. GameViewController.viewDidLoad() ,添加view.showsPhysics = true

如果你运行这个项目,你应该在中间看到一个小点,这是一个错误的身体:

在这里输入图像说明

任何人都知道如何摆脱它?

编辑:我试图手动创build场景对象:

GameViewController.viewDidLoad() ,我replace了这个:

 // Load the SKScene from 'GameScene.sks' if let scene = SKScene(fileNamed: "GameScene") { view.presentScene(scene) } 

有了这个:

 let scene = GameScene(size: view.frame.size) scene.anchorPoint = CGPoint(x: 0.5, y: 0.5) view.presentScene(scene) 

但是这并没有解决它。

关于“ hello world ”的xCode游戏模板,似乎有一点与GameScene节点相关的physicsBody 。 用一些代码我发现这个:

 class GameScene: SKScene { private var label : SKLabelNode? private var spinnyNode : SKShapeNode? override func didMove(to view: SKView) { ... // End part of this function: if let b = physicsWorld.body(in: (label?.frame)!) { if let node = b.node { print("Type of this node: \(type(of:node))") print("Frame of this node: \(node.frame))") } print("Area covered by this node physicsBody: \(b.area)") } } } 

在这里输入图像说明

用最后一个大括号的断点,你可以看到两个body (也许是一个body数组),其中之一是左边的debugArea (索引为1的数组)的physicsBody ,它与我的body中的body b相同。 0x79794f90 ,一个面积为4.444的小矩形体

 Printing description of ((PKPhysicsBody *)0x79794f90): <SKPhysicsBody> type:<Rectangle> representedObject:[<SKScene> name:'(null)' frame:{{-375, -667}, {750, 1334}} anchor:{0.5, 0.5}] (lldb) 

在这里输入图像说明

无论如何,我决定作出回答,因为评论是不适合的,因为我想分享的信息很多。 另外我的回答,可悲的是,不回答这个问题,但它提供了一些关于这个不明身份,显然有能力的飞行(物理机构)对象的有用信息:)

所以这是代码如何抓住它(并修改它???):

  //you can use self.frame here...I just copied Alessandro's code self.physicsWorld.enumerateBodies(in:(label?.frame)!) { body, stop in if let node = body.node { print("Type of this node: \(type(of:node))") print("Frame of this node: \(node.frame))") }else{ print("This body's node property is nil") body.affectedByGravity = true body.isDynamic = true body.applyImpulse(CGVector(dx: 0.003, dy: 0.0003)) } print("Area covered by this node physicsBody: \(body.area)") } 

所以如果你在这个else语句里面放置一个断点,你可以完全扫描这个物理体,并获得所有关于它的信息,比如它的node属性设置为nil,或者isDynamic属性设置为false 。 但是你可以改变它,就像在我的代码中,例如将isDynamics设置为true。 这使得它是可移动的。 所以如果你施加一些力量,它会移动。

不过,就像我在评论中所说的,我不知道为什么它在那里,它代表什么或者它的目的是什么。

而且,对于那些想知道一个物理body.node如何可能没有一个与之关联的节点( body.node nil )但是在showsPhysics设置为true时仍然可以在屏幕上看到的true ,有一个合理的解释。 物理世界与节点树分离。 所以我们可以从一个节点树中移除一个精灵,但这并不意味着它的物理体将立即被移除。 可能发生物理引擎还没有完成模拟…所以你可能想知道这是怎么发生的?

假设你有三个SKSpriteNode对象同时相交(比如A同时接触B和A接触C)。 SpriteKit只能处理一个联系人。 并且说当你和B接触的时候你正在把A从A中删除。然后,A和C之间也有一个联系,所以didBegin:(_ contact)将被调用两次。 如果您在第一次didBegin(_ contact)调用中从父级移除A,则在下一个didBegin(_ contact)调用中, bodyA.node将为零( bodyA是sprite A的物理体),但其物理主体将保留直到发动机完成所需要的可见。 这是因为节点树和物理世界是分开的。