ОК, вот тест различных подходов, позволяющих избежать этой ошибки, начиная с iOS 13.3 (редактирование также теперь пробовалось на 13.3.1) и Xcode версии 11.3. Полный источник теста по этой ссылке:
https://github.com/bg2b/bugtest
Соответствующий код:
func addShip(_ texture: SKTexture, how: String) {
let sprite = SKSpriteNode(texture: texture)
sprite.position = CGPoint(x: x, y: 0)
sprite.zRotation = .pi / 4
x += 100
sprite.physicsBody = SKPhysicsBody(texture: texture, size: sprite.size)
if sprite.physicsBody == nil {
print("\(how) failed")
} else {
print("\(how) worked")
}
addChild(sprite)
}
override func didMove(to view: SKView) {
// The atlas version of a texture
addShip(SKTexture(imageNamed: "ship_blue"), how: "simple atlas reference")
// From an atlas, but call size() to force loading
let texture = SKTexture(imageNamed: "ship_blue")
_ = texture.size()
addShip(texture, how: "atlas force load")
// Reconstruct via CGImage (size would be wrong because of 2x)
let cgTexture = SKTexture(cgImage: texture.cgImage())
addShip(cgTexture, how: "reconstruct via cgImage")
// Re-render using view
let renderedTexture = view.texture(from: SKSpriteNode(texture: texture))!
addShip(renderedTexture, how: "re-render using view")
// Non-atlas texture
addShip(SKTexture(imageNamed: "nonatlas_ship_blue"), how: "not in atlas")
}
Резюме:
- Простая ссылка на текстуру из атласа и создание физического тела может дать сбой
- Принудительная загрузка текстуры путем вызова
size()
до того, как произойдет сбой тела - Попытка создать новую текстуру пройти через
cgImage()
не удалось (само изображение повреждено, вероятно, связано с той же ошибкой) - Рендеринг в текстуру с использованием вида и затем создание физического тела из этой новой текстуры работает
- Создание физического тела из неатлантической копии текстуры работает
Вывод на консоль из тестовой программы, показывающий, что работает, а что нет:
2020-02-01 06:23:51.872975-0500 bugtest[14399:9898087] PhysicsBody: Could not create physics body.
simple atlas reference failed
2020-02-01 06:23:51.886387-0500 bugtest[14399:9898087] PhysicsBody: Could not create physics body.
atlas force load failed
2020-02-01 06:23:51.913927-0500 bugtest[14399:9898087] PhysicsBody: Could not create physics body.
reconstruct via cgImage failed
re-render using view worked
not in atlas worked
Вот экран снимок, показывающий влияние различных подходов. Вы должны присмотреться, но только последние два имеют действительные физические тела.