Перемещение точки (вектора) на угол + Libgdx
Я хочу переместить точку (Vector2) на угол. у меня есть своя точка зрения. но я не силен в математике или libgdx. для получения угла я использую следующее:
degrees = (float) ((Math.atan2(touchPoint.x - x,
-(touchPoint.y - y)) * 180.0d / Math.PI) + 240.0f);
Теперь я хочу переместить вектор. но я действительно не знаю, что мне делать... я смотрел на вопросы, но было что-то в изменении угла, а не в переносе. я думаю, что для этого должна быть функция в libgdx. пожалуйста помочь.
Обновление:
public class Games implements ApplicationListener {
SpriteBatch spriteBatch;
Texture texture;
float x = 160;
float y = 5;
Vector2 touch;
Vector2 movement;
Vector2 position;
Vector2 dir;
Vector2 velocity;
float speed;
float deltaTime;
@Override
public void create() {
spriteBatch = new SpriteBatch();
texture = new Texture(Gdx.files.internal("images/1.png"));
touch = new Vector2();
movement = new Vector2();
position = new Vector2();
dir = new Vector2();
velocity = new Vector2();
speed = 5;
deltaTime = Gdx.graphics.getDeltaTime();
}
public void render() {
Gdx.gl.glClear(Gdx.gl10.GL_COLOR_BUFFER_BIT);
deltaTime += 0.5f;
spriteBatch.begin();
begin(deltaTime);
spriteBatch.draw(texture, position.x, position.y);
spriteBatch.end();
}
private void begin(float deltaTime) {
touch.set(Gdx.input.getX(), Gdx.input.getY());
position.set(x, y);
dir.set(touch).sub(position).nor();
velocity.set(dir).scl(speed);
movement.set(velocity).scl(deltaTime);
position.add(movement);
}
2 ответа:
Если я правильно понял ваш вопрос, вы ищете вектор направления?
Если это правильное понимание, вы можете сделать что-то вроде этого:
// 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();
Который даст вам нормализованный вектор направления от положения до точки касания.
Затем вы можете масштабировать его до нужной скорости, а затем использовать для обновления своей позиции.velocity = new Vector2(dir).scl(speed);
И на каждом кадре сделайте что-то вроде это
movement.set(velocity).scl(deltaTime); position.add(movement);
Обновить
Вот как это будет выглядеть в полном классе:
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); } }
Обратите внимание, что вы можете отказаться от позиции Vector2 и просто использовать x и y напрямую, но мне нравится использовать use a Vector2, потому что это немного чище.