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的问题。
我不得不切换到“新雪碧阿特拉斯”,而不是“纹理地图集”,这就奇迹般地解决了这个问题。