java 在一个角度上移动一个点(向量)+ Libgdx
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17694076/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Moving a point (vector) on an angle + Libgdx
提问by Hosein
i wanna move a point (Vector2) on an angle. i have my angle. but i'm not good in math or libgdx. for getting angle i use this :
我想在一个角度上移动一个点(Vector2)。我有我的角度。但我不擅长数学或 libgdx。为了获得角度,我使用这个:
degrees = (float) ((Math.atan2(touchPoint.x - x,
-(touchPoint.y - y)) * 180.0d / Math.PI) + 240.0f);
now, i want to move vector. but i really don't know what i must do... i looked at questions but there was just somethings about changing angle, not transfer. i think there must be a function for this in libgdx. please help.
现在,我想移动向量。但我真的不知道我必须做什么...我看了问题,但只是改变角度,而不是转移。我认为在 libgdx 中必须有一个函数。请帮忙。
UPDATE :
更新 :
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);
}
回答by nEx.Software
If I am understanding your question correctly, you are looking for a direction vector?
如果我正确理解您的问题,您正在寻找方向向量?
If that is a 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();
Which will give you a normalized direction vector from the position to the touch point.
这将为您提供从位置到触摸点的归一化方向向量。
You can then scale it to the speed you want to move, then use it to update your position.
然后您可以将其缩放到您想要移动的速度,然后使用它来更新您的位置。
velocity = new Vector2(dir).scl(speed);
And on each frame, do something like this
在每一帧上,做这样的事情
movement.set(velocity).scl(deltaTime);
position.add(movement);
Update
更新
Here's how 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);
}
}
Note, you could do away with the position Vector2 and just use the x and y directly, but I like to use use a Vector2 because it is a bit cleaner.
请注意,您可以取消 Vector2 位置而直接使用 x 和 y,但我喜欢使用 Vector2,因为它更简洁一些。
回答by Paras Mittal
float dy = touchPoint.y - y;
float dx = touchPoint.x - x;
degree = Math.atan2(dy, dx) * MathUtils.radToDegree;