如何使用 requestAnimationFrame 循环播放多个方块的动画

2023-11-30

我正在使用 HTML 画布绘制多个正方形。我有 2 个函数:1)绘制一个正方形,2)在循环内绘制多个正方形。

现在我想使用这些方块来制作动画请求动画帧一次绘制一个正方形。我怎样才能做到这一点。这里有一个jsFiddle

var canvas = document.getElementById('canvas'),
       ctx = canvas.getContext('2d');

    function rect(x, y, w, h) {
      ctx.beginPath();
      ctx.rect(x, y, w, h);
      ctx.stroke();
    }

    function drawRect(number, size) {
      for (var i = 0; i <= number; i++) {
        rect(i * size, i * size, (i * size) * 2, (i * size) * 2);
      }
    }

    drawRect(10, 5);

我提供了帧限制器和补间来向您展示不同的动画方式。帧限制器具有示例中的步骤,补间具有在给定时间内完成所需的尽可能多的步骤。

var canvas = document.getElementById('canvas'),
  ctx = canvas.getContext('2d');

//requestAnim shim layer by Paul Irish
//http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
window.requestAnimFrame = (function() {
  return window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    function( /* function */ callback, /* DOMElement */ element) {
      window.setTimeout(callback, 1000 / 60);
    };
})();

function rect(x, y, w, h, color) {
  ctx.beginPath();
  ctx.strokeStyle = color;
  ctx.rect(x, y, w, h);
  ctx.stroke();
}

function drawRect(i, size, color) {
  //for (var i = 0; i <= number; i++) {
  rect(i * size, i * size, (i * size) * 2, (i * size) * 2, color);
  //}
}

var i = 0;
var incr = 1;
var i_max = 10;
var size = 5;
var fps = 10;
var delay = 1000 / fps;
var lastFrame = 0;

var animationTime = 5000
var tweenStep = i_max / ((animationTime/1000) * 60);
var j = 0;

function animateRect() {

  // draw at 60fps
  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
  drawRect(i, size, "#0000FF");
  
  // This is a frame limiter.
  var currentFrame = Date.now();
  
  if ((currentFrame - lastFrame) >= delay) {
    i += incr;
    if (i >= i_max) i = i_max - 2, incr = -1;
    if (i < 0) i = 1, incr = 1;
    lastFrame = currentFrame;
  }
  
  // this is a tween. The step is calculated for the desired time.
  drawRect(j, size, "#FF0000");
  j += tweenStep;
  if (j >= i_max) tweenStep *= -1,j=i_max-1;
  if (j < 0) tweenStep *= -1, j=0;
  

  requestAnimFrame(animateRect);
  //draw rectangle one by one here...
}

animateRect();
//drawRect(10, 5);
<canvas id="canvas" width="600" height="600"></canvas>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 requestAnimationFrame 循环播放多个方块的动画 的相关文章

