Advertisement

Map drawing trouble

Started by June 30, 2001 10:28 PM
3 comments, last by bose 23 years, 7 months ago
Hi! I am very new to isometric tile drawing, and I have been having a hell of a time trying to get a draw map function to work correctly. I managed to get a rectangular tile map working just fine, but this one is escaping me (and I have read every article here on GameDev as well as some others such as chapter 12 from the book at Isohex.net). Here is what I am trying to do: I am using 1:1 isometric tiles that are 44x44. What is really escaping me is the math in the FOR loops. I know it is supposed to be very simple but for some reason what I am using just isn''t working and rather than spend another 2 days running into the same problems, I figured I would ask here If anyone could please give me an example of something like this... I have read plenty of articles to know how its *supposed* to be done and that doesn''t work, so any code specifics would help trmendously Sorry if this sounds too "newbie"! Thanks in advance.
http://therabbithole.redback.inficad.com/tricks/

Down at the bottom there''s a tutorial on figuring out the math for any ISO tile.

It should be easy from there.

Ben
Advertisement
Well I got that part worked out... It draws the map fine but now I have another problem - that is smooth movement around the map. Right now for some reason the tiles JUMP as you move. I found how to fix that, but when I fix that is messed up my drawing boundaries! Here is the code I am using, maybe someone can figure out where I am going wrong...

  bool DrawTiles(){	int x, y, i;	RECT rcDest;	BYTE byTile;	// Tile location of the upper left corner of the screen	int xStart = mapData.xScreen / 44; // xScreen is the pixel coordinate for movement	int yStart = mapData.yScreen / 44; // yScreen is the pixel coordinate for movement	// Set the RECT of the first tile to be drawn	rcDest.left = xStart * 44 - mapData.xScreen;	rcDest.top = yStart * 44 - mapData.yScreen;	rcDest.right = rcDest.left + 44;	rcDest.bottom = rcDest.top + 44;	RECT rcTemp = rcDest; // Will need a backup!	for(x=0; x<30; x++)	{		// if we are on an odd row, i will be TRUE		i = (x+2)%2;				// increment the RECT for the next tile		rcDest.top += 22;		rcDest.bottom += 22;		rcDest.left = rcTemp.left;		rcDest.right = rcTemp.right;		if(i)		{			// offset the RECT and tile coord for an odd row			yStart += 1;			rcDest.left -= 22;			rcDest.right -= 22;		}		else		{			// on an even row, increment the coord down 1 full tile			if(x > 0)				xStart += 1;		}		for(y=0; y<18; y++)		{			// current tile coords being drawn			xCurr = xStart + y;			yCurr = yStart - y;						// increment the bounding RECT			rcDest.left += 44;			rcDest.right += 44;			// make sure we arent drawing past the map limits			if(xCurr >= 0 && xCurr <= mapData.xMax && yCurr >= 0 && yCurr <= mapData.yMax)			{				// this is just a makeshift linked list for testing, it works for now				i = mapLoc[xCurr][yCurr].nNumTiles-1;				byTile = mapLoc[xCurr][yCurr].tileData[i].byTile;				// if there is a tile in that spot, BLT it!!				if(byTile > 0)						g_pDDSBack->Blt(&rcDest, mapData.pDDSTileset, &lptileInfo[byTile]->rcLocation, DDBLT_WAIT | DDBLT_KEYSRC, NULL);			}		}	}	return true;}  


Excuse me if it looks a little sloppy, I am trying to get it WORKING before I go optimize every little detail

As you can see, mapData.xScreen and mapData.yScreen are the pixel coords of the map, and somewhere between that and the starting RECT are where I think my problems are...

PLEASE HELP!
Thanks in advance
If anyone feels like they might be able to help, i can post the program and show what it is doing, just let me know! please!

Even if there is another way entirely to do this math... Thanks!
Hello

This answer comes maybe a little bit too late, if not well just read it.

You have to check if your position in the world can be devided by 44 (since you have 44*44 tile). If it is then you can display the full tile. If not you have to "slide" the RECT to display a part of the tile. How much? the result of the previous division.

I think this should work, you should have a smooth movement.

This topic is closed to new replies.

Advertisement