首页 文章

在空闲时,SKScene 变得反应迟钝

提问于
浏览
1

你好,我有一个 SceneKit 游戏。所有游戏都在一个场景中,当游戏结束时,精灵套件覆盖作为屏幕上的游戏,当他们再次点击游戏时,精灵套件标签消失,游戏重置在同一场景中。

我的签发即将结束。如果用户在几秒钟内点击重播按钮,那么一切顺利。但是如果用户在场上坐了超过五秒钟,那么场景会冻结。我真的很困惑,因为应用程序在冻结时闲置,我没有收到任何错误。此外,游戏期间的内存和 CPU 使用率远低于游戏期间的内存和 CPU 使用率。此外,该应用程序本身并未冻结,就像我单击菜单按钮它转换到一个新的视图控制器就好了。

没有内存泄漏或错误我真的不知道从哪里开始寻找什么错误?有人能指出我正确的方向

更多关于最新情况的见解:游戏是一个使用物理模拟的短半分钟动作游戏。有一个计时器设置为每隔_1 秒触发一次,影响游戏。当游戏结束时(由一个节点与另一个节点碰撞引起),玩家节点被移除,变量被设置为假,这样当游戏计时器触发时没有任何反应,并且在 sprit 工具包覆盖中创建了一堆标签节点充当菜单上的游戏。

如果用户在 fivish 秒内点击重播,一切都会很好。单击重播会隐藏所有标签,在起始位置创建玩家节点,并将计时器变量设置为 true。

这是设置场景的代码

// create a new scene
scene = SCNScene()
sceneView = SCNView()
sceneView.frame = self.view.frame
sceneView.autoresizingMask = UIViewAutoresizing.allZeros
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = false
sceneView.allowsCameraControl = false
sceneView.showsStatistics = false
sceneView.backgroundColor = UIColor.blackColor()
scene.physicsWorld.gravity = SCNVector3Make(0, -30, 0)
scene.physicsWorld.contactDelegate = self
self.view = sceneView
self.MarbleGeo = SCNSphere(radius: 1.3)
hud = Hud(size: self.view.frame.size, game: self)
sceneView.overlaySKScene = hud

编辑

我找到了代码崩溃的地方。单击再次按钮时,所有标签都应该移动或淡出或沿着这些线条产生一些影响。无论如何,重启游戏的方法调用是完成其中一个效果的最后一个。这是代码

println("Before check")
MenuLabel.runAction(moveButtonsOut, completion: { () -> Void in
    self.scoreLabel.removeFromParent()
    self.MyGame.Setup()
    self.MyGame.Restart(true, Level: self.MyGame.level)
    self.startTimer()
    println("should have called the game to begin by now")
    //self.playing = true
    //self.MyGame.addMarble()
})

记录第一个语句,但完成块内部的语句不记录。所以我想我的问题现在改变为什么这些动作一旦游戏冻结就不会运行和完成?

编辑

似乎 SKActions 正在被踢出局。虽然在场景中的游戏中,一些标签正在一次又一次地扩大和缩小,一些标签逐渐淡出和不亮。无论如何,当所有这一切都在重播按钮上工作很好,没有错误。当所有这些操作冻结时,按钮不再起作用,因为重启方法永远不会在完成时被调用。我尝试将重启方法放在完成之外,并且当它们被调用所有操作时因为解冻而且它们都急于完成它看起来很糟糕。所以总结一些事情就是暂停 SKActions

希望这可以帮助。

1 回答

  • 0

    你的 SceneKit 场景在玩吗?当你有一个场景正在播放

    • scene.playing = YES

    • SCNAction实例正在运行

    • 隐式或显式动画运行

    仅当 SceneKit 场景为时,SpriteKit 场景叠加才会刷新。因此,如果 SceneKit 场景未重新显示,则叠加中设置的操作可能无法运行。

    解决方案可能是设置playing属性或向 SceneKit 对象添加操作而不是 SpriteKit 对象。

    这是无关的,但试图远离计时器。 SceneKit 提供了几个游戏循环回调,可以让你做你想做的事情。

相关问题