Mouse click coord in 2D

Started by
6 comments, last by Darkening 24 years, 3 months ago
I''m starting a new tile engine and I already did the graphic part. Now I need to perfect the user input. I would like to know how I can know on which tile coord the user clicked in an isometric tile engine and in a tile rectangle engine. I would also like to know how I could highlight the border of a tile to give more feedback to the user. I suppose it''s not very difficult after you know how to take the mouse coord to the world coord.
---------------------------Unfortunately, no one can be told what a bug is.You have to see it for yourself...
Advertisement
Create a bitmap of a diamond with the same shape as your tiles. Give each distinct section it''s own color. Now when you click on a tile, you superimpose that mask bitmap(but don''t display it to the screen) and check to see what color the mouse is in, then you know which cell you are in. That''s the basic principle, sorry that I am not to clear in this description.
Its a little too detailed to put in one post so it may not make much sense but another way that I did it is to isolate the click to a rectangular area (the rectangle of the isometric tile, the corners being transparent when blitted) and then compare against the slope of the tile to determine if the click was in that tile or the adjacent one.
Does anyone has a tutorial for this or some examples I could look at ?
---------------------------Unfortunately, no one can be told what a bug is.You have to see it for yourself...
There is a really good tutorial written by TANSTAFL (or however its spelt) in the Isometric game programming section here on GameDev. It talks about Mouse Maps. I''ve just used it to implement in my engine and it works very well. Just remember that there''s no real need to store the mouse map as an RGB bitmap -- a gray scale is good enough.
For rectangular tile engines, here''s how you find out which tile the user clicked on. You need to know this information to start with:

- map position of top-left cell [mappos]
- screen position of top-left map cell (usually 0,0) [topleft_screen]
- tile width [tile_w]
- tile height [tile_h]

Here''s how.

typedef struct {  int x;  int y;} vec_2d;// converts screen coordinates to map coordinatesvec_2d WhereMap (int screen_x, int screen_y){  vec_2d pos;  pos.x = mappos.x + (screen_x - topleft_screen.x) / tile_w;  pos.y = mappos.y + (screen_y - topleft_screen.y) / tile_h;  return (pos);} 

I dunno about isometric calculations, better listen to other people on that one

For highlighting a tile, you just need to modify the above function to something like this:
// snaps coordinates to upper left of current tilevec_2d WhereHighlight (int screen_x, int screen_y){  vec_2d pos;  pos.x = topleft_screen.x + ((screen_x - topleft_screen.x) / tile_w) * tile_w;  pos.y = topleft_screen.y + ((screen_y - topleft_screen.y) / tile_h) * tile_h;  return (pos);} 

This gives you the upper left screen coordinate. To get the lower right coordinate, you add (tile_w - 1) and (tile_h - 1) to the X and Y coordinates, respectively. Use these 4 coordinates to draw a rectangle.

(note that the rectangle is drawn INSIDE the borders of the tile. To avoid this is pretty simple, just add/subtract 1 from the coords)
heh, why is it that when I answer a question in depth, all discussion immediately STOPS on the topic? my answer too good or something, nobody can find a flaw?? (or nobody cares, heh)

...
I just dont like you !!!

kidding !!

stay well

bruno sousa (akura)
It's good to be an outcast, you don't need to explain what you do, you just do it and say you don't belong there.

This topic is closed to new replies.

Advertisement