Ios SpriteKit:使用SKTextureAtlas会导致不正确的物理实体

Ios SpriteKit:使用SKTextureAtlas会导致不正确的物理实体,ios,sprite-kit,skphysicsbody,sktexture,sktextureatlas,Ios,Sprite Kit,Skphysicsbody,Sktexture,Sktextureatlas,我正在制作我的第一个精灵套件游戏,最近读到一篇文章,说使用SKTextureAtlas可以提高性能 因此,我将所有的精灵图像迁移到有组织的.atlas文件夹中,并相应地更新了代码。 然而,现在我的精灵有奇怪的物理身体(主要是过度放大) 例如,我的玩家精灵有三种状态:飞行(平坦)、向上飞行和向下飞行。这三幅图像非常相似,只是略有变化(手臂平放、向上、向下) 在迁移到纹理地图集之前,物理体与图像非常接近。但是,现在它比图像大得多,并且在y轴上略微拉伸 这是我的player.atlas文件结构: pl

我正在制作我的第一个精灵套件游戏,最近读到一篇文章,说使用SKTextureAtlas可以提高性能

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

例如,我的玩家精灵有三种状态:飞行(平坦)、向上飞行和向下飞行。这三幅图像非常相似,只是略有变化(手臂平放、向上、向下)

在迁移到纹理地图集之前,物理体与图像非常接近。但是,现在它比图像大得多,并且在y轴上略微拉伸

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

player-flying-iphone.atlas:

  • 玩家飞行-down@2x.png
  • 玩家飞行-down@3x.png
  • 玩家飞行-up@2x.png
  • 玩家飞行-up@3x.png
  • 玩家-flying@2x.png
  • 玩家-flying@3x.png
下面是我的代码示例: (玩家是一个子类SKSpriteNode)


您正在如下设置纹理大小:

CGSize(宽:100,高: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无法解决物理体不正确的问题


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

我更新了代码,现在当它试图创建物理体时出现了这个错误:PhysicsBody:无法创建物理体。@Nitwitudios,你能展示一下你使用的代码(产生错误的更新代码)吗?而且,这个错误也不是那么具有描述性。你能把整个错误都抄下来吗这就是整个错误。。以下是更新后的代码:let flyingTextureAtlas=SKTextureAtlas(名为:“玩家飞行iphone”)let texture=self.flyingTextureAtlas.TextureName(“玩家飞行”)let player=player(纹理:纹理,颜色:SKColor.clearColor(),大小:纹理.size())let physicsBody=SKPhysicsBody(纹理:纹理,大小:纹理.size())player.physicsBody=physicsBody同样,图像显示得很好,因此我知道加载图像时没有问题。正如我在最初的帖子中所说,在转移到纹理地图集之前,一切都很好,包括这些精确图像的物理体。所以我知道这不是因为图像太复杂,这很奇怪。打印texture.size()会得到什么?另外,在添加新代码时,应考虑更新原始问题。将其粘贴到评论中是不可读的,对未来的读者来说也不是那么有用。虽然您已经得到了答案,但我建议您使用Xcode资产目录进行SKtextures。从Xcode 7开始,你可以使用纹理图像的资源目录,苹果公司说这是最好的方法。因此,我认为这些关于atlas文件夹的文章已经过时了。
let physicsBody = SKPhysicsBody(texture: self.texture, alphaThreshold: 0.3, size: self.size)