Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SKAction持续时间如何与帧速率相关?_Ios_Swift_Sprite Kit_Skaction - Fatal编程技术网

Ios SKAction持续时间如何与帧速率相关?

Ios SKAction持续时间如何与帧速率相关?,ios,swift,sprite-kit,skaction,Ios,Swift,Sprite Kit,Skaction,我试图了解SKActions是如何工作的。特别是对于SKAction.runAction(),其中一个参数是动画的持续时间。然而,无论我输入什么作为持续时间,动画都会渲染每一帧。我曾尝试将SKAction.runAction()行放在其他位置,但它似乎只在SKScene中的update()覆盖方法中起作用。我已经尝试了SKAction.repeatActionForever,但它似乎无法与其他进程并行运行 我的问题是,如果动画的持续时间有一个必需的参数,那么应该将SKAction.runActi

我试图了解SKActions是如何工作的。特别是对于
SKAction.runAction()
,其中一个参数是动画的持续时间。然而,无论我输入什么作为持续时间,动画都会渲染每一帧。我曾尝试将
SKAction.runAction()
行放在其他位置,但它似乎只在
SKScene
中的
update()
覆盖方法中起作用。我已经尝试了
SKAction.repeatActionForever
,但它似乎无法与其他进程并行运行

我的问题是,如果动画的持续时间有一个必需的参数,那么应该将
SKAction.runAction()
方法放在哪里,以便根据给定的持续时间而不是帧速率运行动画

这是我的代码:

GameSecene.swift(玩家类是角色类的一个子类。请参阅下面的代码。)

CharachterClass.swift move()函数


注意:
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的主要目的无效:在给定的时间(持续时间)内运行任务

更糟糕的是,您每帧运行一个新的移动动作,因此在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实现细节

不管你怎么看,这个移动动作都是过度设计的,并且没有效果。我建议您(重新)阅读,以更好地了解时间安排和其他行动行为

SKAction.moveTo(sprite.position, duration: 1)
sprite.position = CGPoint(x: sprite.position.x - speed, y: sprite.position.y)
SKAction.moveTo(sprite.position, duration: 1)