反映x轴运动

时间:2016-07-15 09:23:52

标签: java math vector libgdx

我正在尝试将动作移动到点击鼠标的位置。

但是X轴的镜像行为有问题。 当我点击顶部 - >当我点击底部时,它会移动到底部 - >它移到了顶部。

这是例如原始位置 enter image description here

我用红叉点击屏幕上的位置。 enter image description here

但它向下移动(如箭头所示)。

有什么问题?这似乎与我认为的运动矢量有关。

public class Player {

    private static final float PLAYER_CIRCLE_RADIUS = 24f;
    private static final float MOVEMENT_SPEED = 200f;
    private final Circle playerCircle;

    private Vector2 direction = new Vector2();
    private Vector2 position;
    private Vector2 velocity = new Vector2();
    private Vector2 movement = new Vector2();
    private Vector2 mouseClick = new Vector2();

    public Player(float x, float y) {
        position = new Vector2(x, y);
        playerCircle = new Circle(x, y, PLAYER_CIRCLE_RADIUS);
    }

    public void draw(ShapeRenderer shapeRenderer) {
        shapeRenderer.circle(position.x, position.y, playerCircle.radius);
    }

    public void update(float delta) {
        movement.set(velocity).scl(delta);
        if (position.dst2(mouseClick) > movement.len2()) { position.add(movement); }
        else { position.set(mouseClick); }
    }

    public void setDirection(float x, float y) {
        mouseClick.set(x, y);
        direction.set(mouseClick).sub(position).nor();
        velocity.set(direction).scl(MOVEMENT_SPEED);
    }

    public Vector2 getDirection() {
        return direction;
    }

    public Circle getPlayerCircle() {
        return playerCircle;
    }

    public Vector2 getMouseClick() {
        return mouseClick;
    }
}


public class GameScreen extends ScreenAdapter {

    private static final float WORLD_WIDTH = 640;
    private static final float WORLD_HEIGHT = 480;

    private ShapeRenderer shapeRenderer;
    private Viewport viewport;
    private Camera camera;

    private Player player;
    private Destination dest;

    @Override
    public void render(float delta) {
        clearScreen();
        update(delta);
        shapeRenderer.setProjectionMatrix(camera.projection);
        shapeRenderer.setTransformMatrix(camera.view);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);

        dest.draw(shapeRenderer);
        player.draw(shapeRenderer);

        shapeRenderer.end();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

    @Override
    public void show() {
        camera = new OrthographicCamera();
        camera.position.set(WORLD_WIDTH / 2, WORLD_HEIGHT / 2, 0);
        viewport = new FitViewport(WORLD_WIDTH, WORLD_HEIGHT, camera);
        shapeRenderer = new ShapeRenderer();

        player = new Player(WORLD_WIDTH / 2, WORLD_HEIGHT / 2);
        dest = new Destination();

        Gdx.input.setInputProcessor(new InputAdapter() {

            @Override
            public boolean touchDown(int screenX, int screenY, int pointer, int button) {
                dest.setPosition(screenX, screenY);
                camera.unproject(new Vector3(screenX, screenY, 0));
                player.setDirection(screenX, screenY);
                return true;
            }

        });
    }

    private void clearScreen() {
        Gdx.gl.glClearColor(Color.BLACK.r, Color.BLACK.g, Color.BLACK.b, Color.BLACK.a);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    }

    private void update(float delta) {
        player.update(delta);
    }

}

1 个答案:

答案 0 :(得分:2)

您描述的内容实际上是在Y轴上镜像的。 这种行为的原因很可能是你的绘图矩阵的设置方式使得原点位于左下角,Y轴朝上,但是gui的原点位于左上角Y轴朝下的角落。因此,当您获得鼠标位置时,您应该执行以下操作:

actualPosY = screenHeight - mousePosY

这可以有效地将鼠标位置转换为绘图空间。