我正在使用xCode开发基于SpriteKit / Swift的iOS游戏,目前正在尝试制作动画。
我创建了一个类PlayerSprite
作为SKSpriteNode
的子类,并定义了一种方法moveRight
并执行以下操作:
run(
SKAction.moveBy(x: 32.0, y: 0.0, duration: 0.25), completion: {
debugPrint("Action completed.")
}
)
只有PlayerSprite
类的一个播放器实例属于节点树(SKScene-> SKTileMap-> PlayerSprite)。关键是,上述动作无法可靠执行:
这适用于模拟器以及在连接的iPhone上启动应用程序。停止应用程序是指在xCode中按下停止按钮,然后从xCode重新开始运行。
更新循环是SKScene
子类(在本例中为LevelSceneView
)的一部分,看起来像这样(到目前为止一直在玩):
override func update(_ currentTime: TimeInterval) {
debugPrint("Update called")
if !player.hasActions() {
player.moveRight()
}
}
正确调用了更新循环,但未执行操作(根据日志控制台)。
有人经历过这种行为吗?任何想法将不胜感激。我希望我已经充分描述了这个问题。如有任何疑问,请随时提出。
答案 0 :(得分:0)
您的动画在哪里?
如果它在didMove
函数中,则仅在加载/加载应用程序时,您的操作才会运行。
我认为问题可能是当您停止应用程序时,它将在手机内存中保留一段时间。
这可能会导致问题,我建议不要在可能的情况下在didMove
函数中放置任何类型的动作。
答案 1 :(得分:0)
我使用SKSpriteNode的简单子类,但没有发现问题。也许您可以从这里重新启动。
class MySpriteNode: SKSpriteNode {
func moveRight(){
run(
SKAction.moveBy(x: 3, y: 0.0, duration: 0.25), completion: {
debugPrint("Action completed.")
}
)
}
}
import SpriteKit
import GameplayKit
class GameScene: SKScene {
// private var label : SKLabelNode?
// private var spinnyNode : SKShapeNode?
private var myNode : MySpriteNode?
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
debugPrint("Update called")
if !(myNode?.hasActions())! {
myNode?.moveRight()
}
}
override func didMove(to view: SKView) {
myNode = MySpriteNode.init(texture: nil, color: UIColor.red, size: CGSize.init(width: 200, height: 200))
self.addChild(myNode!)
}}
答案 2 :(得分:0)
因此,如果我理解正确,动画是否总是会运行?前一段时间,我确实使用xCode 9遇到了这样的问题。我解决该问题的方法是切换场景的isPaused属性。因此,在更新调用结束时,我有两行代码如下:
self.isPaused = true
self.isPaused = false
这样,每次调用update()时,都会先暂停然后暂停。从那时起,我就一直没有运行动画的问题。希望这有助于解决问题。