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