随机推荐

  • 使用 mbox Python 模块解码并访问 mbox 文件

    我需要将电子邮件数据库迁移到 CRM 但有两个问题 我可以访问 mbox 文件 但内容未正确解码 我想创建一个类似数据框的结构 其中包含以下列 日期 发件人 收件人 主题 正文 我已经尝试过以下方法 for i message in enu
  • Java 中整数到字节的转换

    在Java中我们可以做 byte b 5 但是为什么我们不能将相同的参数传递给接受的函数byte myObject testByte 5 public void testByte byte b System out println Its
  • RESTEasy - 动态添加资源类

    通过 RESTEasy 我实现了 Application 的子类来提供单例资源列表 有没有办法稍后动态添加另一个单例 我还没有从 API 文档中找到实现这一点的方法 我自己没有尝试过 但我找到了一篇博客文章 其中描述了这一点 http sa
  • 在 fltk 窗口内绘制 gnuplot 图形

    我正在编写一个程序 它使用用 fltk 打开的窗口绘制 3D 对象 虽然我真的想在同一个窗口 除了 3D 对象 中添加一些 gnuplot 的图形 因为它们比 OpenGl 的图形更漂亮 那可能吗 我正在致力于模拟对象的运动并用 OpenG
  • 通过进程名称取消隐藏进程?

    前段时间我写了一段代码来隐藏 恢复进程窗口 我所做的是这样的 隐藏进程 1 在正在运行的进程中查找进程名 2 将 MainWindowHandle 添加到容器 在本例中为字典 这对于稍后取消隐藏该进程是必要的 3 使用ShowWindow
  • 如何获取视频的最后一帧?

    我想要视频的最后一帧 我的代码如下所示 let asset AVURLAsset AVURLAsset URL videoURL options nil let generate AVAssetImageGenerator AVAssetI
  • 如果文件已经打开,fopen 是否返回 NULL 指针?

    我当时假设fopen回报NULL指针 如果文件已打开 但看起来fopen不返回NULL如果文件已在以下位置打开 w 模式 下面是我用来尝试此操作的代码 但没有收到任何错误 我尝试使用 mingw32 以及 TDM GCC 64 编译器 如果
  • MVC2:是否有用于原始 Html 的 Html Helper?

    是否有一个 Html 助手可以简单地接受并返回原始 html 而不是做这样丑陋的事情 h2 Results h2 我想做这样的事情 虽然不是很干净 但我认为这是一个进步 存在这样的东西吗 或者是否有比使用 Html 助手更好的替代方法来从这
  • Mysql问题:没有mysql.sock

    昨天我正在使用安装在我的计算机上的 MySQL 进行工作 我下载了xampp 所以我改变了my cnf文件到套接字的路径 opt lampp var mysql mysql sock 该文件就在那里 今天我想继续处理它 我发现该文件不再存在
  • 选择所有行及其在单个查询中的计数

    我有一些名为 items 的表 想要从中获取一些行并在单个查询中计数 全部 现在我正在尝试这样的操作 SELECT COUNT as count SELECT FROM items WHERE as items FROM items 但我得
  • NSDictionary 对象中的非字符串键?

    我已经使用 Foundation 框架中的 NSJSONSerialization 解析了一些 JSON 数据 但是 我得到了 NSDictionary 组的奇怪密钥 如下所示 stop times departure time 5 48a
  • 为什么 SymGetSymFromAddr64 不工作?它返回错误代码 126

    我正在尝试使用以下代码捕获异常的堆栈跟踪 include stdafx h include
  • nls——收敛误差

    对于这个数据集 dat structure list x c 5L 5L 5L 5L 10L 10L 10L 10L 15L 15L 15L 15L 17L 17L 17L 17L 20L 20L 20L 20L 20L 20L 20L 2
  • 如何根据 pandas 中另一行的值组合一行中的值

    我有一个带有几列的 pandas 数据框 单词 开始时间 停止时间 扬声器 我想合并 word 列中的所有值 而 speaker 列中的值不变 此外 我想保留组合中第一个单词的 开始 值和最后一个单词的 停止 值 我目前有 word sta
  • 如何通过比较两个现有变更日志文件来生成变更日志文件

    我正在使用 Liquibase 工具来维护 MySQL 服务器中数据库的版本 在这里 我为数据库生成changeLogFile 一星期后 我想将现有的changeLogFile 与相同的数据库进行比较 在这里 我需要获取上周数据库中进行的更
  • ussd的设计模式建议[重复]

    这个问题在这里已经有答案了 我在用着php创建 USSD 页面 我以前做过这件事 而且这是一项时间有限的黑客工作 基本上是一个巨大的文件 其中包含手机用户可能处于的所有可能状态的 switch 语句 然后将其保存在数据库中并在下一个 USS
  • 使用cowplot将x和y laaxis标签添加到ggplot-grid构建中

    我用cowplot制作了一个网格 library ggplot2 library cowplot ggg1 lt ggplot mtcars aes mpg vs geom point theme axis title x element
  • 使用 Conda 创建像 Anaconda 这样的自定义安装程序

    我正在尝试封装我的 python 环境 以便它可以在不同的机器上使用 为此 我确实使用了 pipelinev 它工作得很好 现在我发现了 Anaconda 我发现这个想法很棒 你可以下载安装程序 pkg 或 win 安装程序 它会手动完成你
  • 驱动程序信息:driver.version:ChromeDriver 未知 使用 Selenium 和 Python 的 Chrome

    当我使用 chrome 驱动程序时 显示驱动程序服务器启动超时 当我尝试使用 Firefox 时 它显示会话意外退出 我正在尝试使用 python 中的 selenium 在服务器上运行远程驱动程序 我应该怎么办 无法创建新会话 未知错误
  • 如何使用 requestAnimationFrame 循环播放多个方块的动画

    我正在使用 HTML 画布绘制多个正方形 我有 2 个函数 1 绘制一个正方形 2 在循环内绘制多个正方形 现在我想使用这些方块来制作动画请求动画帧一次绘制一个正方形 我怎样才能做到这一点 这里有一个jsFiddle var canvas