

私が書いたコードですと、フルスクリーンになった際に左下だけが写ってしまうなど、使用するディスプレイによっておかしな表示になってしまいます。  
例えば 800px * 600pxのViewとウィンドウを用意している状態でフルスクリーンになった際にも800px *
600pxのままで表示されるような方法はないでしょうか。画質が荒くなるなどの問題が生じるかもしれませんが、現状は気にしません。

[![現在のViewのプロパティです](https://i.stack.imgur.com/0IEbO.png)](https://i.stack.imgur.com/0IEbO.png)


CC BY-SA 4.0
2019-09-14T16:23:28.540
59067
2019-09-19T20:53:41.913
16877
question
swift4 spritekit
フルスクリーン時に解像度をそのままで画面全体に広げたい（SpriteKit × Swift4）


そこまで便利なメソッドはないので、こんな方法はいかがでしょうか？

  * `View`に対しては`AutoLayout`で`Aspect Ratio`制約を掛け、`View`の縦横比を常に一定に保つ
  * `Window Delegate`を`Window Controller`に対応させ、`WindowDidResize`, `WindowDidEnterFullScreen`で、現状のウィンドウサイズを取得する
  * `ScalingManager`的な`Singleton`を作成し、ウィンドウサイズが変更されたときに、現在の`View`の値を元にスケーリングファクター（係数）を更新する
  * プログラム内部での値は基礎ウィンドウサイズを元に理論値として取り扱い、実際の描画は、`ScalingManager`に座標やサイズを渡すことで、実座標を返すようにする
  * 描画は`ScalingManager`から返ってきた実座標に対して行う

この様に、理論座標と実座標を別々に持つ事で

  * ロジックは理論座標で
  * 描画は理論座標を元にした実座標で

行えば、今のロジックを大きく変更せずにウィンドウサイズの変更に対応出来ると思います


CC BY-SA 4.0
2019-09-18T18:50:57.747
59141
2019-09-18T18:50:57.747
14745
59067
answer


`UIImageView`がviewのサイズとは異なる`UIImage`を色々な方法で表示できるよのと似たような感じで、`SKView`はサイズの異なる`SKScene`を表示することができます。

以下のコード例はXcode
10.3でiOS用のGame/SpriteKitのテンプレートプロジェクトを修正したものです。(申し訳ありませんが、古いXcodeは置いていないんで、Swift4ではなく、Swift5です。)

なお、極端な値を指定した方が違いがわかりやすいので、800 x 600ではなく、80 x 60にしてあります。

GameViewController.swift:

[code]

    import UIKit
    import SpriteKit
    
    class GameViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let view = self.view as! SKView? {
                //viewの大きさは無視して、固定サイズの`GameScene`(`SKScene`)を作る
                let scene = GameScene(size: CGSize(width: 80, height: 60))
    
                scene.scaleMode = .fill //<- `scene`を縦横比無視してview全体に拡大/縮小
    
                view.presentScene(scene)
    
                view.ignoresSiblingOrder = true
    
                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    
        override var shouldAutorotate: Bool {
            return true
        }
    
        override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
            if UIDevice.current.userInterfaceIdiom == .phone {
                return .allButUpsideDown
            } else {
                return .all
            }
        }
    
        override var prefersStatusBarHidden: Bool {
            return true
        }
    }
    
[/code]

GameScene.swift:

[code]

    import SpriteKit
    
    class GameScene: SKScene {
    
        private var label : SKLabelNode?
    
        override func didMove(to view: SKView) {
    
            self.label = SKLabelNode(text: "Hello")
            if let label = self.label {
                label.fontColor = .red
                label.verticalAlignmentMode = .center
                label.position = CGPoint(x: 40, y: 30)
                label.alpha = 0.0
                label.run(SKAction.fadeIn(withDuration: 2.0))
                addChild(label)
            }
        }
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let label = self.label {
                label.run(SKAction(named: "Pulse")!, withKey: "fadeInOut")
            }
        }
    }
    
[/code]

Xcodeのテンプレは`SKView`がフルサイズで表示されるようになっているので、色々な解像度のsimulatorで走らせた上、`SKLabelNode`を置く位置などを変更して動作を確かめてみてください。

* * *

ただ、あなたの問題はむしろ`SKView`のレイアウトの問題のようにも思えます。「私が書いたコード」と言いながら、コードは1行も示していただいていませんから、何か見当違いのことをご説明したかもしれません。

この回答が問題解決のお役に立たないようでしたら、ご質問を編集して、「現在のコードとstoryboard/xibの設定」「期待される表示」「現在の表示」などを、今より詳しく説明してみてください。


CC BY-SA 4.0
2019-09-19T20:53:41.913
59167
2019-09-19T20:53:41.913
13972
59067
answer