首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新SKPhysicsBody rectangleOfSize

更新SKPhysicsBody rectangleOfSize
EN

Stack Overflow用户
提问于 2015-12-22 21:56:42
回答 1查看 252关注 0票数 1

所以我有一个桨/棒,当那个棒子与一个球相撞时,它会收缩。我还想更新到SKPhysicsBody的paddle/bar,以便它保持与视觉精灵相同的碰撞盒。我怎样才能做到这一点?

这是我当前的代码,位于一个didBeginContact-冲突函数中。

代码语言:javascript
复制
bar.size = CGSizeMake(16 * playerLife, 16)
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))

bar.size按预期工作。physicsBody rectangleOfSize使游戏崩溃。

更新:包含更多响应注释的代码

代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-22 22:13:01

不允许在物理接触回拨过程中修改物理体。

(想想看。在对物理模拟进行更新期间,SpriteKit必须检查世界上所有的物理实体,查找碰撞,并为它们调用联系人处理程序。如果你能在这一切中改变身体,你就会有未定义的,或者至少是定义不明确的结果。)

我建议使用接触函数来安排物理体的改变。就像这样:

代码语言:javascript
复制
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
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34425092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档