Как я могу получить размер SKScene в `didMove (для просмотра: SKView)` при установке scaleMode для resizeFill? - PullRequest
0 голосов
/ 21 мая 2018

Мне нужен размер SKScene, чтобы сделать некоторые начальные вычисления в моем методе didMove.Когда я использую SKSceneScaleMode в случае resizeFill для установки scaleMode моей gameScene, значения self.size равны (0, 0) в методе didMove gameScene.Когда я запрашиваю размер в других методах, таких как touchesBegan, значения соответствуют ожидаемым (ненулевые значения, соответствующие размеру сцены).Эта проблема возникает только при установке gameScene.scalemode на resizeFill перед представлением сцены.Любой другой случай SKSceneScaleMode работает нормально.

Вот пример кода

import SpriteKit

class GameViewController: UIViewController {
    override func loadView() {
        self.view = SKView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let skView = view as! SKView
        let gameScene = GameScene(size: UIScreen.main.bounds.size)
        gameScene.scaleMode = .resizeFill
        skView.presentScene(gameScene)
    }
}

class GameScene: SKScene, SKPhysicsContactDelegate {
    override func didMove(to view: SKView) {
        print(self.size) // self.size == (0,0)
        // ...calculations using self.size
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            print(self.size) // self.size has expected, non-zero valeus
     }
}

Я не использую раскадровки или файлы sks.Вот как выглядит appDelegate

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow()
        window?.makeKeyAndVisible()
        let gameViewController = GameViewController()
        window?.rootViewController = gameViewController
        return true
    }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

вы не звоните super.didMove(to:view).Сначала попробуйте, если это не сработает, а затем выполните:

override func didMove(to view: SKView) {
    super.didMove(to:view)
    DispatchQueue.main.async{
        print(self.size)
    }
}

Что это сделает, это скажет GCD запустить этот блок вскоре после завершения вашей функции.

0 голосов
/ 21 мая 2018

Когда инициализируется SKScene, sceneDidLoad () вызывается сразу после.Вы можете распечатать или сделать другой расчет с размером SKScene в методе sceneDidLoad ().В вашей GameScene используйте этот фрагмент кода, приведенный ниже:

       override func sceneDidLoad() {
                print(self.size) // make changes as your requirements
       }

Этот метод был вызван до didMove, поэтому вы можете использовать вычисление размера по мере необходимости.

...