javascript - 如何使用纯javascript从 Sprite 表中提取 Sprite

标签 javascript dom html5-canvas sprite sprite-sheet

所以我有这个 Sprite 表,其中包含塞尔达传说中的所有不同图 block ,有没有一种方法可以让我进入像 getTile(2,1) 这样的函数,并且它会返回骑士的 base64 编码?< br/> spritesheet

到目前为止我已经尝试过了

function getTiles() {
  var sprites = new Image();
  sprites.src = 'https://cdn.glitch.me/b3505ee1-a321-48ea-baf5-d84841324af1%2Fd3b13ce6-f5ed-4122-9bd9-37f74d13d470.image.png?v=1634242985542';

  allOverworldTiles = []

  var i = 0;
  for (var top = 0; top < 8 * 17; top += 17) {
    for (var left = 0; left < 20 * 17; left += 17) {
      var canvas = document.createElement("canvas");
      var ctx = canvas.getContext("2d");
      canvas.width = 16;
      canvas.height = 16;
      ctx.drawImage(sprites, left + 1, top + 1, 16, 16, 0, 0, 16, 16)
    }
  }
  var dataURL = canvas.toDataURL("image/png");
  var newTab = window.open('about:blank', 'image from canvas');
  newTab.document.write("<img src='" + dataURL + "' alt='from canvas'/>");
}

我希望答案是用普通的 javascript 编写的

最佳答案

您的代码存在一些问题...

  • 您需要一个 onload 事件来确保图像已加载,然后才能执行任何操作
  • 您需要sprites.crossOrigin="anonymous",否则您将收到受污染的 Canvas 错误
  • 你的逻辑不清楚,你有一个双循环,但循环外只有一个 toDataURL

这是一个工作原型(prototype)

var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = canvas.height = 16;

var sprites = new Image();
sprites.crossOrigin="anonymous"
sprites.src = 'https://cdn.glitch.me/b3505ee1-a321-48ea-baf5-d84841324af1%2Fd3b13ce6-f5ed-4122-9bd9-37f74d13d470.image.png?v=1634242985542';
sprites.onload = getTiles

function getTile(x, y) {
  ctx.drawImage(sprites, x * 17 + 1, y * 17 + 1, 16, 16, 0, 0, 16, 16)
  return canvas.toDataURL("image/png");
}

function getTiles() {
  var knight1 = getTile(2, 1)
  document.write("<img src='" + knight1 + "'/>");
  
  var knight2 = getTile(8, 1)
  document.write("<img src='" + knight2 + "'/>");
  
  var knight3 = getTile(14, 1)
  document.write("<img src='" + knight3 + "'/>");
}

关于javascript - 如何使用纯javascript从 Sprite 表中提取 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69577560/

相关文章:

javascript - react : Getting an object on click

javascript - 减少两个 Canvas html 之间的空间

javascript - 谷歌标签管理器虚拟综合浏览量

javascript - 无法运行 Node.js、express、socket.io 和 ejs?

javascript - 检测刷新时的内容变化

javascript - 当元素有指定的子元素时移除元素

html - 用附加的事件处理程序删除DOM元素的正确方法是什么?

javascript - 使用 Microsoft Edge 中的 Canvas 上下文调整图像的亮度

JavaScript 图像仅在刷新时加载

javascript - 知道在 Javascript 中按下了什么按钮