• # 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

• #### Postmortem: I Am Overburdened, Recaps and Numbers

Spidi provides a fully detailed breakdown of the development and business results of the release of "I Am Overburdened".
• 373 views
• #### A LinkedIn Profile for Job Hunting and Networking

Marc Mencher GameRecruiter http://www.gamerecruiter.com Marc Mencher is founder and CEO of GameRecruiter and author of Get in the Game!, an instructional book on building a career in the video game industry. In this first in a series of articles on managing your career in the games industry, Marc offers advice on creating a LinkedIn profile for job hunting and networking.
• 1 comment
• 1106 views
• #### Android Debugging with Visual Studio Code

Eric Shaw Learn how to use Visual Studio code to debug native Android applications.
• 1 comment
• 1854 views
• #### 3 Game Design Mindsets

Cody Red http://www.xnahub.com Unless you are tracking, planning, and hitting your KPIs (the only things that matter in the initial phase), you’ll easily get sidetracked, overwhelmed, start looking at the wrong things, make bad design decisions, and eventually, lose focus.