在渲染 JS canvas 之前加载图像

2023-12-10

我正在编写一个简单的游戏来学习 JS,并且在此过程中我正在学习 HTML5,所以我需要在画布上绘制东西。

这是代码:

 let paddle = new Paddle(GAME_WIDTH,GAME_HEIGHT);

 new InputHandler(paddle);

 let lastTime = 0;

 const ball = new Image();
 ball.src = 'assets/ball.png';

 function gameLoop(timeStamp){
   let dt = timeStamp - lastTime;
   lastTime = timeStamp;

   ctx.clearRect(0,0,600,600);
   paddle.update(dt);
   paddle.draw(ctx);

   ball.onload = () => {
    ctx.drawImage(ball,20,20);
  }

  window.requestAnimationFrame(gameLoop);
 }

gameLoop();

截图:无球评论前

现在我注释掉了clearRect():

评论后

你好球。

画布底部还有一个桨,似乎不受clearRect()方法。它工作得很好。我在这里缺少什么?


放置图像没有多大意义onload游戏循环内的处理程序。这意味着游戏必须在图像之前开始运行onload设置了函数,导致了一个相当混乱的情况。

正确的顺序是设置onload处理程序,然后是图像源,然后await所有图像onloads 在运行游戏循环之前触发。将主循环设置为onload当您只有一张图像时,直接使用非常容易,但对于具有多个资产的游戏,这很快就会变得尴尬。

以下是如何使用加载许多游戏资源的最小示例Promise.all。很可能,您希望将加载的图像解压缩为更具描述性的对象而不是数组,但这只是一个开始。

const canvas = document.createElement("canvas");
document.body.appendChild(canvas);
canvas.width = 400;
canvas.height = 250;
const ctx = canvas.getContext("2d");

const assets = [
  "http://placekitten.com/120/100",
  "http://placekitten.com/120/120",
  "http://placekitten.com/120/140",
];
const assetsLoaded = assets.map(url =>
  new Promise(resolve => {
    const img = new Image();
    img.onerror = e => reject(`${url} failed to load`);
    img.onload = e => resolve(img);
    img.src = url;
  })
);

Promise
  .all(assetsLoaded)
  .then(images => {
    (function gameLoop() {
      requestAnimationFrame(gameLoop);
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      images.forEach((e, i) =>
        ctx.drawImage(
          e, 
          i * 120, // x
          Math.sin(Date.now() * 0.005) * 20 + 40 // y
        )
      );
    })();
  })
  .catch(err => console.error(err))
