所以我有一个桨/棒,当那个棒子与一个球相撞时,它会收缩。我还想更新到SKPhysicsBody的paddle/bar,以便它保持与视觉精灵相同的碰撞盒。我怎样才能做到这一点?
这是我当前的代码,位于一个didBeginContact-冲突函数中。
bar.size = CGSizeMake(16 * playerLife, 16)
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))bar.size按预期工作。physicsBody rectangleOfSize使游戏崩溃。
更新:包含更多响应注释的代码
bar.size = CGSizeMake(16 * playerLife, 16)
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))
func CollisionWithDeathBar(ball: SKSpriteNode, deathBar: SKSpriteNode) {
playerLife--
bar.size = CGSizeMake(16 * playerLife, 16)
shouldResizePaddle = true
}
override func didSimulatePhysics() {
if shouldResizePaddle {
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))
shouldResizePaddle = false
}
}发布于 2015-12-22 22:13:01
不允许在物理接触回拨过程中修改物理体。
(想想看。在对物理模拟进行更新期间,SpriteKit必须检查世界上所有的物理实体,查找碰撞,并为它们调用联系人处理程序。如果你能在这一切中改变身体,你就会有未定义的,或者至少是定义不明确的结果。)
我建议使用接触函数来安排物理体的改变。就像这样:
var shouldResizePaddle = false
func didBeginContact(_ contact: SKPhysicsContact) {
if /* paddle/ball contact */ {
shouldResizePaddle = true
}
}
override func didSimulatePhysics() {
if shouldResizePaddle {
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))
shouldResizePaddle = false
}
}https://stackoverflow.com/questions/34425092
复制相似问题