Project1

标题: 请问一下RMMV JS如何等待一定帧数后再执行后面的逻辑 [打印本页]

作者: p965060457    时间: 2024-1-30 21:19
标题: 请问一下RMMV JS如何等待一定帧数后再执行后面的逻辑
我的战斗逻辑是在一个while(){}中,不想修改官方的update

目前我是可以使用requestAnimationFrame这个函数让它缓慢更新动画(而不是直接看到最后状态)

frames = 500;
frameCount = 0;
update = function () {
  frameCount++;
  if (frameCount <= frames) {
    movingobject.sprite.x -= 1;
    requestAnimationFrame(update);
  }
};
update();
x();

问题是,update()仅仅只是加个队列,会马上进行x()
我希望动画播放完毕后,再进行x()

(或者大神们不用requestAnimationFrame,有直接让它暂停一些时间,一步一步播放移动的方法也可以)

作者: p965060457    时间: 2024-1-30 21:25
我倒是问GPT问出个方法

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function BattleProcess() {

movingobject.sprite.x -= 10;
      await sleep(1000);
movingobject.sprite.x -= 10;
      await sleep(1000);
movingobject.sprite.x -= 10;
      await sleep(1000);
}

这样好像暂时解决我的问题了。
但这样编程是好的么?
算了不管了我觉得好像还可以
作者: shiroin    时间: 2024-1-30 22:23
我不是JS语言专业的,只能凭经验回答下

setTimeout()方法会受到单线程运行和异步处理的限制,处理复杂任务的环境下会受到排队的影响,它这个计时器就不是非常精准可能产生延迟,和编辑器自带的wait()方法(也就是常规的等待帧指令)是不一样的

如果你只是为了播放自定义的动画,其实有现成的插件可以用的,比如Drill_AnimationGif或者Drill_BattleGif,YEP_PictureSpritesheets也可以用于战斗场景中
作者: rfvtgbzxc    时间: 2024-1-31 14:56
  1. frames = 500;
  2. frameCount = 0;
  3. update = function () {
  4.   frameCount++;
  5.   if (frameCount <= frames) {
  6.     movingobject.sprite.x -= 1;
  7.     requestAnimationFrame(update);
  8.   }
  9.   else{
  10.    x();
  11. }
  12. };
  13. update();
复制代码

这样就可以在最后一帧做x()了。具体细节需要楼主去了解一下异步的一些机制,以及函数的闭包原则,这样可以理解update函数每次执行时,frameCount,frames,x()是怎样的状态。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1