Sign in to follow this  
Xyle

Picking a tile on a STAGGERED isometric map

Recommended Posts

Xyle    180
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...
[img]http://i195.photobucket.com/albums/z47/Xyled777/IsoStaggeredMap.png[/img]

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. [img]http://www.java-gaming.org/Smileys/default/smiley.gif[/img]

Share this post


Link to post
Share on other sites
GeniusPooh    161
[quote name='Xyle' timestamp='1355714347' post='5011485']
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...
[img]http://i195.photobucket.com/albums/z47/Xyled777/IsoStaggeredMap.png[/img]

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. [img]http://www.java-gaming.org/Smileys/default/smiley.gif[/img]
[/quote]


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

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

Share this post


Link to post
Share on other sites
Xyle    180
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.

Share this post


Link to post
Share on other sites
GeniusPooh    161
[quote name='Xyle' timestamp='1355723043' post='5011553']
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.
[/quote]


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 :)

Share this post


Link to post
Share on other sites
Xyle    180
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...
[code]
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;
}[/code]

Share this post


Link to post
Share on other sites
GeniusPooh    161
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..

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this