;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在渲染 JS canvas 之前加载图像 的相关文章

  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • 光标:IE 8 和 9 中的自动行为

    我想要的是为整个正文标记指定cursor pointer 这样页面的背景是可点击的 但我也希望页面的其余部分像以前一样工作 所以我尝试为div设置cursor auto 其中包含这一页 在 FF Chrome 和 safari 中 它工作得
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 使用 jquery 更改锚文本和图标

    我有一个隐藏或显示 div 的锚标记 但我无法更改它的文本和图标 如何更改文本和图标标签 因为目前它将图标标签解析为常规文本 锚标记 a class collapse info btn i class icon arrow up icon
  • 处理时区转换的 JavaScript 库

    是否有一个 JavaScript 库可以处理时区转换 并考虑 DST 规则和此类内容 我知道有类似的问题 但我见过的问题似乎都没有真正适合我的问题的答案 我想在时区 A 创建一个日期并能够对其进行操作 添加天数 小时等 然后将其转换为另一个
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • HTML/CSS:页面左侧的导航栏

    我发现创建这样具有良好语义的布局很尴尬 左侧是大约 150 像素宽的列 其中包含导航元素 我想将网站这部分的 HTML 放在 HTML 代码的开头 然后有一个简单的方法来强制页面的其余部分不侵占左侧的区域 150 像素列 我考虑过一些选择
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • 如果突出显示一个单词并且用户单击连接单词,则同时突出显示两个单词

    我最近发布了一个question https stackoverflow com questions 34963610 how can i highlight a word term quicker and smarter寻求一种更智能地突
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • 如何使用 API 中的数据填充选择的下拉元素 - ReactJS

    我对 React 还很陌生 我正在从 API 获取数据 当我检查控制台日志时可以看到数据 但是我不知道如何使用 map 创建一个新数组 然后选项元素可以使用该数组来显示货币代码 目前它填充下拉列表 但选项元素全部为空 结果显示为 NaN 下
  • 将 div 附加到另一个 div 的右侧

    我有一个 div 它就像一个容器 里面有 2 个图像 一张图像位于 div 的左侧 另一张图像位于右侧 我的容器是Bootstrap的容器 它们都用 div 包裹 并且div s position is fixed 我的问题是我无法找到要附
  • 禁用移动设备上的锚点菜单点击

    我使用嵌套列表作为带有子菜单项的菜单 我曾经这样做过 如果您将鼠标悬停在主菜单项上 子菜单项将通过将显示从无更改为块来出现 我决定让子菜单看起来就像是下拉的 并使用了 CSS 过渡 我遇到的问题是 在第一种方法中 如果您触摸 iPad 上的
  • 在画布上剪出圆形图像

    我正在使用 html5 canvas 并且我正在创建一个游戏 可以将您的脸部上传到游戏中 并将其用作主要角色 不幸的是 游戏中的角色是圆形的 就像笑脸一样 那么这将如何完成呢 是否可以拍一张照片 然后将其剪成一个圆 这样圆之外的任何东西都是
  • 检测 html 选择框上的编程更改

    有没有办法让 HTML 选择元素在每次以编程方式更改其选择时调用函数 当使用 JavaScript 修改选择框中的当前选择时 IE 和 FF 都不会触发 onchange 此外 更改选择的 js 函数是框架的一部分 因此我无法更改它以在结束
  • javascript 闭包和对象引用

    我的情况有点晦涩难懂 主要是因为我认为我已经掌握了闭包 所以基本上我想要的是将集合重置为默认值 假设我有一个集合 它具有带有对象参数数组的构造函数 var c new collection x y z 然后集合定期更新 因为我没有保留数组的
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • 为什么 phantomjs 不能在 MacOS Sierra 中工作?

    我们正在使用phantomjs 1 9 1 macosx phantomjs 2 0 0 macosx哪一个工作得很好OS X 埃尔卡皮坦更新后macOS 塞拉利昂它会引发以下错误 phantomjs 1 9 1 macosx phanto
  • 用于替换前 5 个数字的正则表达式,无论它们之间有什么?

    我正在努力实现以下匹配 Input 123 45 6789 123456789 1234 正则表达式尝试输出 d 5 123 45 6789 123456789 1234 d 2 3 123 45 6789 123456789 1234 d

