I'd like to know what kind of isometric engine ultima online has. in ultima online, you can walk in 8 directions. with hexagons you can walk in 6 and with diamonds, you can walk in 4. so what does ultima online use? and what do games like diablo2 use? do they make use of 3d APIs like D3D/OpenGL?
Posted on 2002-05-27 12:14:55 by darester
I couldn't tell you what ultima uses specificially, but 8 directions is usually a square grid in diagonal movement is allowed.
Posted on 2002-05-27 12:45:28 by Eóin
Isometric is best done with 2D Imho even if it is a kind of 3D (2.5D as i call it ;) )

Diablo1/2 is done with Directdraw ie it is 2D. But it can use Glide and D3D as i recall for some effects improvements ... but basically all the "nice looks" Izometric engines (add AoE all versions here) are 2D.

You can use 3D to draw Isometric lands by seting an Orthographic view and rotating the camera/world/objects by the proper ammounts. First 45 degress left-right and then 30 degrees up/down.

This will eventually speed up engine but "good looks" (esp with hundreds of thousands of units) are very hard to get in 3D.

AFAIK allmost all games move units at least in 8 directions

[NW] [N] [NE]
[W] [E]
[SW] [S] [SE]

cant see any problem here other that pathfinding routinemust handle this. Any tile based engine can move like this Izometric or not.
Posted on 2002-05-28 07:40:34 by BogdanOntanu
thanks for all the replies so far!
i'm currently trying to make an engine that uses angled rectangular tiles (diamond shaped form).

i'm wondering how i should draw the isomap?
since it's isometric, i can't just set up a 2d loop, add dwTileWidth in the horizontal loop and draw the next tile and add dwTileHeight in the vertical loop and draw the next row using the horizontal loop again with the new y value.

the map itself will look something like a diamond (first row starts at position y on screen, and is only 1 tile wide; next row starts at pos. y+dwTileHeightHalf and x-dwTileHeightHalf and is 1 tile wider; this continues for (xTilesOnMap + yTilesOnMap - 1) horizontal rows.
for example imagine an angled (45 deg.) rectangle with 3x3 tiles.
it has (3 + 3 - 1) = 5 rows.
the first row starts at the top. it has 1 tile.
the next row starts dwTileHeightHalf under the first row. it has 2 tiles and the first tile is shifted to the left by dwTileWidthHalf. the next row has 3 tiles, the next one 2 and the last one 1.

is that the best drawing method or are there better ones?
Posted on 2002-05-30 09:04:45 by darester
There are some very good tutorials on Gamasutra.com and GameDev.net about izometric tiles both about how to draw them and how to get tile index from mouse position.

I you can find or understand them i will try and dig out the formulas we use in our map editor but they might be specific to our game

But basically you are close ... you must use a formula that changes for even/odd rows ;)
Posted on 2002-05-30 09:28:28 by BogdanOntanu
i've already read some of the tuts at gamedev.net, the one i used to learn from was this one:
Introduction to Isometric Engines

but i didn't really understand it's drawing method.
if you look at the two pics (the one with the angled rectangle and the tile coords and the one with the tiles and their drawing number), there is something strange...
the tiles in the pic with the drawing numbers are NOT angled. but the isomap MUST be drawn ANGLED somehow, right? so if i drew the screen like it says on the pic with the drawing numbers, i'd get a rectangular map with edges on the outer areas.
but what i want is an angled rectangle like on the pic with the array coords on the tiles.
i don't know what the pic with the drawing numbers wants to tell me? it's not angled, so...what does it have to do with isometric views???
if you look back at the pic with the array coords on the tiles, in which order are these tiles drawn? i'd assume it's this order:
(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0).......
is this the right order?
if yes, i'd have to shift the next row to the left by dwTileWidthHalf till i reach the middle (on the y axis) of the map. after that, i'd had to shift the map to the right by dwTileWidthHalf pixels. the array coords for y would just be inc- or decremented.
so what is then all that trouble about the array coords? if vertical counter is odd, increase y, else increase x? excuse me? i had to do this if i went to the next row like this:
(0, 0), (1, 0), (1, 1), (2, 1), ...
but if i did that, i'd have no idea how to draw the rest of the map (horizontal)?
first row starts at (0, 0). since there's only 1 tile in this row, i go to the next.
next row would start at (1, 0). it's the last tile on this row, so go to next row.
next row: (1, 1). in this row i'd draw (1, 1) and (2, 0) and go to next row.
next row: (2, 1). draw (2, 1) and (3, 0).....
now the entire LEFT SIDE would be missing with this drawing method, since you always go from left to right, but you never really start the row from the most left tile with this method.

i hope you see my problem, i don't know how to explain it better!
Posted on 2002-05-30 10:12:01 by darester