SpriteKit Sprite 无法正确缩放

Posted

技术标签:

【中文标题】SpriteKit Sprite 无法正确缩放【英文标题】:SpriteKit Sprites Not Scaling Properly 【发布时间】:2016-12-06 18:45:34 【问题描述】:

我的 SpriteKit 游戏中的精灵虽然缩放得当,但在我的场景中渲染得非常小。我一直在使用类似大小的精灵关注一些不同的教程,并且它们在模拟器中可以很好地缩放。下面是一些代码sn-ps和截图。例如,屏幕右上角的暂停按钮非常小,但资产的实际分辨率是标准尺寸。

GameScene.swift

private let pauseTex = SKTexture(imageNamed: "PauseButton")    

...

private func setupPause() 
    pauseBtn.texture = pauseTex
    pauseBtn.size = pauseTex.size()
    pauseBtn.anchorPoint = CGPoint(x: 1.0, y: 1.0)
    pauseBtn.position = CGPoint(x: size.width, y: size.height)
    pauseBtn.zPosition = Layer.Foreground.rawValue
    worldNode.addChild(pauseBtn)Btn)

    ...

GameVC.swift

override func viewWillLayoutSubviews() 
    super.viewWillLayoutSubviews()

    ...

    if let skView = self.view as? SKView 
        if skView.scene == nil 

            let aspectRatio = view.bounds.size.height / view.bounds.size.width
            let scene = MenuScene(size: CGSize(width: 750, height: 750 * aspectRatio))

            scene.scaleMode = .aspectFill
            skView.ignoresSiblingOrder = true

            ...
        
    

【问题讨论】:

你设置了节点的size属性了吗? 您需要设置场景的大小以匹配设备上窗口的大小,然后设置您的对象,使大小与屏幕的实际大小相关(百分比简单)。您必须明确设置它。 你的 1x 2x 和 3x 图形的尺寸是多少,它们需要是正确的倍数 不要像@MoDJ 所说的那样做,这是最糟糕的使用方式 @MoDJ,spritekit 有 scaleMode 是有原因的,你为 1 尺寸设计,系统为你缩放。无需无数次除法,很容易搞砸数学,浪费时间调试 【参考方案1】:

基本上这里发生的事情是 Mike 对场景大小和屏幕大小感到困惑。他在想,既然精灵是 32 像素,它应该占据 iPhone SE 屏幕的 10%,因为它的 1x 宽度为 320(本机是 640 [2x]),但实际上,他的场景是 750 像素宽,所以它只显示为 5%。 他将场景大小更改为 375x667(iPhone 6 非视网膜分辨率)以正确使用视网膜图形,现在一切都应该适合他了。

他现在要遇到的唯一问题是在 iPad 设备上进行裁剪。为此,他只需要在安全区域工作即可。

【讨论】:

【参考方案2】:

由于不同设备之间的分辨率差异(如果SKScenescaleMode 设置为resizeFill,这是正确的),您的资产大小将不会始终在屏幕上反映所需的大小。如果你想为你的精灵设置一个特定的大小,你需要将SKNodesize属性设置为你想要的值。

这在你的方法中会是什么样子:

private func setupPause() 

    pauseBtn.anchorPoint = CGPoint(x: 1.0, y: 1.0)

    // Set size property (arbitrarily selected below)
    pauseBtn.size = CGSize(width: 50, height: 50)

    pauseBtn.position = CGPoint(x: size.width, y: size.height)
    pauseBtn.zPosition = Layer.Foreground.rawValue
    worldNode.addChild(pauseBtn)


【讨论】:

这是不正确的,除非在 resizeFill 或假的 resize fill 的情况下,这会使按钮大小在各种屏幕尺寸上不成比例 @Night0fDragon,你是对的,我本可以更好地解释这一点。然而,这并没有改变size 属性和setScale() 方法都没有设置的事实,并且他完全依赖于资源的原始大小/比例(这显然不是所需的比例)。跨度> 我们在这里遗漏了很多信息,例如 scaleMode、场景大小和所有 3 个资产的大小 一秒骑士,将用更多信息更新问题! @Knight0fDragon 我已经添加了您要求的信息。

以上是关于SpriteKit Sprite 无法正确缩放的主要内容,如果未能解决你的问题,请参考以下文章

Sprite不会用手指/ SpriteKit / Swift 3移动

Sprite Kit 中的 AVAudioPlayer“加载资源失败”原因资源“无法加载 sound.caf”

SpriteKit:如何立即使用 removeAllActions 停止操作

SKSpriteNode 没有正确缩放

Sprite Kit 碰撞检测和物理

Sprite Kit:屏幕上的 SKSpriteNodes 计数