Swift SpriteKit 获得可见的帧大小
Posted
技术标签:
【中文标题】Swift SpriteKit 获得可见的帧大小【英文标题】:Swift SpriteKit get visible frame size 【发布时间】:2015-05-27 02:27:50 【问题描述】:我一直在尝试使用 Swift 创建一个简单的 SpriteKit 应用程序。目的是让一个红球在点击时重新定位在屏幕上。但是变量 self.frame.width 和 self.frame.height 不返回可见屏幕的边界。相反,它们返回整个屏幕的边界。因为我随机选择球的位置,所以我需要可见的边界。经过数小时的研究后找不到答案。我怎样才能做到这一点?
var dot = SKSpriteNode()
let dotScreenHeightPercantage = 10.0
let frameMarginSize = 30.0
override func didMoveToView(view: SKView)
var dotTexture = SKTexture(imageNamed: "img/RedDot.png")
dot = SKSpriteNode(texture: dotTexture)
dot.size.height = CGFloat( Double(self.frame.height) / dotScreenHeightPercantage )
dot.size.width = dot.size.height
dot.name = "dot"
reCreateDot()
func reCreateDot()
dot.removeFromParent()
let dotRadius = Double(dot.size.height / 2)
let minX = Int(frameMarginSize + dotRadius)
let maxX = Int(Double(self.frame.width) - frameMarginSize - dotRadius)
let minY = Int(frameMarginSize + dotRadius)
let maxY = Int(Double(self.frame.height) - frameMarginSize - dotRadius)
let corX = randomInt(minX, max: maxX)
let corY = randomInt(minY, max: maxY)
println("result: \(corX) \(corY)")
dot.position = CGPoint(x: corX, y: corY)
self.addChild(dot)
func randomInt(min: Int, max:Int) -> Int
return min + Int(arc4random_uniform(UInt32(max - min + 1)))
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
for touch: AnyObject in touches
let location = touch.locationInNode(self)
let node = nodeAtPoint(location)
if node.name == "dot"
println("Dot tapped.")
reCreateDot()
【问题讨论】:
【参考方案1】:将这段代码添加到 GameViewController 似乎已经解决了这个问题。
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
skView.presentScene(scene)
感谢@ABakerSmith 为我指明了正确的方向。
【讨论】:
我可能是错的,但这不等同于将 scaleMode 设置为 .ResizeFill,它会自动将场景大小设置为视图大小吗?如果视图大小设置为与视图相同的大小,则 scaleMode 属性几乎变得多余,因为它的目的是控制场景如何缩放到视图,这仅在它们大小不同时才重要。即我怀疑如果您将缩放模式从 .AspectFill 更改为 .AspectFit,或者其他任何内容都不会产生任何影响。【参考方案2】:我尝试使用您的代码并设置场景的大小解决了这个问题。如果您要取消归档场景,其大小将是在 sks 文件中设置的大小。因此,您需要将场景的大小设置为您的 SKView 的大小。
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene
scene.size = skView.frame.size
skView.presentScene(scene)
或在您的SKScene
子类的didMoveToView
中:
override func didMoveToView(view: SKView)
super.didMoveToView(view)
self.size = view.frame.size
【讨论】:
以上是关于Swift SpriteKit 获得可见的帧大小的主要内容,如果未能解决你的问题,请参考以下文章
在更新函数中使用 spriteKit 增加 spriteNode 的大小(Swift)
过滤 SKSpriteNode 的最近邻居和所述节点的大小的困难(swift,spritekit)
SWIFT:如何以编程方式设置集合视图的帧大小,使其等于其父视图?
强制 Swift Playgrounds (xcode) 在不模拟 iOS 的情况下使用 MacOS SpriteKit