代码之家  ›  专栏  ›  技术社区  ›  slugz

Swift 4 SpriteKit纹理缩放问题

  •  0
  • slugz  · 技术社区  · 7 年前

    我正在开发一个简单的游戏应用程序,遇到了一个非常奇怪的缩放问题。我扩展了SKSpriteNode,使其成为我游戏世界中的一个障碍。该障碍物的@1x、@2x和@3x图像都设置在资源中。xcassets

    我的问题是,无论我加载什么样的纹理并将其传递到super。init最终正好是我实际图像大小的50%。因此,就好像它在使用@n-1x值,尽管它不是(通过删除@1x和@3x图像进行测试来确认)。

    代码:

    import SpriteKit
    
    class Obstacle: SKSpriteNode {
    
    init(imageNamed: String, type: UInt32, xPos: CGFloat = 0, yPos: CGFloat = 800) {
        let texture = SKTexture(imageNamed: imageNamed);
        super.init(texture: texture, color: SKColor.clear, size: texture.size();
        }
    }
    

    我正在@2x设备上进行测试,并在阅读了SKTexture之后进行测试。size()文档我看到它以点而不是像素返回大小值,所以我创建了以下解决方法:

    import SpriteKit
    
    class Obstacle: SKSpriteNode {
    
    let scale = UIScreen.main.scale
    
    init(imageNamed: String, type: UInt32, xPos: CGFloat = 0, yPos: CGFloat = 800) {
        let texture = SKTexture(imageNamed: imageNamed);
        super.init(texture: texture, color: SKColor.clear, size: CGSize(width: texture.size().width * scale, height: texture.size().height * scale);
        }
    }
    

    这个变通方法解决了我的问题,但我不能相信没有任何功能可以避免这个问题。我的所有其他图像资源,如背景、按钮、播放器模型等,在大小方面都可以正常工作,但它们的所有图像都是通过屏幕设置的。sks场景编辑器,非编程方式。

    我没有任何代码以任何方式修改障碍物的比例或大小。

    还请注意,我省略了设置x和y位置、物理等的无关代码。

    我是iOS开发新手,非常感谢您对我的帮助!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Knight0fDragon    7 年前

    你不应该玩缩放,系统会为你选择正确的缩放图像。您的代码应该如下所示:

    import SpriteKit
    
    class Obstacle: SKSpriteNode {
    
    
    
    init(imageNamed: String, type: UInt32, xPos: CGFloat = 0, yPos: CGFloat = 800) {
        let texture = SKTexture(imageNamed: imageNamed);
        super.init(texture: texture, color: SKColor.clear, size: Texture.size());
        }
    }
    
    ...
    
    let obstacle =  Obstacle(imageNamed:“myImage”,type:0)
    

    请注意,我没有包括任何类型的扩展。

    推荐文章