Перемещение точки (вектора) под углом + 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);
}

person Hosein    schedule 17.07.2013    source источник


Ответы (1)


Если я правильно понимаю ваш вопрос, вы ищете вектор направления?

Если это правильное понимание, вы можете сделать что-то вроде этого:

// 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 напрямую, но мне нравится использовать Vector2, потому что это немного чище.

person nEx.Software    schedule 17.07.2013
comment
Я делаю то, что вы когда-либо говорили, но есть проблема. я не могу добраться до метода scl(...). как называется библиотека для этого метода? - person Hosein; 18.07.2013
comment
это были мои библиотеки. Я просто скачал последнюю версию и исправил. но не двигается. я обновляю свой код. - person Hosein; 18.07.2013
comment
так что моя проблема была в deltaTime. я не обновлял его. после обновления заработало хорошо. Спасибо. p.s.: но если у вас есть лучший способ обновить его, просто скажите мне: D - person Hosein; 18.07.2013
comment
хм.... не знаю, но это не сработало для низкого пресса. я имею в виду, если я нажму на места выше 50 в работе. но для x = 5 это не работает. он идет где-то вверху, не в том месте. - person Hosein; 18.07.2013
comment
Обновлен мой ответ, чтобы показать, как это будет выглядеть в полном классе. - person nEx.Software; 18.07.2013
comment
это было прекрасно. большое спасибо. Я знаю, ты ответил на мой вопрос. но не могли бы вы прокомментировать функцию обновления для меня? Я не понимаю некоторые из этих кодов. и еще вопрос, если я хочу, чтобы мой texture стартовал с другой позиции (не 0, 0), где я должен это сделать? - person Hosein; 19.07.2013
comment
Вы должны изменить touch.set(temp.x, temp.y); to touch.set(temp.x-sprite.getWidth()/2, temp.y-sprite.getHeight()/2); для сенсорного спрайта - person Emre Koç; 13.04.2014