SpriteKit:使用SKTextureAtlas会导致不正确的Physics Body

我正在构build我的第一个精灵套件游戏,最近阅读了一篇文章,说使用SKTextureAtlas来提高性能。

所以我把我所有的精灵图像都转移到了有组织的.atlas文件夹中,并相应地更新了代码。 不过,现在我的精灵怪异的物理机构(主要是过度扩大)

例如,我的玩家精灵有三个状态:飞(平),飞起来,飞下来。 这三个图像是非常相似的,有轻微的变化(arm平放,上,下)

在迁移到纹理图集之前,物理图像与图像相关。 然而,现在它比图像大得多,在y轴上略微拉伸。

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

玩家飞iphone.atlas:

  • player-flying-down@2x.png
  • player-flying-down@3x.png
  • player-flying-up@2x.png
  • player-flying-up@3x.png
  • player-flying@2x.png
  • player-flying@3x.png

下面是我的代码示例: (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的问题。

我不得不切换到“新雪碧阿特拉斯”,而不是“纹理地图集”,这就奇迹般地解决了这个问题。