[英]How do SKAction durations work in relation to frame rates?
我试图了解SKActions的工作方式。 特别是对于SKAction.runAction()
,参数之一是动画的持续时间。 但是,无论我输入什么作为持续时间,动画都会渲染每一帧。 我试图将SKAction.runAction()
行放在其他位置,但它似乎仅在SKScene
的update()
覆盖方法中SKScene
。 我已经尝试过SKAction.repeatActionForever
,但这似乎无法与其他进程并行运行。
我的问题是,如果动画的持续时间是否需要一个参数,那么将在SKAction.runAction()
放置SKAction.runAction()
方法以根据给定的持续时间而不是帧速率运行动画?
这是我的代码:
GameScene.swift(Player类是Character类的子类。请参见下面的代码。)
let player = Player()
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
//Code here to recognize user inputs
scene?.addChild(player.sprite)
}
override func update(currentTime: CFTimeInterval) {
player.sprite.runAction(SKAction.runBlock(player.move))
}
}
CharachterClass.swift move()函数
func move(){
switch(direction){
case "up":
sprite.position = CGPoint(x: sprite.position.x, y: sprite.position.y + speed)
case "down":
sprite.position = CGPoint(x: sprite.position.x, y: sprite.position.y - speed)
case "right":
sprite.position = CGPoint(x: sprite.position.x + speed, y: sprite.position.y)
case "left":
sprite.position = CGPoint(x: sprite.position.x - speed, y: sprite.position.y)
default:
break
}
SKAction.moveTo(sprite.position, duration: 1)
}
注意: direction
变量是精灵移动的方向,而speed
变量是每次运行SKAction
时精灵应移动的像素数。
我不知道您打算怎么做:
override func update(currentTime: CFTimeInterval) {
player.sprite.runAction(SKAction.runBlock(player.move))
}
但实际上,您可以简单地执行以下操作:
override func update(currentTime: CFTimeInterval) {
player.move()
}
两种方法之间的区别是runAction
将调度块执行,并且取决于调度发生的时间,它可能不在当前帧(更新周期)中运行,而是在下一帧中运行。 因此,运行块解决方案很可能会引入1帧延迟。
接下来,这将在1秒( 而不是 1帧)的时间内运行一次移动动作:
SKAction.moveTo(sprite.position, duration: 1)
由于您在每种更新方法中都运行此程序,因此实际上可以使SKAction的主要目的无效(也就是无效): 在给定的时间 (持续时间)内运行任务 。
更糟糕的是,您每帧运行一个新的移动动作,因此在1秒钟的时间内,您可能会累积约60个同时运行的移动动作,并且行为未定义。
如果要使用“ key”参数调用runAction,则至少可以阻止操作堆叠,但这仍然是毫无意义的,因为在应该运行1秒钟的时间内替换每个帧中的操作就意味着它将具有效果不大,如果有的话。
巧合的是,通过现在设置代码的方式,您也可以直接将其分配给位置...但是...等等,您已经这样做了:
sprite.position = CGPoint(x: sprite.position.x - speed, y: sprite.position.y)
但是之后立即运行以下移动操作:
SKAction.moveTo(sprite.position, duration: 1)
因此,总而言之,您尝试在1秒钟的时间内运行一项操作,最终每帧被替换一次(每秒60次),而该操作却没有任何作用。 它不会做任何事情,因为您已经将精灵设置为了一个位置,然后将其传递给移动动作作为所需的目标位置。 但是精灵已经在那个位置上了,没有动作可做。 一秒钟-也许它可能会提前退出,这取决于我们不知道的SK实施细节。
无论您怎么看,此移动动作都经过了精心设计,没有效果。 我建议您(重新)阅读《 SK编程指南》中的动作文章,以更好地了解时间安排和其他动作行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.