SpriteKit场景中意想不到的物理体
我正在用SpriteKit实现一个质量弹簧系统(许多小型物理实体与SKPhysicsJointSpring实例结合在一起)。 一些粒子在穿过场景中心时会受到阻碍。
在场景中间似乎有一个小小的,静止的身体,我不知道为什么它在那里。
这是一个简单的方法来看看我在说什么:
- 在XCode 8中,用“游戏”模板创build一个全新的项目。
- 在
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的物理体),但其物理主体将保留直到发动机完成所需要的可见。 这是因为节点树和物理世界是分开的。