Swift SpriteKit edgeLoopFromRect 问题
Swift SpriteKit edgeLoopFromRect Issue
以下代码识别场景的 底部和顶部边缘 并且球按预期反弹。但是,场景的 左右边缘 始终被破坏。如果施加足够的力,球会离开屏幕,然后最终 returns 返回。就好像场景的边缘超出了iphone模拟器的边缘window.
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView){
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
backgroundColor = UIColor.cyanColor()
var ball = SKSpriteNode(imageNamed: "ball")
ball.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
self.addChild(ball)
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.height/2)
let push = CGVectorMake(10, 10)
ball.physicsBody.applyImpulse(push)
}
}
我认为它与 .sks 文件有关,因为尺寸是在那里设置的,如果我改变这些尺寸,它会反映在游戏中。任何人都知道如何使这行代码优先于 .sks 文件尺寸?这样它将是动态的并且可以在不同的设备上工作。
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
我在这里发现了同样的问题,但从未得到回答:
Swift physicsbody edge recognition issue
此外,我是 iOS app dev 和 swift 的新手,如果答案很明显但我错过了,请原谅我。
关于 .sks 文件,您可能是在正确的轨道上。从 .sks 文件加载场景时,默认大小为 1024x768。现在您可以根据视图大小动态设置它。因此,像这样将 viewDidLoad 与 viewWillLayoutSubviews 交换:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if let scene = GameScene(fileNamed:"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
//Because viewWillLayoutSubviews might be called multiple times, check if scene is already initialized
if(skView.scene == nil){
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
skView.presentScene(scene)
}
}
}
SO 上有很多关于 differences between viewDidLoad and viewWillLayoutSubviews 的帖子,所以我将在我的回答中跳过它。
希望对您有所帮助。
以下代码识别场景的 底部和顶部边缘 并且球按预期反弹。但是,场景的 左右边缘 始终被破坏。如果施加足够的力,球会离开屏幕,然后最终 returns 返回。就好像场景的边缘超出了iphone模拟器的边缘window.
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView){
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
backgroundColor = UIColor.cyanColor()
var ball = SKSpriteNode(imageNamed: "ball")
ball.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
self.addChild(ball)
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.height/2)
let push = CGVectorMake(10, 10)
ball.physicsBody.applyImpulse(push)
}
}
我认为它与 .sks 文件有关,因为尺寸是在那里设置的,如果我改变这些尺寸,它会反映在游戏中。任何人都知道如何使这行代码优先于 .sks 文件尺寸?这样它将是动态的并且可以在不同的设备上工作。
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
我在这里发现了同样的问题,但从未得到回答: Swift physicsbody edge recognition issue
此外,我是 iOS app dev 和 swift 的新手,如果答案很明显但我错过了,请原谅我。
关于 .sks 文件,您可能是在正确的轨道上。从 .sks 文件加载场景时,默认大小为 1024x768。现在您可以根据视图大小动态设置它。因此,像这样将 viewDidLoad 与 viewWillLayoutSubviews 交换:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if let scene = GameScene(fileNamed:"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
//Because viewWillLayoutSubviews might be called multiple times, check if scene is already initialized
if(skView.scene == nil){
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
skView.presentScene(scene)
}
}
}
SO 上有很多关于 differences between viewDidLoad and viewWillLayoutSubviews 的帖子,所以我将在我的回答中跳过它。
希望对您有所帮助。