我正在使用 SpriteKit 实现一个质量弹簧系统(许多小型物理体与 SKPhysicsJointSpring 实例连接在一起)。一些粒子在穿过场景中心时会被卡住。
场景中央似乎有一个静止的小物体,我不知道它为什么在那里。
这是一个简单的方法来了解我在说什么:
- 在 XCode 8 中,使用“Game”模板创建一个全新的项目。
- In
GameViewController.viewDidLoad()
, add view.showsPhysics = true
如果运行该项目,您应该在中间看到一个小点,这是错误的主体:
有人知道如何摆脱它吗?
Edit:我尝试手动创建场景对象:
In GameViewController.viewDidLoad()
,我替换了这个:
// 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)
但这并没有解决问题。
无论如何,我决定做出回答,因为我想分享很多信息,所以评论不合适。遗憾的是,我的回答并没有回答这个问题,但它提供了一些关于这个身份不明、显然能够飞行(物理身体)物体的有用信息:)
所以这是如何获取它的代码(并修改它???):
//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 语句中放置一个断点,您可以完全扫描这个物理体并获取有关它的所有信息,就像它的节点属性设置为 nil或者说它的isDynamic
属性设置为false
。但你可以改变它,就像在我的代码中一样,设置例如isDynamics
为真。这使得它可以移动。因此,如果你对其施加一些力,它就会移动。
尽管如此,就像我在评论中所说的那样,我不知道它为什么在那里,它代表什么或者它的目的是什么。
另外,对于那些想知道一个物理体怎么可能没有与之关联的节点的人(body.node
equals nil
)但在屏幕上仍然可见showsPhysics
被设定为true
,有一个合理的解释。物理世界与节点树分离。所以我们可以从节点树中删除一个精灵,但这并不意味着它的物理体会立即被删除。物理引擎可能还没有完成模拟……所以你可能想知道,这是怎么发生的?
假设你有三个SKSpriteNode
对象同时相交(例如 A 接触 B 并且 A 同时接触 C)。SpriteKit
一次只能处理一个联系人。假设当 A 与 B 接触时,您将 A 从父对象中移除。那么,A 和 C 之间也存在接触,所以didBegin:(_ contact)
将被调用两次。如果你首先从它的父级中删除 AdidBegin(_ contact)
打电话,在下一个didBegin(_ contact)
call, bodyA.node
将为零(bodyA
是精灵 A 的物理体,但其物理体将保持可见,直到引擎完成所需的操作。这是因为节点树和物理世界是分开的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)