Isometric Source Code

Published September 14, 1999 by Geoff Howland, posted by Myopic Rhino
Do you see issues with this article? Let us know.
Advertisement
Isometric Source Code
by Geoff Howland

This is some old source code that I used to draw my isometric tiles, when I was doing it that way in the early stages of Force Recon. I was using the CDX library to handle DirectX then and there are a lot of global or outside variables that aren't documented in the routines very well simply because they were documented outside the code. I haven't cleaned this up since I first put it together and I'm not even sure the version of this code since I just grabbed it out of the middle of my old archive, I hope it helps in an algorithmic fashion though, which is how I'm intending it.

I reformatted this with tabs but I have not done anything else with it. The tabs will be lost in HTML format so download the text format to read them correctly.

[size="5"]Definitions:

mx,my = Map X/Y coordinates
sx,sy = Isometric screen coordinates
sax,say = Screen Actual coordinates, square tile version
xOffset,yOffset = Pixel offset from top left corner of current screen actual tile
mxOffset,myOffset = Offset of map tiles from the top left corner of the screen, for scrolling the map
ax,ay = Actual screen coordinates in pixels
sx,sy = Starting X/Y, usually for a comparison
ex,ey = Ending X/Y, usually for a comparison

void drawTiles(int wallVal)
{
// Variables for drawing the map //
int startX, startY=5; // Starting positions for drawing tiles //
// Y=5 seems to offset it correctly //
int drawX=0, drawY=0; // Working positions for drawing tiles //
int mapX=0-screen.mxOffset, mapY=-3-screen.myOffset; // For starting map positions //
int tmapX=0, tmapY=0; // Temporary working map positions //
int val=0; // Value for tile, for more than one tile and testing //
// Draw Floor Map //
for (int y=0; y < 52; y++) { //MAP_NUM_Y; y++) {
if (y % 2 == 0) startX = 0; // Even Line //
else startX = 32; // Odd Line //

drawX = startX; drawY = startY; // Sync pix starts //
tmapX = mapX; tmapY = mapY; // Sync map starts //
for (int x=0; x < 25; x++) { //MAP_NUM_X; x++) {
val = checkMap(tmapX, tmapY);

// Draw Floor //
if (val == 1)
tempSprites.AddSprite(FloorMap,0,drawX-TILE_X-64+screen.xOffset,drawY-TILE_X+screen.yOffset,0,0,0,1,0);

else if (val == 0)
tempSprites.AddSprite(FloorMap,0,drawX-TILE_X-64+screen.xOffset,drawY-TILE_X+screen.yOffset,0,0,0,0,0);

// Draw walls where applicable //
if (val == 3)
tempSprites.AddSprite(Wall,0,drawX-WALL_X-64+screen.xOffset,drawY-WALL_Y+screen.yOffset,0,0,0,1,0);

else if (val == 2)
tempSprites.AddSprite(Wall,0,drawX-WALL_X-64+screen.xOffset,drawY-WALL_Y+screen.yOffset,0,0,0,0);

else if (val == 4)
tempSprites.AddSprite(Wall,0,drawX-WALL_X-64+screen.xOffset,drawY-WALL_Y+screen.yOffset,0,0,0,2,0);

else if (val == 5)
tempSprites.AddSprite(Wall,0,drawX-WALL_X-64+screen.xOffset,drawY-WALL_Y+screen.yOffset,0,0,0,3,0);

// Increment X for the next tile //
drawX += TILE_X;

// Increment Map values //
tmapX+=1;
tmapY+=1;
}

// Increment Y for next line //
startY += 15; // Y for new ground (64x30)

// Adjust starting position of map for next line //
if (y%2 == 0) { // Even //
mapY+=1;
}
else { // Odd //
mapX-=1;
}
}
///// End walls draw /////
}

