将场景的框架设置为 iPhone 屏幕的大小
Set the frame of scene to be size of the iPhone screen
您好,我是 sprite kit 的新手,出于某种原因,当使用 self.frame.size.width 或 .height 在场景中定位按钮或子视图时,它们没有居中,而是有时完全显示在屏幕之外。有谁知道如何将帧大小设置为 iphone/ipad 即时消息使用的大小?
这是我在玩家输球时显示子视图的代码
func presentGameOverView() {
if firstTime == true {
let gameOverView = UIView()
gameOverView.frame = CGRectMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0, 200, 200) //should be center of screen
gameOverView.backgroundColor = UIColor.redColor()
playGameOverSound()
self.view?.addSubview(gameOverView)
firstTime = false
}
}
这是gameViewController.swift
的一部分
extension SKNode {
class func unarchiveFromFile(file : NSString) -> SKNode? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
// Configure the view.
let skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
//display banner Ads
//self.canDisplayBannerAds = true
skView.presentScene(scene)
}
}
如果 width
和 height
是 UIView
的尺寸,那么要使视图位于中心的原点将位于点
origin = (self.frame.size.width/2 - width/2, self.frame.size.height/2 - height/2)
所以gameOverView
帧应该是
let width : CGFloat = 200.0
let height : CGFloat = 200.0
gameOverView.frame = CGRectMake(self.frame.size.width/2 - width/2
, self.frame.size.height/2 - height/2, width, height)
要不使用 sks 文件,在 GameViewController
viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene(size:CGSizeMake(self.view.frame.width, self.view.frame.height))
let skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
您也可以只提取底层 SKView
的框架而不是 scene
的 frame
,然后执行此操作
if let viewFrame = self.view?.frame {
let width : CGFloat = 200.0
let height : CGFloat = 200.0
gameOverView.frame = CGRectMake(viewFrame.size.width/2 - width/2
, viewFrame.size.height/2 - height/2, width, height)
}
您好,我是 sprite kit 的新手,出于某种原因,当使用 self.frame.size.width 或 .height 在场景中定位按钮或子视图时,它们没有居中,而是有时完全显示在屏幕之外。有谁知道如何将帧大小设置为 iphone/ipad 即时消息使用的大小?
这是我在玩家输球时显示子视图的代码
func presentGameOverView() {
if firstTime == true {
let gameOverView = UIView()
gameOverView.frame = CGRectMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0, 200, 200) //should be center of screen
gameOverView.backgroundColor = UIColor.redColor()
playGameOverSound()
self.view?.addSubview(gameOverView)
firstTime = false
}
}
这是gameViewController.swift
的一部分extension SKNode {
class func unarchiveFromFile(file : NSString) -> SKNode? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
// Configure the view.
let skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
//display banner Ads
//self.canDisplayBannerAds = true
skView.presentScene(scene)
}
}
如果 width
和 height
是 UIView
的尺寸,那么要使视图位于中心的原点将位于点
origin = (self.frame.size.width/2 - width/2, self.frame.size.height/2 - height/2)
所以gameOverView
帧应该是
let width : CGFloat = 200.0
let height : CGFloat = 200.0
gameOverView.frame = CGRectMake(self.frame.size.width/2 - width/2
, self.frame.size.height/2 - height/2, width, height)
要不使用 sks 文件,在 GameViewController
viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene(size:CGSizeMake(self.view.frame.width, self.view.frame.height))
let skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
您也可以只提取底层 SKView
的框架而不是 scene
的 frame
,然后执行此操作
if let viewFrame = self.view?.frame {
let width : CGFloat = 200.0
let height : CGFloat = 200.0
gameOverView.frame = CGRectMake(viewFrame.size.width/2 - width/2
, viewFrame.size.height/2 - height/2, width, height)
}