2D game and projection

Started by
2 comments, last by Martin Perry 9 years, 9 months ago

I am doing 2D platformer game with single screen. For now, I am using classic ortho projection mapped to box with [0,0] - [w, h] of the screen and cetered to put world coordinates point (0,0) to bottom left corner of my screen.

Now I have problem witch changing resolution, my game looks different on every one if I calculate world coordinates to match pixels. So obviously not a way to go.

What is a correct way? I want to have constant world coordinates on every device and always put everything onto the screen (considering same AR.. for different AR I just will see more sky, but I need to have constant width).

Advertisement

In pseudo code, I do something like this:


widthratio = screenwidth / levelwidth
levelResize(widthratio)

First, my screen resolution is divided against the native width of my level. This gives me the ratio I need to either shrink or stretch the level and make it fit within the width of the screen. Next, I call a method I created which handles the resizing. This method is also responsible for figuring out the correct thing to do with the height, and it also shrinks everything on the screen according to the widthratio. That's a simplification of how I handle it. Don't know if it will work for you, but thought I'd share how I approached the same type of problem.

Your othro projection width will be fixed to your world size. To handle the aspect ratio difference, you just need to calculate the height of your projection.

you want the screen aspect ratio to match the world aspect ratio

worldWidth/worldHeight = screenWidth/screenHeight

solve for worldHeight

worldHeight = screenHeight * worldWidth / screenWidth

My current game project Platform RPG

For now, I am using this projection matrix (LH)

zFar = 1

zNear = -1

width = screen width

height = screen height


m.M[0][0] = 2.0f / width;
m.M[1][1] = 2.0f / height;
m.M[2][2] = -2.0f / (zFar - zNear);
m.M[3][2] = (zFar + zNear)  / (zFar - zNear); //for RH -1*
m.M[3][3] = 1;

So... I should change height to "screenHeight * worldWidth / screenWidth" ?

This topic is closed to new replies.

Advertisement