node.jstilesisometric

Node isometric tile map render second layer problem


I'm building an isometric map tile image in Node and I'm stuck at the second layer rendering, I can't figure out how to adjust items in the y axis

Here's my code so far:

let i = 0;
for (let layer of map) {
  const xTiles = layer.length;
  const yTiles = layer[0].length;

  for (let Xi = xTiles - 1; Xi >= 0; Xi--) {
    for (let Yi = 0; Yi < yTiles; Yi++) {
      const imgIndex = layer[Xi][Yi];
      if (imgIndex == null || imgIndex == -1) {
        continue;
      }
      const tile = tiles[imgIndex];

      const offX = (Xi * tileColOffset / 2 + Yi * tileColOffset / 2 + originX) + (i * ((tileColOffset - tile.width) / 2));
      const offY = (Yi * tileRowOffset / 2 - Xi * tileRowOffset / 2 + originY) - (i * ((tileRowOffset / 2)));

      ctx.drawImage(tile, offX, offY);
    }
  }
  i++;
}

I can center the sprite on the x axis but not on the y one, probably because sprites have different heights. The code above reproduces this

enter image description here

As you can see the taller sprites are quite centered, but the small ones are not. Any suggestion?

Thanks!


Solution

  • Just found out that I have to calculate the difference between the half height of the ground tile and the height of the sprite:

    let i = 0;
    for (let layer of map) {
      const xTiles = layer.length;
      const yTiles = layer[0].length;
    
      for (let Xi = xTiles - 1; Xi >= 0; Xi--) {
        for (let Yi = 0; Yi < yTiles; Yi++) {
          const imgIndex = layer[Xi][Yi];
          if (imgIndex == null || imgIndex == -1) {
            continue;
          }
          const tile = tiles[imgIndex];
    
          let offX, offY
          if (i === 0) {
            offX = (Xi * tileColOffset / 2 + Yi * tileColOffset / 2 + originX);
            offY = (Yi * tileRowOffset / 2 - Xi * tileRowOffset / 2 + originY);
          } else {
            offX = (Xi * tileColOffset / 2 + Yi * tileColOffset / 2 + originX) + (i * ((tileColOffset - tile.width) / 2));
            offY = (Yi * tileRowOffset / 2 - Xi * tileRowOffset / 2 + originY) + ((i * (tileRowOffset / 2 - tile.height)));
          }
          ctx.drawImage(tile, offX, offY);
        }
      }
      i++;
    }