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

时间:2016-04-13 02:54:43

标签: ios sprite-kit skphysicsbody sktexture sktextureatlas

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

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

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

在迁移到纹理地图集之前,物理主体在图像上非常适合。然而,现在,它比图像大得多,并且在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

以下是我的代码示例: (播放器是子类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

3 个答案:

答案 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"而不是"纹理图谱",它神奇地修复了这个问题。