javascript - 如何从 html Canvas 上的tileset工作表多次绘制特定的tileset而不是整个图像

标签 javascript html canvas sprite sprite-sheet

所以我有一个充满小瓷砖的瓷砖集,如地面、水、树木等。我有一个 for 循环,它循环一定次数以在 Canvas 上绘制瓷砖。它要么只绘制一次像我需要的小的特定图 block ,要么绘制整个图像或小的特定图 block ,但在全屏上。但我需要在 Canvas 上重复 25 次草 block 才能生成 map 。代码:

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

var StyleSheet = function(image, width, height) {
  this.image = image;
  this.width = width;
  this.height = height;


  this.draw = function(image, sx, sy, swidth, sheight, x, y, width, height) {
    image.onload = function() {
      context.drawImage(image, sx, sy, swidth, sheight,x, y, width, height);
    }
  }
}

var Loader = function(src) {
  this.image = new Image();
  this.image.src = src;
  return this.image;
}

var background = new Loader("ground.png");
console.log(background);
var sprite = new StyleSheet(background, 16, 16);
for (i = 0; i < 25; i++) {
  for (j = 0; j < 25; j++) {
    sprite.draw(background, 30, 30, 36, 36, i * 0, j * 0, sprite.width, sprite.height);
  }
}

我在循环中尝试 * 0, j * 0 但没有帮助

现在是这样的:enter image description here

但我需要它是这样的:

enter image description here

最佳答案

sprite.draw(background, 30, 30, 36, 36, i * 36, j * 36, 36, 36);
  • sprite.width/height 在这里不起作用,因为图 block 表包含(可能包含)大量图 block 选择,并且您想要获取(和放置)只是其中的一小部分
  • 与 0 相乘没有多大意义,我想你已经感觉到了。

(如果您需要再次查看,还有 drawImage: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage )

<小时/> 哦是的。 Loader 不能以这种方式工作,浏览器会异步加载图像,并且该方法返回时图像将不可用。

这是一个您可以运行的快速测试:

var Loader = function(src) {
  this.image = new Image();
  this.image.src = src;

  this.image.onload=function(){
    var sprite = new StyleSheet(background, 16, 16);
    for (i = 0; i < 25; i++) {
      for (j = 0; j < 25; j++) {
        sprite.draw(background, 30, 30, 36, 36, i * 0, j * 0, sprite.width, sprite.height);
      }
    }
  }

  return this.image;
}

var background = new Loader("ground.png");
console.log(background);
//var sprite = new StyleSheet(background, 16, 16);
//for (i = 0; i < 25; i++) {
//  for (j = 0; j < 25; j++) {
//    sprite.draw(background, 30, 30, 36, 36, i * 0, j * 0, sprite.width, sprite.height);
//  }
//}

绘图内容已移至图像加载的事件处理程序中。

旁注:我看到 console.log(background); 行,可能您正在尝试检查 background 是否是图像。是的,但它是一个空的,它的内容和宽度/高度当时不可用。

关于javascript - 如何从 html Canvas 上的tileset工作表多次绘制特定的tileset而不是整个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50276980/

相关文章:

jquery - 将 base64 图像传递到 PHP 页面适用于本地主机但不适用于服务器

java - 如何在作为 xml 布局文件一部分的框架布局中创建 Canvas

javascript - Canvas 绘制不正确(不稳定)

javascript - 在 Javascript 中迭代对象数组

javascript - jQuery :disabled selector not working properly?

javascript - YouTube视频更改上的Javascript

JavaScript - 将形状旋转固定 Angular

javascript - 在另一个 jquery 事件完成后播放声音

javascript - 无法在 Phonegap 中的 HTML5 Canvas 上绘制图像

javascript - 从另一个页面打开 Bootstrap 选项卡(在 Accordion 中)