Jump to content

  • Log In with Google      Sign In   
  • Create Account

Like
0Likes
Dislike

Isometric Source Code

By Geoff Howland | Published Sep 14 1999 01:15 PM in Game Programming

mouse screen mouse tile xoffset map yoffset offset center
If you find this article contains errors or problems rendering it unreadable (missing images or files, mangled code, improper text formatting, etc) please contact the editor so corrections can be made. Thank you for helping us improve this resource

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.

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





Comments

Note: Please offer only positive, constructive comments - we are looking to promote a positive atmosphere where collaboration is valued above all else.




PARTNERS