Forum Thread
  Posts  
Character Rotation Based On Mouse (Forums : Coding & Scripting : Character Rotation Based On Mouse) Locked
Thread Options
Jan 26 2013 Anchor

How would I rotate an image in Slick2D to point to the mouse at all times?

Jan 26 2013 Anchor

get the direction vector pointing from the character to the mouse via vector subtraction then convert it to an angle via atan2

Jan 26 2013 Anchor

Still doesn't work. Here's the source code:

package main;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Vector2f;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class StatePlay extends BasicGameState
{
	private int id;
	private Vector2f mapPosition, playerPos, mousePos;
	private Image map;
	private float cameraX = 0, cameraY = 0, mouseX = 0, mouseY = 0, diffX = 0, diffY = 0, cameraX2 = 0, cameraY2 = 0;
	private Image player;
	
	public StatePlay(int id)
	{
		this.id = id;
	}

	@Override
	public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
	{
		mapPosition = new Vector2f(0, 0);
		playerPos = new Vector2f (590, 360);
		mousePos = new Vector2f (gc.getInput().getMouseX(), gc.getInput().getMouseY());
		map = new Image("res/backGround.png");
		player = new Image("res/player.png");
	}

	@Override
	public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
	{
		g.translate(-cameraX, -cameraY);
		g.translate(-cameraX2, -cameraY2);
		g.drawImage(map, mapPosition.x, mapPosition.y);
		g.drawImage(player, playerPos.x, playerPos.y);
	}
	@Override
	public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
	{
		Input input = gc.getInput(); 
		mousePos.x = input.getMouseX();
		mousePos.y = input.getMouseY();
		diffX = mouseX - gc.getWidth();
		diffY = mouseY - gc.getHeight();
		cameraX = playerPos.x - gc.getWidth() * 0.4f;
		cameraY = playerPos.y - gc.getHeight() * 0.4f;
		cameraX2 = diffX * 0.06f;
		cameraY2 = diffY * 0.06f;
		
		if (input.isKeyDown(Input.KEY_A))
		{
			playerPos.x -= 3;
		}
		if (input.isKeyDown(Input.KEY_W))
		{
			playerPos.y -= 3;
		}
		if (input.isKeyDown(Input.KEY_S))
		{
			playerPos.y += 3;
		}
		if (input.isKeyDown(Input.KEY_D))
		{
			playerPos.x += 3;
		}
		Vector2f degrees = playerPos.sub(mousePos);
		player.setRotation((float) Math.atan2(degrees.y, degrees.x));
	}

	@Override
	public int getID()
	{
		return id;
	}
}
Jan 26 2013 Anchor

oh I forgot to mention you also need to normalize the vector before you atan2 it.

If it still doesnt work one common issue is to make sure tha the rotation angle format and your input format match. AKA Radians vs Degrees.

Here's an example function I did for getting the direction vector:

		
		public static function GetNormalizedDirectionVector(vec1X:Number, vec1Y:Number, vec2X:Number, vec2Y:Number):DoVector2f
		{
			vec1X = vec2X - vec1X  ;
			vec1Y = vec2Y - vec1Y;
			var ret: DoVector2f = new DoVector2f();
			ret.x = vec1X;
			ret.y = vec1Y;
			ret.Normalize();
			return ret;
		}

This tutorial might also be of help to you :

Lashf.com

Jan 26 2013 Anchor

Can you repost that in java form?

Jan 27 2013 Anchor

It would be exactly the same except for the function declaration.

public static function GetNormalizedDirectionVector(vec1X:Number, vec1Y:Number, vec2X:Number, vec2Y:Number):DoVector2f

would become something like

public Vector2 GetNormalizedDirectionVector(float vec1X, float vec1Y,float vec2X,float vec2Y)

Reply to thread
click to sign in and post

Only registered members can share their thoughts. So come on! Join the community today (totally free - or sign in with your social account on the right) and join in the conversation.