void scrollScreen(int x, int y)
{
// Increment Screen pixel offsets //
screen.xOffset += x;
screen.yOffset += y;

// Increment Map tile offset //
// x offset //
if (screen.xOffset > 63) {
screen.mxOffset += 1;
screen.myOffset += 1;
screen.xOffset = screen.xOffset - 64;
}
else if (screen.xOffset < 0) {
screen.mxOffset += -1;
screen.myOffset += -1;
screen.xOffset = screen.xOffset + 64;
}
// y offset //
if (screen.yOffset > 29) {
screen.mxOffset += -1;
screen.myOffset += 1;
screen.yOffset = screen.yOffset - 30;
}
else if (screen.yOffset < 0) {
screen.mxOffset += 1;
screen.myOffset += -1;
screen.yOffset = screen.yOffset + 30;
}
// End Incrementing Map tile offset //
}

// Checks tile value on coordinate of map //
int checkMap(int x, int y)
{
int val=0;

if (x < 0 || y < 0)
return (-1);

val = Map1[x+(MAP_NUM_X*y)];

return (val);
}

[size="5"]Mouse Routines

void mouseConvert()
{
// Modify tmx,tmy with the tileX,tileY //
mouse.tmx += TILE_X; mouse.tmy += TILE_Y;

// Get Tile X,Y //
mouse.tx = mouse.tmx / 64;
mouse.ty = mouse.tmy / 30;
// Get Mouse X,Y //
mouse.mx = mouse.tmx % 64;
mouse.my = mouse.tmy % 30;

// Determine what tile from center tile //
if (mouse.my < 14) { // Mouse is on top part //
mouse.sx = 29 + (-2 * mouse.my); // Interpolate edges //
mouse.ex = 33 + (2 * mouse.my);
if (mouse.mx < mouse.sx) {
mouse.ax = -1; mouse.ay = -1;
}
else if (mouse.mx > mouse.ex) {
mouse.ax = 1; mouse.ay = -1;
}
else {
mouse.ax = 0; mouse.ay = 0;
}
}
else if (mouse.my > 14) { // Mouse is on bottom part //
mouse.sx = 29 + (-2 * (29 - mouse.my)); // Interpolate edges //
mouse.ex = 33 + (2 * (29 - mouse.my));
if (mouse.mx < mouse.sx) {
mouse.ax = -1; mouse.ay = 1;
}
else if (mouse.mx > mouse.ex) {
mouse.ax = 1; mouse.ay = 1;
}
else {
mouse.ax = 0; mouse.ay = 0;
}
}
else { // Middle line is automatic //
mouse.ax = 0; mouse.ay = 0;
}

// Decode ax and ay to figure out the screen tiles //
if (mouse.ay < 0) { // Above center tile //
if (mouse.ax < 0) { // Left of center tile //
mouse.sax = mouse.tx; mouse.say = (mouse.ty * 2) -1;
}
if (mouse.ax > 0) { // Right of center tile //
mouse.sax = mouse.tx+1; mouse.say = (mouse.ty * 2) -1;
}
}
else if (mouse.ay > 0) { // Below center tile //
if (mouse.ax < 0) { // Left of center tile //
mouse.sax = mouse.tx; mouse.say = (mouse.ty * 2) +1;
}
if (mouse.ax > 0) { // Right of center tile //
mouse.sax = mouse.tx+1; mouse.say = (mouse.ty * 2) +1;
}
}
else {
mouse.sax = mouse.tx; mouse.say = mouse.ty *2;
}
// End ax and ay Decode //

// Decrement Screen Actual X and Y //
mouse.mx = mouse.sax-1; // Init the map coords //
mouse.my = mouse.say-1;

// Convert Screen to Map Coords //
mouse.mx = mouse.mx - (mouse.my / 2); // Dividing by two gives the number of X's to move over for 0x for my lines down //
mouse.my = mouse.my + mouse.mx; // Adding mx to my will also offset the upwards slope that each Y line has //

/* if (mouse.mx < 0) // If mx is negative then cross the map //
mouse.mx = MAP_NUM_X + mouse.mx;*/
}
Cancel Save
0 Likes 0 Comments

Comments

Nobody has left a comment. You can be the first!
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement