我的 SKTexture 尺寸不适合我的 SKSpriteNode

Posted

技术标签:

【中文标题】我的 SKTexture 尺寸不适合我的 SKSpriteNode【英文标题】:My SKTexture is size wrong for my SKSpriteNode 【发布时间】:2020-01-08 16:01:22 【问题描述】:

我有一个 200 x 100 类似于框的菜单按钮 SKSpriteNode 在下面声明。

menuBtn.size = CGSize(width: scrWidth * 1.5, height: 100)
menuBtn.texture = SKTexture(image: UIImage(named: "menuBtn")!)

问题是,按钮的hitbox仍然是正确的,SKTexture的宽度很好,但是SKTexture的高度大约是实际menuBtn大小的1/2。它是一个 png,我已经检查过了,精灵周围没有清晰的纹理(只有透明的 png 纹理),我做错了什么?

按钮图片:https://imgur.com/a/8BtXGLC

App中的按钮图片:https://imgur.com/a/ZfW3xDL

我希望它的外观图片:https://imgur.com/a/2zlSv8y

如果有任何影响,纹理的 png 图像大小为 1044x1044。

【问题讨论】:

你能把你提到的所有东西都拿出来看看吗? png的尺寸是多少? @Knight0fDragon 确定我会添加一个 imgur 链接 @LouFranco Idk,我该如何检查? 什么是scrWidth 【参考方案1】:

首先,确保您将正确的大小从GameViewController 发送到您的场景,在本例中为GameScene

// without .sks

class GameViewController: UIViewController 

    override func viewDidLoad() 
    
        super.viewDidLoad()

        // ...        

        if let view = self.view as! SKView?
        
            let scene = GameScene()

            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFit

            // Set anchorPoint and pass scene.size
            scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            scene.size = view.bounds.size

            // Present the scene
            view.presentScene(scene)
        

        // ...


// with .sks

class GameViewController: UIViewController 

    override func viewDidLoad() 
    
        super.viewDidLoad()

        // ...   

        if let view = self.view as! SKView? 
        
            if let scene = SKScene(fileNamed: "GameScene.sks") 
            
                // Set the scale mode to scale to fit the window
                scene.scaleMode = .aspectFit

                // Pass scene.size
                scene.size = view.bounds.size

                // Present the scene
                view.presentScene(scene)
             
        

        // ...

在您的GameScene 创建对象。我建议在创建对象时使用 screenWidthscreenHeight,以便它们可以扩展到所有 ios 设备。

class GameScene: SKScene 

    override func didMove(to view: SKView) 
    
        // ...

        // scene width / height
        let sceneWidth = size.width
        let sceneHeight = size.height

        // object
        let menu : SKSpriteNode = SKSpriteNode()
        menu.texture = SKTexture(imageNamed: "menu")
        menu.size = CGSize(width: sceneWidth * 0.75, height: 100)
        let y_pos : CGFloat = -sceneHeight * 0.5 + menu.size.height * 0.5
        menu.position = CGPoint(x: 0, y: y_pos)
        menu.zPosition = 1
        addChild(menu)

        // ...
   

【讨论】:

menuBtn = self.childNode(withName: "menuBtn") as! SKSpriteNode menuBtn.size = CGSize(width: scrWidth * 1.5, height: 100) menuBtn.color = UIColor(ciColor: .blue) menuBtn.position = CGPoint(x: 0, y: -scrHeight + safeArea.bottom + 50) menuBtn.zPosition = 2 menuBtn.texture = SKTexture(image: UIImage(named: "menuBtn")!) 是我声明我的对象的方式(因为它已经在 sks 中),但它似乎基本相同。我的所有方面在所有设备上都是相同的,但是这个按钮的纹理收缩只是它的 y 值。这就是我要问的。 您可以添加菜单图像的链接吗? menuBtn 一个。 您不应该将场景设置为您的视图大小,这违背了 Spritekit 缩放功能的基础。 SpriteKit 的设计方式是,您只需要设计 1 种尺寸,其余的交给硬件完成 我这样做时的问题是,如果我使用 .aspectFit,根据设备的不同,侧面和顶部会有很多额外的黑色空间,而 .aspectFill 会导致所有内容都变得太大。跨度> 【参考方案2】:

我遇到的问题是我的基本图像中有额外的透明像素,我所要做的就是使用 GIMP 将它们删除。

【讨论】:

当我们要求您向我们展示 png 文件时,我们有点想通了。 ? 是的,感谢您的帮助,但我无法对评论给出“答案”,如果其他人有这个问题,他们会感到困惑。

以上是关于我的 SKTexture 尺寸不适合我的 SKSpriteNode的主要内容,如果未能解决你的问题,请参考以下文章

autoLayout不适合我的所有屏幕尺寸

SKTexture 返回错误的大小?

如何创建适合我的显示器尺寸的AVD?

SKSpriteNode替换为SKTexture

CIFilter(CIStripesGenerator)与SKTexture?

UIImage 中的 SKTexture 看起来不同