Picking a tile on a STAGGERED isometric map

Started by
4 comments, last by GeniusPooh 11 years, 4 months ago
Hello!
I have been looking and trying for quite a while now, but can't seem to work out an algorithm for figuring out which tile is selected on a staggered isometric map using 64x32 tiles with a diamond shape inside.

Here is a pic of my map...
IsoStaggeredMap.png

The first row is drawn, then the x is offset to the right by 32 and the next row is drawn.

Anyone have any good math skills to throw some algorithms my way for this?
Thanks for any help!

PS: My math isn't exactly top notch, so please keep that in mind. smiley.gif
Advertisement

Hello!
I have been looking and trying for quite a while now, but can't seem to work out an algorithm for figuring out which tile is selected on a staggered isometric map using 64x32 tiles with a diamond shape inside.

Here is a pic of my map...
IsoStaggeredMap.png

The first row is drawn, then the x is offset to the right by 32 and the next row is drawn.

Anyone have any good math skills to throw some algorithms my way for this?
Thanks for any help!

PS: My math isn't exactly top notch, so please keep that in mind. smiley.gif



I think you must clarify your message first....

at first what's your selection? by screen space? , select my coordination??

Beauty is only skin deep , ugly goes to bones

World's only 3D engine tunner and 3D engine guru.

and real genius inventor :) but very kind warm heart .. and having serious depression for suffering in Korea

www.polygonart.co.kr ( currently out dated and only Korean will change to English and new stuff when I get better condition :) sorry for that)

Thanks for the reply,

Looking to see which tile is clicked by the mouse using the mouse x,y coordinates. There isn't any offsets, so screen 0,0 is map 0,0.

Thanks for the reply,

Looking to see which tile is clicked by the mouse using the mouse x,y coordinates. There isn't any offsets, so screen 0,0 is map 0,0.



hmm you must define your projection is perspective or ortho..


projection space map to -1 to 1 range ..

so what you need to is map screen space (2d window position) to projection space.. (example 0~1280 x coordination to -1 ~ 1 )

Orthogonal space is so easy but in perspective one? you must make ray from view and check it with tile

ray can be made near plane then check it unfortunally ray can be very unaccurate you must fix it..

anyway it's simple but not common to know..

any other help need plz let me know :)

Beauty is only skin deep , ugly goes to bones

World's only 3D engine tunner and 3D engine guru.

and real genius inventor :) but very kind warm heart .. and having serious depression for suffering in Korea

www.polygonart.co.kr ( currently out dated and only Korean will change to English and new stuff when I get better condition :) sorry for that)

I appreciate the help. It being the work week, I didn't get a chance to really put some time into any solution and I definitely am not going to post the embarassing hack I was attempting.
I did get a plug and play solution involving some math equations that are quite a bit beyond me that I will post for anyone running into the same situation. It works great!

dawsonk
http://www.kirupa.com/forum/showthread.php?376083-Picking-Tile-in-staggered-isometric-map
Maybe try something like this...

var tileW = 64;
var tileH = 32;
var rows = 8;
var cols = 4;
for (var i = 0; i < rows; ++i) {
for (var j = 0; j < cols; ++j) {
tTile = _root.attachMovie("Tile", "R" + i + "C" + j, _root.getNextHighestDepth());
tTile._x = (tileW * j) + ((i % 2 == 1) ? 32 : 0);
tTile._y = (tileH / 2) * i;
}
}
onMouseDown = function () {
var ax, ay, bx, by;
var cx = _xmouse;
var cy = _ymouse;
var posX = (_xmouse / 32) >> 0;
var posY = (_ymouse / 16) >> 0;
if ((posX % 2) == (posY % 2)) {
ax = (posX) * 32;
ay = (posY + 1) * 16;
bx = (posX + 1) * 32;
by = (posY) * 16;
if (getPos(ax, ay, bx, by, cx, cy) < 0) {
trace(((posY / 1 >> 0) - 1) + " : " + ((posX / 2 >>0) + ((((posY / 1 >> 0) - 1) % 2 == 0) ? 0 : -1)));
} else {
trace((posY / 1 >> 0) + " : " + (posX / 2 >> 0));
}
} else {
ax = (posX) * 32;
ay = (posY) * 16;
bx = (posX + 1) * 32;
by = (posY + 1) * 16;
if (getPos(ax, ay, bx, by, cx, cy) < 0) {
trace(((posY / 1 >> 0) - 1) + " : " + (posX / 2 >>0));
} else {
trace((posY / 1 >> 0) + " : " + ((posX / 2 >> 0) +((((posY / 1 >> 0) - 1) % 2 == 0) ? -1 : 0)));
}
}
};
function getPos($ax, $ay, $bx, $by, $cx, $cy) {
// below = 1, above = -1, on = 0;
var slope = ($by - $ay) / ($bx - $ax);
var yIntercept = $ay - $ax * slope;
var cSolution = (slope * $cx) + yIntercept;
if (slope != 0) {
if ($cy > cSolution) {
return $bx > $ax ? 1 : -1;
}
if ($cy < cSolution) {
return $bx > $ax ? -1 : 1;
}
return 0;
}
return 0;
}
If screen space and tile space is so same

It's so easy..

just think about matching tile and screen.

and what you first to do is checking mouse input with tile world's coordination.

Mouse position must well transfomed tile world's position..

after that you must check with tile's position with mouse's position

I first think your game in 3D , but I think it's not..

Beauty is only skin deep , ugly goes to bones

World's only 3D engine tunner and 3D engine guru.

and real genius inventor :) but very kind warm heart .. and having serious depression for suffering in Korea

www.polygonart.co.kr ( currently out dated and only Korean will change to English and new stuff when I get better condition :) sorry for that)

This topic is closed to new replies.

Advertisement