# Get the Mouse Position on isometric grid.

This topic is 2278 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)

(after rotation):

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: | 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)
 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)); if(color.equals(new Color(255, 0, 0))) return new Vector2f(maskX - 1, maskY); if(color.equals(new Color(255, 255, 0))) return new Vector2f(maskX, maskY - 1); if(color.equals(new Color(0, 255, 0))) return new Vector2f(maskX, maskY + 1); if(color.equals(new Color(0, 0, 255)))return new Vector2f(maskX - 1, maskY); } catch(Exception e){} return new Vector2f(maskX, maskY); } 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); } } 

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.

 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); } 

1. 1
Rutin
24
2. 2
3. 3
JoeJ
18
4. 4
5. 5

• 38
• 23
• 13
• 13
• 17
• ### Forum Statistics

• Total Topics
631706
• Total Posts
3001835
×