我正在构建我的第一个sprite kit游戏,并且最近阅读了一篇文章,该文章说使用SKTextureAtlas来提高性能。
因此,我将所有精灵图像迁移到有组织的.atlas
文件夹中,并相应地更新了代码。
但是,现在我的精灵有奇怪的物理机构(主要是过度放大)。
例如,我的玩家精灵有三种状态:飞行(平坦),飞行和飞行。这三个图像非常相似,略有不同(手臂指向平面,向上,向下)。
在迁移到纹理地图集之前,物理主体在图像上非常适合。然而,现在,它比图像大得多,并且在y轴上略微拉伸。
这是我的player.atlas文件结构:
玩家飞iphone.atlas:
以下是我的代码示例: (播放器是子类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
答案 0 :(得分:1)
您正在设置纹理大小:
CGSize(widht:100, height:100)
这显然不是纹理的正确尺寸。
而是使用真实的纹理尺寸:
yourTexture.size()
答案 1 :(得分:1)
(感谢@Whirlwind的帮助)
所以对我来说,修复最终是因为我需要改变它:
let physicsBody = SKPhysicsBody(texture: self.texture, size: self.size)
..对此..
let physicsBody = SKPhysicsBody(texture: self.texture, alphaThreshold: 0.3, size: self.size)
显然,生成物理主体时使用的SKTextureAtlas裁剪方法在确定要裁剪的内容时存在问题,因此明确设置alphaThreshold似乎可以修复它。
显然,这个价值取决于你自己的形象以及你拥有的透明度。但是,如果你像我一样有硬边,你应该能够将它设置为某个任意值,并且可以很好地去。
答案 2 :(得分:0)
这个问题存在于iPad 3(iOS 9.3.5和xcode 8.1)上,在我的情况下,alphaThreshold并没有解决不正确的PhysicsBody问题。
我不得不切换到" New Sprite Atlas"而不是"纹理图谱",它神奇地修复了这个问题。