get() 函数 returns p5.js 中的空像素数组

get() function returns an empty pixels array in p5.js

我想做的事情与this video. In p5.js, I am using get()功能类似。使用这个之后,我将创建小图像(通过划分大tileset)并将它们推入一个数组。但是在我的代码中 get() returns 一个 空像素数组 。这是我的代码的一部分:

tilesImages = [];  // tiles array
function preload() {
    let tilesImage = loadImage(TILEMAP_PATH + "tiles.png", () => {
        console.log("Tiles loaded successfully");  // It logs this
    }, () => {
        console.log("An error occured when tiles loaded");
    });
    for (let i = 0; i < TILE_HORIZONTAL; i++) {
        for (let j = 0; j < TILE_VERTICAL; j++) {
            let x = i * TILE_SIZE + TILES_SPACE;
            let y = j * TILE_SIZE + TILES_SPACE;
            if (i == 0) {
                x = 0;
            }
            if (j == 0) {
                y = 0;
            }
            var img = tilesImage.get(x, y, TILE_SIZE, TILE_SIZE);  // get tiles from tileset
            tilesImages.push(img);
        }
    }
}
function setup() {
    console.log(tilesImages[0].pixels);  // returns empty
}

我尝试使用 this,但它只会在我的小图片上绘制垂直的粉红色线条。

我的图块集:https://www.kenney.nl/assets/pixel-shmup(右侧)

我现在用的是单图,但我想知道这个问题的解决方法。谢谢

我认为这里的问题是您没有等待图像实际加载。 loadImage 函数是 异步的 。也就是说,它仅 开始 加载图像的过程,但 returns 在它真正完成加载图像之前。因此,之后的任何代码都会立即 运行 ,而加载仍在进行中。加载完成后可以使用回调函数给运行代码。这是您的代码的修改版本,应该可以缓解该问题:

tilesImages = []; // tiles array
function preload() {
  let tilesImage = loadImage(
    TILEMAP_PATH + "tiles.png",
    () => {
      console.log("Tiles loaded successfully"); // It logs this
      // Wait until loading is complete to use tilesImage.get()
      for (let i = 0; i < TILE_HORIZONTAL; i++) {
        for (let j = 0; j < TILE_VERTICAL; j++) {
          let x = i * TILE_SIZE + TILES_SPACE;
          let y = j * TILE_SIZE + TILES_SPACE;
          if (i == 0) {
            x = 0;
          }
          if (j == 0) {
            y = 0;
          }
          var img = tilesImage.get(x, y, TILE_SIZE, TILE_SIZE); // get tiles from tileset
          tilesImages.push(img);
        }
      }
    },
    () => {
      console.log("An error occured when tiles loaded");
    }
  );
}