将 scaleMode 设置为 resizeFill 时,如何在 didMove(to view: SKView) 中获取 SKScene 的大小?
How can I obtain an SKScene's size in `didMove(to view: SKView)` when setting scaleMode to resizeFill?
我需要 SKScene 的大小来在我的 didMove 方法中进行一些初始计算。当我使用 resizeFill 的 SKSceneScaleMode 案例设置 gameScene 的 scaleMode 时,self.size 值在 gameScene 的 didMove 方法中为 (0, 0)。当我在其他方法(例如 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
}
}
您没有打电话给 super.didMove(to:view)
。先试试看,如果不行,再做:
override func didMove(to view: SKView) {
super.didMove(to:view)
DispatchQueue.main.async{
print(self.size)
}
}
这会告诉 GCD 在您的函数结束后不久 运行 这个块。
我需要 SKScene 的大小来在我的 didMove 方法中进行一些初始计算。当我使用 resizeFill 的 SKSceneScaleMode 案例设置 gameScene 的 scaleMode 时,self.size 值在 gameScene 的 didMove 方法中为 (0, 0)。当我在其他方法(例如 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
}
}
您没有打电话给 super.didMove(to:view)
。先试试看,如果不行,再做:
override func didMove(to view: SKView) {
super.didMove(to:view)
DispatchQueue.main.async{
print(self.size)
}
}
这会告诉 GCD 在您的函数结束后不久 运行 这个块。