Swift SpriteKit 出现场景错误
Posted
技术标签:
【中文标题】Swift SpriteKit 出现场景错误【英文标题】:Swift SpriteKit presentScene error 【发布时间】:2016-06-04 04:40:25 【问题描述】:我正在尝试制作一个小行星类型的游戏,每次小行星与玩家相撞时,结束场景加载正常,当我尝试重新启动它时剪切,就像代码卡在循环调用结束场景的碰撞函数一样。这里是碰撞函数
func didBeginContact(contact: SKPhysicsContact)
print("5")
//Creating a variable that holds which two items collide
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
//Creating a switch case statement
//This will run a different case depending on whitch two objects collide
switch(contactMask)
//If the satellite and the asteroid collide do this
case bitMask.satellite.rawValue | bitMask.asteroid.rawValue:
//removing the satellite
let secondNode = contact.bodyB.node
secondNode?.physicsBody?.allowsRotation = true
let firstNode = contact.bodyA.node
firstNode?.removeFromParent()
//Stopping the mission timer
removeActionForKey("missionDurationTime")
self.removeAllChildren()
print("6")
self.view?.presentScene(EndScene())
print("7")
default:
return
这是从我的结束场景回到我的游戏场景的函数
func Restart()
print("hello")
RestartBtn.removeFromSuperview()
speach.removeFromSuperview()
score.removeFromSuperview()
gameOver.removeFromSuperview()
self.view?.presentScene(GameScene())
在我点击重启按钮后,EndScene 中的所有标签都按原样消失了,但随后屏幕为空白,控制台仅打印 `5 6 7 在结束场景中的标签回来之前,数不胜数。我很困惑,不知所措。非常感谢任何帮助!
更新:
我把重启按钮里的代码改成了这个
print("hello")
RestartBtn.removeFromSuperview()
speach.removeFromSuperview()
score.removeFromSuperview()
gameOver.removeFromSuperview()
let scene = GameScene(size: self.view!.bounds.size)
scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1)
scene.scaleMode = .AspectFill
scene.backgroundColor = UIColor.whiteColor()
let transition = SKTransition.pushWithDirection(SKTransitionDirection.Left, duration:0.5)
self.scene?.view?.presentScene(scene, transition: transition)
现在游戏场景加载完毕,一切正常,只是一切都大了五倍。这应该是这样的: What it should look like
这就是它的样子 What it does look like
【问题讨论】:
应用启动时如何调用第一个场景(gameView 控制器中的代码)?您能否将该代码放入您的问题中。在您当前的重新启动代码中,您关心使用视图边界作为其大小来初始化 GameScene。执行此操作时,下面的缩放模式第 2 行将不起作用,因为您不再缩放场景。我假设您在加载游戏和重新启动游戏时调整场景的大小不同,因此看起来不同。 我只是在使用 Xcode 为您提供的游戏视图控制器中的代码,如果这有意义的话。我现在无法发布确切的代码我不在我的 Mac 上。 我添加了一个答案。告诉我进展如何。 【参考方案1】:在您重新启动代码时,您正在初始化具有 view.bounds 大小的 GameScene。
如果您没有更改 GameViewController 代码,则默认情况下您使用 GameScene.sks 文件作为参考(视觉关卡编辑器),默认场景大小为 1024*768,缩放模式为 .AspectFill。
简而言之,在你的重启功能中试试这个
if let scene = GameScene(fileNamed: "GameScene") // fileNamed is the GameScene.sks file
scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1)
....
或者
let scene = GameScene(size: CGSize(width: 1024, height: 768)
scene.backgroundColor ....
【讨论】:
这适用于所有屏幕尺寸吗?现在不能尝试,只是提前考虑 是的,使用 aspectFill 是大多数情况下的最佳解决方案,这取决于您在做什么。通常的想法是,您将游戏中的东西放在中心位置,并且在 iPad 上运行时在侧面/顶部/底部留出一些额外的空间(在您的情况下只是更多的空间背景)。看看这个blog.infinitecortex.com/2014/01/… 它想让我在每个 scene.thing 后面加上逗号,然后它说变量在它自己的初始值中使用 太棒了。祝您编码愉快,如果您这么友善,请您标记为已回答。以上是关于Swift SpriteKit 出现场景错误的主要内容,如果未能解决你的问题,请参考以下文章
SpriteKit 在转换到新场景时收到有关 UIElements 的错误
Swift,SpriteKit:释放游戏场景并重新分配新场景
Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan