2016-07-15 8 views
0

Я пытаюсь реализовать перемещение в точку, где была нажата мышь.зеркально перемещение по оси 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); 
    } 

} 

ответ

2

То, что вы описали, на самом деле отражено на оси Y. Причина такого поведения, скорее всего, заключается в том, что ваша матрица рисования задана таким образом, что начало координат находится в нижнем левом углу с направленной осью Y, но gui имеют начало в верхнем левом углу, Ось Y направлена ​​вниз. Поэтому, когда вы получаете позицию мыши, вы должны сделать что-то вроде:

actualPosY = screenHeight - mousePosY 

Это эффективно трансформирует положение вашей мыши в пространство рисования.

+0

Я вижу. Я забыл, что пользовательский интерфейс выглядит сверху донизу. Я думаю, я должен добавить векторное умножение вместо необработанного вычисления. – lapots

Смежные вопросы