[Solved] Slick 2D Game Scaling and Rotating Problems

I have just finished the mouse input for my game. My “player” sprite will always look at the mouse position. I am now trying to set up a zoom and translate to center the “player” sprite. I want to have it so when the sprite moves, it will stay exactly center in the frame. I sort of have one working, but when I start moving around, the mouse part gets all screwed up. Also, I can’t get it perfectly centered in the frame. Is there some kind of formula, or do I have to eye it out.

Edit: Solved!

My old atan2 function used the center of the sprite minus the mouse position to get the rotation. It worked fine when it was in the center, but when I moved around with the sprite, it got messed up.
My new atan2 function uses the center of the screen (400 x 300 in my case) minus the mouse points to get the rotation. Works fine now.

I’m guessing the problem is the offset, but we would need some more info or pics or vids or whatever

hard to guess whats wrong, if you only say “it gets screwed up” =D

The first part shows the way it’s supposed to be, then it shows the corners, where it gets messed up.

yeah its exactly what I said, you need to add/subtract the camera position from the calculation

the sprites location should absolute, the camera moves and the mouse location is local… so whenever you have mouseX and mouseY you have to add the camera/offset x and y

maybe clearer: when you use the mouse location values, you have to use the mouse’s absolute position on the map, not local position on the screen

and that is camera.x + local mouse position.x and y the same

How do I get absolute positioning compared to screen positioning?

[quote]and that is camera.x + local mouse position.x and y the same
[/quote]

What do I use for camera.x? I tried getting the x in g.translate(x, y), but that just messed it up completely.

so you are using g translate in this example huh

well that value that you have translated g in total plus or minus you have to add to mouse

Okay, I will.

[quote]so you are using g translate in this example huh
[/quote]
So, there is another way of doing it? g.translate() is the only way I know how.

Ah, works now. Still, is there a better way than g.translate() that I should know about?

Well thats not really how I would do it.

all my objects have absolute locations on the map

then you have a camera, which is just a rectangle with the size of the screen
you move the player and adjust the camera to look at the player

now at rendering you render everything with that camera.

first, to not render stuff that wouldn’t be on the screen, you say, well is the object inside the camera
basically camera.intersects(object)
and for every object that is, you render it with its absolute location minus the camera’s location

It’s just a concept that came to me naturally and I have been using it every since, it’s not a way I read somewhere - but it might be the same or very similar to “what you’re supposed to do”

anyway, using this you can also have parallax scrolling with layers and different cameras easily, as well as scenes in which the camera would look/shift to something other than the player

That is interesting, but how do you make it so the screen is only inside the rectangle.

in Slick? setClip on the given Graphics object inside a render method :slight_smile:

never used that.

Like I said, every object/sprite is rendered at absolute location minus camera location

Me too, at least not for camera issues :wink:

(More like split screen stuff or for my map editor)

So the rectangle follows the camera, not vice versa?

I think I get it now, I was in a completely different mindset. I was focused on the canvas moving around, instead of the objects moving around dynamically to the “camera”. Thanks for the tips, I’ll see how it works.

Its easier to visualize if you have a real world example. Remember Warcraft 2? You have the large map and the minimap. On this minimap you see a rectangle which you can move around to see that part of the larger map.

The minimap is your entire world, the ‘main game area’ is your canvas.

The rectangle in the minimap still perpetuates the “camera” idea. Imagine the minimap rectangle is stuck in the center of the minimap, and the entire map scrolls to fit the visible part within that rectangle. That’s how the camera works: your camera never moves, you simply move the whole world into view.

Then you will see that it is not the spoon that bends, but yourself :slight_smile: