• # Isometric Source Code

General and Gameplay Programming

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;*/ }

Report Article

## User Feedback

You need to be a member in order to leave a review

## Create an account

Register a new account

There are no reviews to display.

• ### Latest Published Articles

• #### Game Engine Containers - handle_map 1 2

Jeff Kiah This article explores the creation of a data container for game programming. This container is meant to take the place of C++ standard library containers such as std::map and std::unordered_map, with an alternative that stores data contiguously in memory.
• 34737 views
• #### Casual Connect 2018 Coverage 1 2

Beth Feldman GameDev.net's coverage of Casual Connect 2018 from Anaheim, CA.
• 287 views
• #### Postmortem: I Am Overburdened, Recaps and Numbers 1 2

Spidi provides a fully detailed breakdown of the development and business results of the release of "I Am Overburdened".