Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift PhysicsBody:无法创建物理实体_Swift_Sprite Kit - Fatal编程技术网

Swift PhysicsBody:无法创建物理实体

Swift PhysicsBody:无法创建物理实体,swift,sprite-kit,Swift,Sprite Kit,我有一个完整的工作游戏,已经在应用商店,但由于iOS 13它根本不工作。我已经通过Xcode将游戏安装到我的设备上,我收到了很多错误,比如: PhysicsBody:无法创建物理实体 我一直在创建我的SKSpriteNodes,如下所示: let bird = SKSpriteNode(texture: SKTextureAtlas(named:"player").textureNamed("bird0001")) bird.physicsBody = SKPhysicsBody(textu

我有一个完整的工作游戏,已经在应用商店,但由于iOS 13它根本不工作。我已经通过Xcode将游戏安装到我的设备上,我收到了很多错误,比如:

PhysicsBody:无法创建物理实体

我一直在创建我的SKSpriteNodes,如下所示:

 let bird = SKSpriteNode(texture: SKTextureAtlas(named:"player").textureNamed("bird0001"))
 bird.physicsBody = SKPhysicsBody(texture: bird.texture!,
                                         size: bird.size)
根据一些研究,这可能是iOS和Xcode的一个持续错误。是否有人能确认这是不是真的,因为这似乎是应用商店中使用纹理创建SKSpriteNodes的游戏的一个主要问题


在需要纹理的地方是否有修复方法?

好的,下面是一个测试,从iOS 13.3(编辑现在也在13.3.1上试用)和Xcode 11.3版开始,可以使用不同的方法来避免此错误。此链接的完整测试来源:

相关代码:

func addShip(texture:SKTexture,how:String){
设sprite=SKSpriteNode(纹理:纹理)
sprite.position=CGPoint(x:x,y:0)
sprite.zRotation=.pi/4
x+=100
sprite.physicsBody=SKPhysicsBody(纹理:纹理,大小:sprite.size)
如果sprite.physicsBody==nil{
打印(“\(如何)失败”)
}否则{
打印(“工作方式”)
}
addChild(精灵)
}
覆盖func didMove(到视图:SKView){
//纹理的阿特拉斯版本
addShip(SKTexture(图像名为:“ship_blue”)、how:“简单地图集参考”)
//从atlas,但调用size()强制加载
let texture=SKTexture(图像名为:“ship_blue”)
_=纹理。大小()
添加(纹理,如何:“阿特拉斯力载荷”)
//通过CGImage重建(由于2x的原因,大小可能错误)
设cgTexture=SKTexture(cgImage:texture.cgImage())
添加(cgTexture,如何:“通过cgImage重建”)
//使用视图重新渲染
让renderedTexture=view.texture(from:SKSpriteNode(texture:texture))!
addShip(renderedTexture,如何:“使用视图重新渲染”)
//非阿特拉斯纹理
addShip(SKTexture(图像名为:“nonatlas_ship_blue”),how:“不在地图册中”)
}
总结:

  • 简单地引用图集中的纹理并制作物理实体可能会失败
  • 在使实体失败之前,通过调用
    size()
    强制加载纹理
  • 尝试通过
    cgImage()
    创建新纹理失败(图像本身已损坏,可能与同一错误有关)
  • 使用视图渲染到纹理,然后使用该新纹理生成物理实体
  • 从纹理的非atlas副本制作物理实体是可行的
  • 测试程序的控制台输出,显示哪些有效,哪些无效:

    2020-02-01 06:23:51.872975-0500错误测试[14399:9898087]物理实体:无法创建物理实体。
    简单地图集参考失败
    2020-02-01 06:23:51.886387-0500错误测试[14399:9898087]物理实体:无法创建物理实体。
    阿特拉斯力载荷失效
    2020-02-01 06:23:51.913927-0500错误测试[14399:9898087]物理实体:无法创建物理实体。
    通过cgImage重建失败
    使用视图重新渲染
    不在阿特拉斯工作
    
    下面是一个屏幕截图,显示了不同方法的效果。你必须仔细观察,但只有最后两个有有效的物理体


    是的,这是一个bug。至少对我们来说,物理实体来自于阿特拉斯作品中没有的纹理。我们通过复制资产的非纹理版本并从中构建物理实体来避免这个问题。如果你不能做到这一点,也不能使用圆形或矩形物体等替代物,那么制作一个精灵,然后使用SKView的
    纹理(from:)
    纹理(from:crop:)
    将产生一种可行的纹理。我还没试过。我在这里的某个地方提供了代码,临时修复了这个bugHey Knight0fDragon,这很好。你能链接到那个吗?不知道我把它贴在哪里了,如果你搜索这个bug,你应该能找到它。
    texture(from:)
    确实产生了一种可以用于成功创建物理实体的纹理。请参阅下面的答案,了解哪些有效,哪些无效。是的!似乎最简单的解决方案是停止使用纹理图集。对于我的游戏来说,这是最简单的过渡,工作量最少。我现在回到iOS开发,仍然使用Obj-C。我有这个问题,但需要从swift“翻译”。你出色的总结中的解决方案4正是我想要的。你能给我翻译一下吗?我缺少view.texture调用,不确定如何实现。。。谢谢你的帮助。