SKSpriteNode init (texture: atlas! .TextureNamed ("что-то") неправильно загружается на iPhone X - PullRequest
0 голосов
/ 29 ноября 2018

G'Day,

У меня возникла проблема в игре, которую я написал для своих детей.После некоторых исследований я «обнаружил» следующую проблему:

В оригинальной игре спрайты загружаются через

let sprite = SKSpriteNode(texture: atlas!.textureNamed("something")

Используемый атлас текстур имеет большое количество мелких текстур, «изображений»в этом.В результате получается работающая и веселая игра на старых устройствах, iPhone 7, iPad Air, iPad Pro 12,9 дюйма.Однако на iPhone X и т. Д., А также на симуляторе iPhone X любые изображения, загруженные из атласа, отображаются либо в виде маленьких маленьких точек, либо вообще не отображаются.Нет ошибок компилятора и ошибок времени выполнения.Я предполагаю, что это как-то связано с разрешением экрана, но что?Если я загружаю изображения через инициализацию (imageNamed: «что-то»), вызов сам же изображения корректно масштабируются и отображаются.Я создал небольшую отдельную программу, которая иллюстрирует эту проблему, код ниже: я также включил два снимка экрана, показывающих тот же самый код, загруженный и работающий на iPad и iPhone Xsmax.Изображение iPad показывает две платформы и кроликов, в то время как изображение iPhone показывает, что они отсутствуют.

Два файла атласа содержат изображения платформы и GEM и кролика, первый атлас также содержит в общей сложности около 90 небольших изображений.Как вы можете видеть, первые изображения атласа загружены неправильно, однако, если я уменьшу количество изображений, содержащихся ниже, около 30 изображений, все это будет работать.Да, и компилятор не жалуется и не разбивает файлы атласа.Итак, я полагаю, что последний вопрос состоит из двух частей:

1 Что на самом деле происходит?

2 Как это исправить?

Код выглядит следующим образом:

//
//  GameScene.swift
//  SpriteTest
//
//
import SpriteKit

class GameScene: SKScene {

let player = SKSpriteNode(imageNamed: "player")
var atlas :SKTextureAtlas?
var atlas2 :SKTextureAtlas?

var tile : SKNode?
var tile2 : SKNode?

override func didMove(to view: SKView) {
    // White background for visibility


    backgroundColor = SKColor.white

    player.position = CGPoint(x: size.width * 0.1, y: size.height * 0.5)
    addChild(player)


// first platform "does not appear on iPhone X"

    atlas = SKTextureAtlas(named: "Tiles")
    tile = SKSpriteNode(texture: atlas!.textureNamed("platform"))
    tile?.zPosition = 50
    tile?.physicsBody?.isDynamic = true
    tile?.physicsBody?.affectedByGravity = false
    tile?.position = CGPoint(x: size.width * 0.1, y : size.height * 0.2)

    addChild(tile!)
     atlas2 = SKTextureAtlas(named: "Smallatlas")

// Second platform always appears

    tile2 = SKSpriteNode(texture: atlas2!.textureNamed("platform"))
    tile2?.zPosition = 50
    tile2?.physicsBody?.isDynamic = true
    tile2?.physicsBody?.affectedByGravity = false
    tile2?.position = CGPoint(x: size.width * 0.6, y : size.height * 0.2)

    addChild(tile2!)

    run(SKAction.repeatForever(
        SKAction.sequence([
            SKAction.run(addMonster),
            SKAction.wait(forDuration: 1.0)
            ])
    ))



}
func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}

func random(min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
}

func addMonster() {

    // First monster "bunny" does not appear on iPhone X

    let  monster = SKSpriteNode(texture: atlas!.textureNamed("chocolate-bunny150"))

    // Determine where to spawn the monster along the Y axis
    let actualY = random(min: monster.size.height/2, max: size.height - monster.size.height/2)

    // Position the monster slightly off-screen along the right edge,
    // and along a random position along the Y axis as calculated above
    monster.position = CGPoint(x: size.width + monster.size.width/2, y: actualY)

    // Add the monster to the scene
    addChild(monster)

    // Determine speed of the monster
    let actualDuration = random(min: CGFloat(2.0), max: CGFloat(4.0))

    // Create the actions
    let actionMove = SKAction.move(to: CGPoint(x: -monster.size.width/2, y: actualY),
                                   duration: TimeInterval(actualDuration))
    let actionMoveDone = SKAction.removeFromParent()
    monster.run(SKAction.sequence([actionMove, actionMoveDone]))
    addMonster2()
}
func addMonster2() {

    // Second monster always appears

    let  monster2 = SKSpriteNode(texture: atlas2!.textureNamed("gem"))

    // Determine where to spawn the monster along the Y axis
    let actualY = random(min: monster2.size.height/2, max: size.height - monster2.size.height/2)

    // Position the monster slightly off-screen along the right edge,
    // and along a random position along the Y axis as calculated above
    monster2.position = CGPoint(x: size.width + monster2.size.width/2, y: actualY)

    // Add the monster to the scene
    addChild(monster2)

    // Determine speed of the monster
    let actualDuration = random(min: CGFloat(2.0), max: CGFloat(4.0))

    // Create the actions
    let actionMove = SKAction.move(to: CGPoint(x: -monster2.size.width/2, y: actualY),
                                   duration: TimeInterval(actualDuration))
    let actionMoveDone = SKAction.removeFromParent()
    monster2.run(SKAction.sequence([actionMove, actionMoveDone]))
}
}

iPhone XS max screen grab "" iPad Screen grab

...