Get the Mouse Position on isometric grid.

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

Recommended Posts

I'm having trouble with finding the mouse coordinates on my isometric game. The games tiles are sent to openGL in 2d form, but rotated into isometric: (before rotation)[img]http://i.imgur.com/h0QCa.png[/img]

(after rotation):[img]http://i.imgur.com/emkpZ.png[/img]

I have access to the current player's x and y coords, the size of the tiles (128x128) the approximate render size of the tile (180x90) and the position of the mouse. I think this may be to do with the coordinate system I use as I have seen this image: [img]http://i.imgur.com/G1wYz.png[/img]| reckon the code I use to calculate the mouse position uses that system.

Here is the code to get the position: (I have coded in two methods, so I will show both)
[CODE]
public class IsometricPointSystem {
public static Vector2f pixelToIso(Vector2f pixel, int camX, int camY){
//return _pixelToIsoAlgebra(pixel, camX, camY);
return _pixelToIsoColor(pixel, camX, camY);
}

protected static Vector2f _pixelToIsoAlgebra(Vector2f pixel, int camX, int camY){

Vector2f cam = cameraCalc(camX, camY);

int x = (int) (pixel.x + cam.x);
int y = (int) (pixel.y + cam.y);
int tileWidth = Tile.TILE_ISO_WIDTH;
int tileHeight = Tile.TILE_ISO_HEIGHT;
//int tileWidth = 128;
//int tileHeight = 128;
int x0 = 144 + tileWidth/2;
int y0 = 2;
int i = (int)Math.floor( (y - y0)/(double)tileHeight - (x - x0)/(double)tileWidth );
int j = (int)Math.floor( (y - y0)/(double)tileHeight + (x - x0)/(double)tileWidth );

return new Vector2f(i, j);
}
protected static Vector2f _pixelToIsoColor(Vector2f pixel, int camX, int camY){
int tileWidth = Tile.TILE_ISO_WIDTH; //180
int tileHeight = Tile.TILE_ISO_HEIGHT; //90

Vector2f cam = cameraCalc(camX, camY);

//int playerTileX = -((camX - (Display.getWidth() / 2 - 64)) / 128);
//int playerTileY = -((camY - (Display.getHeight() / 2 - 64)) / 128);

int nx = (int) (pixel.x + cam.x) - 450;
int ny = (int) (pixel.y + cam.y) - 450;

int maskX = nx / tileWidth;
int maskY = (ny / tileHeight) * 2;

int mouseMapX = nx % tileWidth;
int mouseMapY = ny % tileHeight;

try{
Color color = new Color(TextureManager.tileMap.getRGB(mouseMapX, mouseMapY));

} catch(Exception e){}

}

public static Vector2f cameraCalc(int camX, int camY){
int playerTileX = -((camX - (Display.getWidth() / 2 - 64)) / 128);
int playerTileY = -((camY - (Display.getHeight() / 2 - 64)) / 128);

int heightPlus = 0;
int widthPlus = 0;

heightPlus += playerTileX * 45;
widthPlus -= playerTileX * 90;

heightPlus += playerTileY * 90;
widthPlus += playerTileY * 90;

return new Vector2f(widthPlus, heightPlus);
}
}
[/CODE]

Would it be possible to convert the coordinate system in the image to my coordinate system? Edited by adventurerOK

Share on other sites
Essentially copy/pasted from my code and changed to 360 for your tile size... don't ask... I spent an entire evening drawing tiles and solving equations... should have written some comments instead of thinking I'd never forget how I got there.

[code]
Vector3 screen2World(int x, int y)
{
return Vector3(scroll.x + x/zoom, scroll.y + y/zoom, 0);
}

Vec2 world2Tile(float x, float y)
{
return Vec2( (int)(x + 2*y) / 360, (int)(2*y - x) / 360 );
}

//The top left corner of the bounding box of the diamond shaped tile (ie. where you want to draw the tiles sprite)
//By reversing this you get the formula above
Vector2 tile2World(int x, int y)
{
return Vector2((x - y) * 180, (x + y) * 90);
}
[/code]

Share on other sites

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

Create an account

Register a new account

• Forum Statistics

• Total Topics
628740
• Total Posts
2984472

• 12
• 25
• 11
• 10
• 16