2016-06-20 14 views
-1

Wie kann ich eine Textur (Bild) ziehen, ohne dass sie springt und sich auf den Mauszeiger zentriert (was habe ich unten in meinem Code)?Ziehen einer Textur (ohne Sprung)

Wenn ich auf die Textur klicke, sollte nichts passieren, und wenn ich ziehe, sollte der Mauszeiger an Ort und Stelle bleiben (relativ zu den Rändern der Textur).

Beispiel: https://s31.postimg.org/ojapwbj6j/Untitled_1.jpg

SpriteBatch batch; 
Texture texture; 
OrthographicCamera camera; 
Vector3 spritePosition = new Vector3(); 

float offsetX, offsetY; 
Vector3 input; 

@Override 
public void create() { 

    batch = new SpriteBatch(); 
    texture = new Texture("badlogic.jpg"); 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false); 

} 

@Override 
public void render() { 
    Gdx.gl.glClearColor(1, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    batch.begin(); 
    batch.draw(texture, spritePosition.x, spritePosition.y); 
    batch.end(); 

    if (Gdx.input.justTouched()){ 

      int x1 = Gdx.input.getX(); 
      int y1 = Gdx.input.getY(); 
      input = new Vector3(x1, y1, 0); 
      camera.unproject(input); 

      offsetX = x1 - spritePosition.x; 
      offsetY = y1 - spritePosition.y; 

    } 

    if (Gdx.input.isTouched()) { 

     spritePosition.set(Gdx.input.getX() - offsetX, Gdx.input.getY() - offsetY, 0); 

    } 

} 

Antwort

0

Was Sie tun müssen, ist herauszufinden den Versatz der Mausposition relativ zu Ihrem Bild und subtrahieren, dass, anstatt die Hälfte der Breite/Höhe wie Sie tun, um der Moment.

Hier einige sehr grobe Pseudo-Code zu zeigen, was ich meine - Sie werden als Java neu schreiben müssen ...

if Gdx.input.justTouched { 
    get mouse position from Gdx.input 
    camera.unproject it into cameraX and cameraY 
    offsetX = cameraX - imageX 
    offsetY = cameraY - imageY 
} 

if Gdx.input.isTouched { 
    spritePisition.set(Gdx.input.getX() - offsetX, Gdx.input.getY - offsetY) 
} 
+0

Ich habe meinen Code entsprechend Ihrer Antwort bearbeitet. Aber ich bekomme das halbe Ergebnis :) Bitte überprüfen Sie diese aktualisierte gif: https://s31.postimg.org/lg8nu0u2z/Animation.gif – Beckham

+0

Die y-Achse ist invertiert, weil das physikalische Koordinatensystem unterscheidet sich von den logischen Koordinaten (one's y -Down und das andere ist y-up). Verwenden Sie entweder camera.unproject (das sollte es beheben) oder subtrahieren Sie die y-Position von der Höhe des Bildschirms, um es effektiv zu invertieren. –

0

Warum verwenden Sie camera.unproject?

Versuchen Sie folgendes:

Override 
public void render() { 
    Gdx.gl.glClearColor(1, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    batch.setProjectionMatrix(camera.combined); 
    batch.begin(); 
    batch.draw(texture, spritePosition.x, spritePosition.y); 
    batch.end(); 

    if (Gdx.input.isTouched()) { 
     spritePosition.set(Gdx.input.getX() - texture.getWidth()/2, Gdx.input.getY() + texture.getHeight()/2, 0); 
    } 

} 
+0

Die Mausposition in der physikalischen (dh Bildschirmpixel) koordiniert, so sollte er Kamera verwenden. unproject, um das in logische Koordinaten zu verwandeln. –

+0

Auch wenn er nie die Kamera bewegt? – IronMonkey

+0

Ja. Verschiedene Koordinatensysteme. –