2

我正在构建我的第一个精灵套件游戏,最近阅读了一篇文章,说使用 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

这是我的代码示例: (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
4

3 回答 3

4

(感谢@Whirlwind 的帮助)

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

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

..到这个..

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

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

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

于 2016-04-13T22:11:46.010 回答
1

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

CGSize(widht:100, height:100)

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

而是使用真实的纹理大小:

yourTexture.size()

于 2016-04-13T10:16:46.040 回答
0

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

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

于 2016-11-08T08:51:22.557 回答