随机推荐

  • spring 3.0 自定义通用转换器虽然已注册但未找到。错误:未找到匹配的编辑器或转换策略

    我创建了一个 StringToMapConverter 用于将预定义格式的字符串转换为键值对的 Map 键也可以是 Enum 类型 然而 在转换器中 我需要引用 org springframework core convert Conver
  • 生成 AWS Signature v4 签名以上传到 s3

    好的 我正在尝试使用创建 aws v4 签名这个模板来自亚马逊在 JavaScript 中 使用 Node js 我正在使用模板的凭据 区域 日期和服务来测试我的签名功能 我使用以下格式来生成我的签名 链接到图像 我的 StringToSi
  • SQL Server:左连接下存在的位置[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 无法使用带有左连接的代码 LEFT JOIN SELECT CASE WHEN EXISTS SELECT FROM INFORMATION SCHEMA TABLES WHERE T
  • Rails 格式化日期

    我正在向 API 发布日期 所需的格式如下 2014 12 01T01 29 18 我可以像这样从模型中获取日期 Model created at to s 返回 2014 12 01 01 29 18 0500 如何使用 Rails 或
  • 如何通过键盘快捷键选择交换剪贴板内容

    我想在按 Ctrl B 等快捷键时将 linux 上的 eclipse 甚至任何程序 中当前选定的文本与剪贴板的内容交换 有任何想法吗 类似问题已发布here关于 Visual Studio 但不幸的是唯一有用的答案指出自动热键哪个仅适用于
  • C# 实体框架每个 HttpContext 仅使用一个 ObjectContext

    在 ASP NET MVC 2 中 使用实体框架 4 我收到此错误 实体对象无法被 IEntityChangeTracker 的多个实例引用 对 SO 的搜索表明 这可能是因为我有不同的实体框架 ObjectContext 实例 而每个 H
  • C - 需要比较 int 的“n”最低位是否相等

    C 需要比较nint 的最低位用于相等 IE n 4 xxxx1001 xxxx1001 x 不关心 IE n 2 xxxxxx01 xxxxxx01 想不出不使用掩码的好方法 根据位数创建掩码 int mask 1 lt lt bits
  • Python:Python.h 文件丢失

    我使用的是 Ubuntu 16 04 我正在尝试安装 Murmurhash python 库 但它抛出错误 command x86 64 linux gnu gcc failed with exit status 1 我查了一下网上 说这个
  • 如何在 Windows 8 风格应用程序中将对象从一个 Frame 传递到另一个 Frame

    我有一个问题 我现在无法弄清楚 我正在尝试开发一个 Windows 8 风格的应用程序 但我一直无法实现此功能 我有一个主窗口其中包含一个列表框和一个按钮 可以说添加按钮 当我单击按钮时 我导航到一个新页面 可以说添加客户页面与 this
  • Rails 5 - JS 无法在生产环境中工作(仅限)

    我正在挣扎 我有 Rails 5 应用程序 在我的 app assets javascripts 文件夹中包含一系列 js 文件 这些文件中的js在开发环境中工作得很好 但是当我在heroku上发布时 它停止工作 我可以从 chrome 检
  • 如何在常规 PHP 脚本中继续 CakePHP 3 会话?

    我的情况如下 我有一个 cakephp 项目和一个在同一服务器上运行的单独的纯 php 脚本 当我使用客户端浏览器连接到 cakephp 项目时 它会按预期建立一个会话 现在我想用我的纯 PHP 脚本继续会话数据 我再次使用相同的客户端浏览
  • CSS规则选择不包含元素的元素

    我有一堆看起来像的元素 div div class head div div class footer div div 除了其中一些没有页脚元素 只有一个头部 我想给没有页脚的元素一个底部边框 我希望有类似的事情 hi hasno foot
  • 从地理编码对象获取纬度

    我想从地理编码器返回的结果对象中获取纬度和经度
  • 如何检测用户是否单击了“不允许访问摄像头”

    我正在使用一个UIImagePicker向用户展示相机来拍摄将在应用程序中使用的照片 我的问题是 用户第一次打开图像选择器时 会出现一条提示 我的应用程序想要访问您的相机 有两个选项 不允许和确定 我的要求是 当用户单击 不允许 时 图像选
  • 我可以将 Excel 组合框设置为默认值吗?

    我的组合框 名为ddDatabase 可以具有两个值之一 这两个值是从单独工作表中的表中提取的 但是 当我打开 Excel 文件时 这两个值都没有被选择 相反 组合框显示为空 有什么方法可以明确地将特定值设置为默认值吗 经过一些进一步的测试
  • 通过带分隔符的字符串访问多维数组

    假设我有一个像这样的多维数组 我想通过传递像这样的字符串来访问数组元素 test1 test2 test3 到一个函数 该函数依次调用数组元素 我可以用eval 将字符串替换为 调用 array test2 test3 但我想知道是否有一种
  • 数据库设计 - 为用户存储积分的方法

    只是寻找一些有关如何为此进行数据库设计的建议 在我的网站上 用户可以通过执行不同的活动获得积分 目前 我有 3 项奖励积分的活动 但设计必须具有可扩展性 我也可以添加其他奖励积分的活动 所以今天 用户获得积分 1 当他添加一个新商店时 他获
  • 如何使用泛型 Go 实例化类型参数的非零指针?

    现在类型参数可用golang go master 我决定尝试一下 看来我遇到了在中找不到的限制类型 参数 提案 或者我一定错过了 我想编写一个函数 它返回带有接口类型约束的泛型类型值的切片 如果传递的类型是带有指针接收器的实现 我们如何实例
  • 如何取消从 Git Bash 克隆 Git 存储库?

    我目前正在使用 Git Bash 克隆一个拥有超过 100 000 次提交的大型存储库 克隆过程已经持续了半个多小时 还没有完成对象的接收 是否可以取消git clone来自 Git Bash 的命令 作为参考 我在 Windows 7 P
  • 在渲染 JS canvas 之前加载图像

    我正在编写一个简单的游戏来学习 JS 并且在此过程中我正在学习 HTML5 所以我需要在画布上绘制东西 这是代码 let paddle new Paddle GAME WIDTH GAME HEIGHT new InputHandler p