2016-07-15 81 views
0

我想實現運動到一個點,鼠標點擊。鏡像x軸運動

但我有一個鏡像行爲agains 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

我明白了。我忘了從上到下的UI視圖。我想我應該添加矢量乘法而不是原始計算。 – lapots