If I understand your question correctly, are you looking for a direction vector?
If this is the correct understanding, you can do something like this:
// Declared as fields, so they will be reused Vector2 position = new Vector2(); Vector2 velocity = new Vector2(); Vector2 movement = new Vector2(); Vector2 touch = new Vector2(); Vector2 dir = new Vector2(); // On touch events, set the touch vector, then do this to get the direction vector dir.set(touch).sub(position).nor(); vector, then do this to get the direction vector // Declared as fields, so they will be reused Vector2 position = new Vector2(); Vector2 velocity = new Vector2(); Vector2 movement = new Vector2(); Vector2 touch = new Vector2(); Vector2 dir = new Vector2(); // On touch events, set the touch vector, then do this to get the direction vector dir.set(touch).sub(position).nor();
This will give you a normalized direction vector from position to touch point.
Then you can scale it up to speed, you want to move, and then use to update its position.
velocity = new Vector2(dir).scl(speed);
And on each frame do something like this
movement.set(velocity).scl(deltaTime); position.add(movement); ; movement.set(velocity).scl(deltaTime); position.add(movement);
Update
Here's what it would look like in a full class:
class Game extends ApplicationAdapter { Vector2 position = new Vector2(); Vector2 velocity = new Vector2(); Vector2 movement = new Vector2(); Vector2 touch = new Vector2(); Vector2 dir = new Vector2(); Vector3 temp = new Vector3(); float speed = 100; OrthographicCamera camera; SpriteBatch batch; Texture texture; Sprite sprite; @Override public void create () { camera = new OrthographicCamera(); camera.setToOrtho(false); batch = new SpriteBatch(); texture = new Texture(Gdx.files.internal("data/badlogicsmall.jpg")); sprite = new Sprite(texture); Gdx.input.setInputProcessor(new InputAdapter() { @Override public boolean touchDown (int screenX, int screenY, int pointer, int button) { camera.unproject(temp.set(screenX, screenY, 0)); touch.set(temp.x, temp.y); return true; } }); } @Override public void render () { Gdx.gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); update(Gdx.graphics.getDeltaTime()); batch.begin(); sprite.draw(batch); batch.end(); } @Override public void dispose() { texture.dispose(); batch.dispose(); } public void update (float deltaTime) { position.set(sprite.getX(), sprite.getY()); dir.set(touch).sub(position).nor(); velocity.set(dir).scl(speed); movement.set(velocity).scl(deltaTime); if (position.dst2(touch) > movement.len2()) { position.add(movement); } else { position.set(touch); } sprite.setX(position.x); sprite.setY(position.y); } } )); class Game extends ApplicationAdapter { Vector2 position = new Vector2(); Vector2 velocity = new Vector2(); Vector2 movement = new Vector2(); Vector2 touch = new Vector2(); Vector2 dir = new Vector2(); Vector3 temp = new Vector3(); float speed = 100; OrthographicCamera camera; SpriteBatch batch; Texture texture; Sprite sprite; @Override public void create () { camera = new OrthographicCamera(); camera.setToOrtho(false); batch = new SpriteBatch(); texture = new Texture(Gdx.files.internal("data/badlogicsmall.jpg")); sprite = new Sprite(texture); Gdx.input.setInputProcessor(new InputAdapter() { @Override public boolean touchDown (int screenX, int screenY, int pointer, int button) { camera.unproject(temp.set(screenX, screenY, 0)); touch.set(temp.x, temp.y); return true; } }); } @Override public void render () { Gdx.gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); update(Gdx.graphics.getDeltaTime()); batch.begin(); sprite.draw(batch); batch.end(); } @Override public void dispose() { texture.dispose(); batch.dispose(); } public void update (float deltaTime) { position.set(sprite.getX(), sprite.getY()); dir.set(touch).sub(position).nor(); velocity.set(dir).scl(speed); movement.set(velocity).scl(deltaTime); if (position.dst2(touch) > movement.len2()) { position.add(movement); } else { position.set(touch); } sprite.setX(position.x); sprite.setY(position.y); } } ; class Game extends ApplicationAdapter { Vector2 position = new Vector2(); Vector2 velocity = new Vector2(); Vector2 movement = new Vector2(); Vector2 touch = new Vector2(); Vector2 dir = new Vector2(); Vector3 temp = new Vector3(); float speed = 100; OrthographicCamera camera; SpriteBatch batch; Texture texture; Sprite sprite; @Override public void create () { camera = new OrthographicCamera(); camera.setToOrtho(false); batch = new SpriteBatch(); texture = new Texture(Gdx.files.internal("data/badlogicsmall.jpg")); sprite = new Sprite(texture); Gdx.input.setInputProcessor(new InputAdapter() { @Override public boolean touchDown (int screenX, int screenY, int pointer, int button) { camera.unproject(temp.set(screenX, screenY, 0)); touch.set(temp.x, temp.y); return true; } }); } @Override public void render () { Gdx.gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); update(Gdx.graphics.getDeltaTime()); batch.begin(); sprite.draw(batch); batch.end(); } @Override public void dispose() { texture.dispose(); batch.dispose(); } public void update (float deltaTime) { position.set(sprite.getX(), sprite.getY()); dir.set(touch).sub(position).nor(); velocity.set(dir).scl(speed); movement.set(velocity).scl(deltaTime); if (position.dst2(touch) > movement.len2()) { position.add(movement); } else { position.set(touch); } sprite.setX(position.x); sprite.setY(position.y); } } ()) { class Game extends ApplicationAdapter { Vector2 position = new Vector2(); Vector2 velocity = new Vector2(); Vector2 movement = new Vector2(); Vector2 touch = new Vector2(); Vector2 dir = new Vector2(); Vector3 temp = new Vector3(); float speed = 100; OrthographicCamera camera; SpriteBatch batch; Texture texture; Sprite sprite; @Override public void create () { camera = new OrthographicCamera(); camera.setToOrtho(false); batch = new SpriteBatch(); texture = new Texture(Gdx.files.internal("data/badlogicsmall.jpg")); sprite = new Sprite(texture); Gdx.input.setInputProcessor(new InputAdapter() { @Override public boolean touchDown (int screenX, int screenY, int pointer, int button) { camera.unproject(temp.set(screenX, screenY, 0)); touch.set(temp.x, temp.y); return true; } }); } @Override public void render () { Gdx.gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); update(Gdx.graphics.getDeltaTime()); batch.begin(); sprite.draw(batch); batch.end(); } @Override public void dispose() { texture.dispose(); batch.dispose(); } public void update (float deltaTime) { position.set(sprite.getX(), sprite.getY()); dir.set(touch).sub(position).nor(); velocity.set(dir).scl(speed); movement.set(velocity).scl(deltaTime); if (position.dst2(touch) > movement.len2()) { position.add(movement); } else { position.set(touch); } sprite.setX(position.x); sprite.setY(position.y); } }
Notice that you could end the position of Vector2 and just use x and y directly, but I like to use Vector2 because it is a little cleaner.