调整使用 SKPhysicsBody(circleOfRadius:) 创建的 SpriteKit SKPhysicsBody

Posted

技术标签:

【中文标题】调整使用 SKPhysicsBody(circleOfRadius:) 创建的 SpriteKit SKPhysicsBody【英文标题】:Resizing a SpriteKit SKPhysicsBody created with SKPhysicsBody(circleOfRadius:) 【发布时间】:2015-05-14 15:08:39 【问题描述】:

我正在构建一个 SpriteKit “连锁反应”游戏,其中圆圈随着“爆炸”而变大。我正在使用 SKPhysicsBody(circleOfRadius:) 初始化程序为圆圈创建物理体。

不幸的是,这些物理实体似乎没有随着圆圈变大而重新调整大小,而且它们没有我可以设置的暴露的.radius 属性。有没有办法在 SpriteKit 中调整物理体的大小,或者我是否需要每帧创建一个新的物理体? (这是我在下面所做的,代码运行良好,但是在更新循环中创建新的物理体感觉效率很低。)

PS - 我知道对于圆圈,我可以使用 trig 轻松进行准确的碰撞检测以获取距离,但我想使用 SpriteKit 碰撞检测来获得其他一些效果。

func moveCircles(dt:CGFloat)
   enumerateChildNodesWithName("circle")  node, stop in
     let c = node as! CircleSprite
     var halfWidth = c.size.width / 2.0
     c.update(dt) // in update() exploding circles get larger.
         if c.isExploding
        // FIXME: Have to make a new physics body every update - I don't like this!
            c.physicsBody = SKPhysicsBody(circleOfRadius: halfWidth)
            c.physicsBody?.categoryBitMask = CollisionCategories.ExplodingCircle
            c.physicsBody?.contactTestBitMask = CollisionCategories.Circle
            c.physicsBody?.collisionBitMask = 0
            c.physicsBody?.dynamic = true // the default
        
  

【问题讨论】:

【参考方案1】:

您可能想了解更多here。无法调整physicsBody 的大小,建议您创建一个新的physicsBody 并将其分配给节点。

【讨论】:

我就是这么想的——我只是想知道有没有办法解决这个问题。我在苹果官方文档的任何地方都找不到这个事实,除了这个:“物理体的特性很少是固定的。在物理体的区域之外,大多数属性都可以随时更改。”在本文档末尾找到:developer.apple.com/library/ios/documentation/GraphicsAnimation/… 多么愚蠢——你不能改变圆形对撞机的半径! @Fattie 实际上这是有道理的!调整物理体的大小将需要更改其许多属性(质量/密度/等),否则由于物理体的变化很容易获得非常奇怪的物理效果。 我真的不能同意,@Jean-BaptisteYunès!特别考虑二维物理,改变“点”的半径是完全正常的(很可能只是将质量再次设置为“1”) 没有质量与密度和面积等有关。这不是那么简单,因此强制重建适当的物理体就足够了。

以上是关于调整使用 SKPhysicsBody(circleOfRadius:) 创建的 SpriteKit SKPhysicsBody的主要内容,如果未能解决你的问题,请参考以下文章

Circle UIView调整大小,动画保持圆形

小册子绘制时无法调整半径

如何使用 SKPhysicsBody 复制 SKSpriteNode?

iOS -- SpriteKit框架之SKPhysicsBody的移动和连接

使用“bodyWithTexture”(SpriteKit)时更改 SKPhysicsBody 的中心点

SpriteKit 的 SKPhysicsBody 与多边形辅助工具