ios - SpriteKit : Using SKTextureAtlas causes incorrect Physics Body

标签 ios sprite-kit skphysicsbody sktexture sktextureatlas

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

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

例如,我的玩家 Sprite 有三种状态:飞行(平飞)、向上飞行和向下飞行。这三幅图像非常相似,但略有不同( ARM 指向平、向上、向下)

在迁移到纹理图集之前,物理体与图像非常吻合。然而现在,它比图像大得多,并且在 y 轴上稍微拉伸(stretch)。

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

player-flying-iphone.atlas:

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

最佳答案

(感谢 @Whirlwind 的帮助)

所以对我来说,解决办法最终是我需要改变这个:

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

..对此..

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

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

显然,这个值(value)将取决于您自己的形象以及您的透明度。但如果你像我一样有硬边,你应该能够将其设置为任意值并且可以开始使用。

关于ios - SpriteKit : Using SKTextureAtlas causes incorrect Physics Body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36587720/

相关文章:

swift/Spritekit : Play music through specific scenes

ios - SpriteKit 和 Swift 中的 isDynamic 和 contactDelegate

sprite-kit - 无法将脉冲应用于SKSpriteNode物理主体

iphone - 每次更改文本时如何强制 UITextView 滚动到顶部?

ios - 以编程方式在 UIView 中创建斜线背景

ios - 如何跟踪同一 SKSpriteNode 的各个实例

ios - Sprite 物理在 Swift (SpriteKit) 中显示但未在视觉上显示

ios - 暂停 Sprite Kit 物理游戏在 iOS 9 上无法正常工作

ios - Realm swift : instance member cannot be used on type

iphone - 如何在单个存储库中维护多个iOS应用程序?