SKSpriteNode初始化(纹理:atlas!.textureNamed(“ something”)在iPhone X上加载不正确

时间:2018-11-28 23:05:07

标签: ios iphone swift sprite-kit

G'Day,

我在为孩子们写的游戏中出现了一个问题。经过一番调查,我“发现”了以下问题:

在原始游戏中,精灵通过

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

所使用的纹理图集中包含大量小的纹理,即“图像”。这样就可以在12.9英寸的旧设备iPhone 7,iPad Air,iPad Pro上运行令人满意的游戏。但是,在iPhone X等以及iPhone X模拟器上,从地图集加载的任何图像都显示为微小的小点或根本不显示。没有编译器错误和运行时错误。我假设这与屏幕分辨率有关,但是又如何呢?如果我通过init(imageNamed:“ something”)调用图像,则会正确缩放并显示相同的图像。 我创建了一个小型的独立程序来说明此问题,下面的代码:我还包括两个截屏,分别显示了在iPad和iPhone Xsmax上加载并运行的相同代码。 iPad图像显示了两个平台和小兔子,而iPhone图像显示了它们的缺失。

这两个地图集文件包含平台,GEM和兔子图像,第一个地图集总共还包含约90个小图像。如您所见,第一个图集图像加载不正确,但是,如果我将包含的图像数量减少到大约30幅以下,则所有图像都可以正常工作。哦,编译器也没有抱怨或拆分Atlas文件。所以我想最后一个问题分为两个部分:

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

0 个答案:

没有答案