繁体   English   中英

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

[英]How do SKAction durations work in relation to frame rates?

我试图了解SKActions的工作方式。 特别是对于SKAction.runAction() ,参数之一是动画的持续时间。 但是,无论我输入什么作为持续时间,动画都会渲染每一帧。 我试图将SKAction.runAction()行放在其他位置,但它似乎仅在SKSceneupdate()覆盖方法中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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM