[英]In Sprite Kit, when I am spawning nodes, why do they all appear on the top right of the screen?
[英]Nodes Spawning off of screen in sprite kit swift
我正在快速開發iOS游戲,但遇到了一些問題。 我正在嘗試從屏幕頂部生成球,並使它們落到地面上。 它們應該具有隨機的x值並以隨機的速率下降,但不是在屏幕上生成節點,而是在屏幕未包含的x值上生成節點。 請幫助我,因為我認為我做對了所有事情。 這是我的addball函數的代碼...
func addBall(){
//create ball sprite
var ball = SKSpriteNode(imageNamed: "ball.png")
//create physics for ball
ball.physicsBody = SKPhysicsBody(rectangleOfSize: ball.size) // 1
ball.physicsBody?.dynamic = true // 2
ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball // 3
ball.physicsBody?.contactTestBitMask = PhysicsCategory.Person & PhysicsCategory.Ground
ball.physicsBody?.collisionBitMask = PhysicsCategory.None // 5
//generate random postion along x axis for ball to spawn
let actualX = random(min:ball.frame.size.width/2+1, max: self.frame.size.width - ball.frame.size.width/2-1)
println(actualX)
//set balls positon
ball.position = CGPoint(x: actualX, y: size.height - ball.size.width/2)
//add ball to scene
addChild(ball)
//determine speed of ball
let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
//create movement actions
let actionMove = SKAction.moveTo(CGPoint(x:actualX, y: -ball.size.width/2), duration: NSTimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
ball.runAction(SKAction.sequence([actionMove, actionMoveDone]), withKey: "action")
}
這是我的隨機函數的代碼
func random() -> CGFloat {
return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func random(#min: CGFloat, max: CGFloat) -> CGFloat {
return random() * (max - min) + min
}
這里的問題是您的SKScene可能比設備的屏幕占用更多的空間。 因此,當您使用整個場景計算隨機值時,有時球會在您看不見的場景區域中生成。
控制場景大小的兩個主要屬性是其size
和scaleMode
屬性。 scaleMode
屬性與場景的映射方式有關。 除非您自己初始化並演示了此場景,否則可以在視圖控制器中檢查scaleMode
。 根據Apple的aspectFill
,它可能會設置為aspectFill
:
計算每個尺寸的比例因子,然后選擇兩者中較大的一個。 場景的每個軸均以相同的縮放因子縮放。 這樣可以確保填充整個視圖區域,但可能會導致部分場景被裁剪。
如果您不喜歡這樣,還有其他的scaleModes。 但是,在大多數情況下,此模式實際上是可取的,因為SpriteKit的內部縮放能夠制作通用應用程序。 如果這對您來說很好,那么最簡單的事情就是為諸如球節點的生成位置之類的東西設置硬編碼值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.