# problem with isometric drawing

This topic is 4605 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I got a piece of code to draw a map in isometric view. But what I got is just one strip of squares Here is the code:
void DrawMap()
{
int tile1, cameray, camerax;
int z, x;
SDL_Rect dest, src;
Uint32 colorkey;
camerax=400;
cameray=300;
src.x = 0;
src.y = 0;
src.w = TILE_WIDTH;
src.h = TILE_HEIGHT;

colorkey = SDL_MapRGB(tiles->format, 0, 0, 0);
SDL_SetColorKey(tiles, SDL_SRCCOLORKEY, colorkey);

for (z = 0; z < 5; z++)
{
dest.y = z * -TILE_HEIGHT/2 + cameray;
dest.x = z * -TILE_WIDTH/2 + camerax;
dest.w = TILE_WIDTH;
dest.h = TILE_HEIGHT;

for (x = 0; x < 5; x++)
{
// draw tile

/*
dest.x = TILE_WIDTH * x;
dest.y += (TILE_HEIGHT * y) /2;
dest.w = TILE_WIDTH;
dest.h = TILE_HEIGHT;*/

SDL_BlitSurface(tiles, &src, screen, &dest);

// update location
dest.y += TILE_HEIGHT/2;
dest.x += TILE_WIDTH/2;
}
}
}


Can somebody identofy what is the error here?

##### Share on other sites
This forum (the isometric one) moves SLOWLY! and i have had trouble getting replies to my isometirc engine questions.

Also are you trying to make a dimond shape map or the "staggered row" map (for want of a better phrase)?

##### Share on other sites
Outer Loop:
Quote:
 for (z = 0; z < 5; z++) { dest.y = z * -TILE_HEIGHT/2 + cameray; dest.x = z * -TILE_WIDTH/2 + camerax;

 z | d.x | d.y  0 | 0.0 | 0.0 1 |-0.5 |-0.5 2 |-1.0 |-1.0  3 |-1.5 |-1.5 4 |-2.0 |-2.0* x is in unit of TILE_WIDTH, y is in units of TILE_HEIGHT, relative to(camerax, cameray) which is constant over the loop.

Inner Loop:
Quote:
 for (x = 0; x < 5; x++) {... dest.y += TILE_HEIGHT/2; dest.x += TILE_WIDTH/2;

z = 1 x | d.x | d.y  0 | 0.0 | 0.0 1 |-0.5 |-0.5 * 2 |-1.0 |-1.0 * 3 |-1.5 |-1.5 * 4 |-2.0 |-2.0 *z = 2 x | d.x | d.y  0 |-0.5 |-0.5 * 1 |-1.0 |-1.0 * 2 |-1.5 |-1.5 * 3 |-2.0 |-2.0 * 4 |-2.5 |-2.5

Note that lines marked with * are duplicates. Basicly you are drawing your tiles on top of each other over and over. The correct drawing method will depend on if your map is stored in screen space or in a rotated world space (this is refered to as a "diamond map").

In either case you want to loop over your map in 2d and draw each tile in screen space.

for(x = 0; x = width; x++) {    for(y = 0; y < width; y++) {        position = map_to_screen_transfrom(x, y);    }}

Your actual transfrom will depend on your map representation and parameters such as screen size, tile size, etc. If you post which map representation you are using, someone should be able to help you more. The screen space ("rectangle map") transform is very easy, but will make game logic more difficult later. The rotated world space ("diamond map") transform is a little more tricky, but makes game logic easier. There are some good posts on working with both of these representation in this forum, although the search is a little hard to use so you may need to hunt around a bit.

Here are a couple threads to get you started:
http://www.gamedev.net/community/forums/topic.asp?topic_id=309720&whichpage=1
http://www.gamedev.net/community/forums/topic.asp?topic_id=310213&whichpage=1
http://www.gamedev.net/community/forums/topic.asp?topic_id=322653&whichpage=1

##### Share on other sites
You could try this:

You are stepping in the x AND y direction in the same iteration.

so you are saying....

puthere, go right, go down, put here, go right, go down...

x
x
x
x
x
is what you get.

Try doing this...

for(int y=0; y < 5; y++){   for (x = 0; x < 5; x++)  {       // draw tile               /*     dest.x = TILE_WIDTH * x;     dest.y += (TILE_HEIGHT * y) /2;     dest.w = TILE_WIDTH;     dest.h = TILE_HEIGHT;*/              SDL_BlitSurface(tiles, &src, screen, &dest);       // update location       dest.x += TILE_WIDTH/2;  }  dest.y += TILE_HEIGHT/2;}

You should get something closer to

xxxxxx
xxxxxx
xxxxxx
...etc

Without being able to test your code, it's a little harder...

In theory you'll want something like...
for Z{ for Y {  for X  {   Blit x,y,z   update x  }  update y } update z}

##### Share on other sites
Im storing the map in an array like this:
x
y 0 0 0 0 0
1 1 0 0 0
0 0 1 0 0

It is a bit clearer for me to edit the map by hand.
I will try the solutions and post the results here.

• 17
• 11
• 12
• 9
• 49
• ### Forum Statistics

• Total Topics
631395
• Total Posts
2999757
×