Zooming in isometric engine using XNA

Posted by Yheeky on Game Development See other posts from Game Development or by Yheeky
Published on 2014-05-28T21:00:49Z Indexed on 2014/05/29 4:04 UTC
Read the original article Hit count: 240

Filed under:
|
|
|
|

I´m currently working on an isometric game engine and right now I´m looking for help concerning my zoom function. On my tilemap there are several objects, some of them are selectable. When a house (texture size 128 x 256) is placed on the map I create an array containing all pixels (= 32768 pixels). Therefore each pixel has an alpha value I check if the value is bigger than 200 so it seems to be a pixel which belongs to the building. So if the mouse cursor is on this pixel the building will be selected -> PixelCollision.

Now I´ve already implemented my zooming function which works quite well. I use a scale variable which will change my calculation on drawing all map items.

What I´m looking for right now is a precise way to find out if a zoomed out/in house is selected. My formula works for values like 0,5 (zoomed out) or 2 (zoomed in) but not for in between.

Here is the code I use for the pixel index:

var pixelIndex = (int)(((yPos / (Scale * Scale)) * width) + (xPos / Scale) + 1);

Example: Let´s assume my mouse is over pixel coordinate 38/222 on the original house texture. Using the code above we get the following pixel index.

var pixelIndex = ((222 / (1 * 1)) * 128) + (38 / 1) + 1;
               = (222 * 128) + 39
               = 28416 + 39
               = 28455

If we now zoom out to scale 0,5, the texture size will change to 64 x 128 and the amount of pixels will decrease from 32768 to 8192. Of course also our mouse point changes by the scale to 19/111. The formula makes it easy to calculate the original pixelIndex using our new coordinates:

var pixelIndex = ((111 / (0.5 * 0.5)) * 64) + (19 / 0.5) + 1;
               = (444 * 64) + 39
               = 28416 + 39
               = 28455

But now comes the problem. If I zoom out just to scale 0.75 it does not work any more. The pixel amount changes from 32768 to 18432 pixels since texture size is 96 x 192. Mouse point is transformed to point 28/166. The formula gives me a wrong pixelIndex.

var pixelIndex = ((166 / (0.75 * 0.75)) * 96) + (28 / 0.75) + 1;
               = (295.11 * 96) + 38.33
               = 28330.66 + 38.33
               = 28369

Does anyone have a clue what´s wrong in my code? Must be the first part (28330.66) which causes the calculation problem.

Thanks! Yheeky

© Game Development or respective owner

Related posts about XNA

Related posts about engine