So I'm working on AoCE, and I came to the stage where I have to convert isometric tile coordinates to screen coordinates. This itself is not very difficult, just something like
Code:
would work. However; this formula assumes that the topleft corner (coordinates (0,0)) is at a fixed position, and eventually visible. Sadly, my field doesn't fit in the entire screen, so I have to work with offsets. This didn't turn out well Can someone *maybe* check what's wrong with my code/formulas?
Code:
The output is HL=pointer to topleft corner of the right tile.
Code:
var isoToScreen = function(x, y) {
var posX = (x - y) * tileW;
var posY = (x + y) * tileH / 2;
return [posX, posY];
};
would work. However; this formula assumes that the topleft corner (coordinates (0,0)) is at a fixed position, and eventually visible. Sadly, my field doesn't fit in the entire screen, so I have to work with offsets. This didn't turn out well Can someone *maybe* check what's wrong with my code/formulas?
Code:
; Check if we need to draw the puppet:
; X_tile - Y_tile in [X_1-Y_1,X_1-Y_1+9]
; X_tile - Y_tile - (X-1 - Y_1) in [0,9]
; X_tile - Y_tile - (iy+0) in [0,9]
; X_tile + Y_tile in [X_1+Y_1,X_1+Y_1+23]
; X_tile + Y_tile - (X_1+Y_1) in [0,23]
; X_tile + Y_tile - (iy+3) in [0,23]
; Check if X is in the range
ld a, (ix+puppetX)
sub a, (ix+puppetY)
sbc hl, hl
ld l, a
ld de, (iy+TopLeftXTile)
or a, a
sbc hl, de
ld (iy+6), l
ld de, -10
add hl, de
jr c, DontDrawPuppet
; Check if Y is in the range
sbc hl, hl
ld a, (ix+puppetX)
add a, (ix+puppetY)
ld l, a
jr nc, +_
inc h
_: ld de, (iy+TopLeftYTile)
or a, a
sbc hl, de
ld (iy+7), l
ld de, -24
add hl, de
jr c, DontDrawPuppet
DrawPuppet:
ld a, (iy+6)
add a, (iy+7)
add a, a
add a, a
add a, a
add a, 31
ld hl, variables+OFFSET_Y ; just the offset from the screen, since the field is shifted with 4 pixels each time
add a, (hl)
ld l, a
ld h, 160
mlt hl
add hl, hl
ld e, (iy+6)
ld d, 16
mlt de
add hl, de
ld a, (variables+OFFSET_X)
ld d, 0
ld e, a
add hl, de
ld de, (currDrawingBuffer)
add hl, de
The output is HL=pointer to topleft corner of the right tile.