Get the Mouse Position on isometric grid.

Started by
0 comments, last by Trienco 12 years ago
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)h0QCa.png

(after rotation):emkpZ.png

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: G1wYz.png| 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?
Advertisement
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);
}
f@dzhttp://festini.device-zero.de

This topic is closed to new replies.

Advertisement