SpriteKit:使用 SKTextureAtlas 会导致不正确的物理体

SpriteKit: Using SKTextureAtlas causes incorrect Physics Body

我正在构建我的第一个 sprite kit 游戏,最近阅读了一篇文章说使用 SKTextureAtlas 来提高性能。

所以我将所有精灵图像迁移到有组织的 .atlas 文件夹中并相应地更新了代码。 但是,现在我的精灵有奇怪的物理体(主要是过度放大)

例如,我的玩家精灵有三种状态:飞行(平放)、向上飞和向下飞。这三幅图像非常相似,略有不同 (手臂指向水平、向上、向下)

在迁移到纹理图集之前,物理体在图像上非常准确。然而现在,它比图像大得多,并且在 y 轴上稍微拉伸。

这是我的 player.atlas 文件结构:

玩家-飞行-iphone.atlas:

这是我的代码示例: (Player是SKSpriteNode的子类)

let textureAtlas = SKTextureAtlas(named: "player-iphone")
let playerFlyingTexture = textureAtlas.textureNamed("player-flying")
let player = Player(texture: playerFlyingTexture, color: UIColor.clearColor(), size: CGSizeMake(100.0, 100.0))

let physicsBody = SKPhysicsBody(texture: playerFlyingTexture, size: CGSizeMake(100.0, 100.0))
physicsBody.dynamic = true
physicsBody.affectedByGravity = true
physicsBody.usesPreciseCollisionDetection = false
physicsBody.categoryBitMask = CollisionCategories.Player
physicsBody.contactTestBitMask = CollisionCategories.Enemy
physicsBody.collisionBitMask = CollisionCategories.EdgeBody
physicsBody.allowsRotation = false
player.physicsBody = physicsBody

您正在这样设置纹理大小:

CGSize(widht:100, height:100)

这显然不是您的纹理的正确尺寸。

改为使用真实的纹理尺寸:

yourTexture.size()

(感谢@Whirlwind 的帮助)

所以对我来说,修复最终是我需要改变这个:

let physicsBody = SKPhysicsBody(texture: self.texture, size: self.size)

..到这个..

let physicsBody = SKPhysicsBody(texture: self.texture, alphaThreshold: 0.3, size: self.size)

显然,在生成物理体时使用的 SKTextureAtlas 裁剪方法在确定裁剪的确切内容时存在问题,因此明确设置 alphaThreshold 似乎可以解决此问题。

显然,该值将取决于您自己的形象以及您拥有什么样的透明度。但是,如果你像我一样有硬边,你应该能够将其设置为某个任意值并且很高兴。

此问题存在于 iPad 3(iOS 9.3.5 和 xcode 8.1),在我的情况下,alphaThreshold 没有解决不正确的 PhysicsBody 问题。

我不得不切换到 "New Sprite Atlas" 而不是 "Texture Atlas",这神奇地解决了问题。