Jump to content
  • Advertisement
Sign in to follow this  
PaulDurbaba

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.

If you intended to correct an error in the post then please contact us.

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)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? Edited by adventurerOK

Share this post


Link to post
Share on other sites
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);
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!