2011-11-12 31 views
5

Estoy tratando de hacer que un objeto aparezca donde la persona tocó por última vez. Sin embargo, cuando intento hacerlo, aparece en el lugar equivocado. Asumo que esto es debido al hecho de las coordenadas que devuelve la entrada es diferente a las coordenadas de la pantalla, mi código es el siguiente:Aplicar coordenadas de píxeles a Coordenadas de pantalla

public class Core implements ApplicationListener, InputProcessor 
      { //Has to be here otherwise the code formatting becomes buggy 


private Mesh squareMesh; 
private PerspectiveCamera camera; 
private Texture texture; 
private SpriteBatch spriteBatch; 
Sprite sprite; 
float moveX = 0; 


private final Matrix4 viewMatrix = new Matrix4(); 
private final Matrix4 transformMatrix = new Matrix4(); 

@Override 
public void create() 
{ 
    Gdx.input.setInputProcessor(this); 


    texture = new Texture(Gdx.files.internal("door.png")); 

    spriteBatch = new SpriteBatch(); 
    sprite = new Sprite(texture); 
    sprite.setPosition(0, 0); 
    viewMatrix.setToOrtho2D(0, 0, 480, 320); 

    float x = 0; 
    float y = 0; 

} 

@Override 
public void dispose() 
{ 
} 

@Override 
public void pause() 
{ 
} 

@Override 
public void render() 
{ 
    viewMatrix.setToOrtho2D(0, 0, 480, 320); 
    spriteBatch.setProjectionMatrix(viewMatrix); 
    spriteBatch.setTransformMatrix(transformMatrix); 
    spriteBatch.begin(); 
    spriteBatch.disableBlending(); 
    spriteBatch.setColor(Color.WHITE); 

    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 


    //spriteBatch.draw(texture, 0, 0, 1, 1, 0, 0, texture.getWidth(), 
    //  texture.getHeight(), false, false); 
    sprite.draw(spriteBatch); 
    spriteBatch.end(); 
    update(); 
} 

@Override 
public void resize(int width, int height) 
{ 
    float aspectRatio = (float) width/(float) height; 
    camera = new PerspectiveCamera(67, 2f * aspectRatio, 2f); 

} 

@Override 
public void resume() 
{ 
} 

public void update() 
{ 

    float delta = Gdx.graphics.getDeltaTime(); 

    if(Gdx.input.isTouched()) 
    { 
     Vector3 worldCoordinates = new Vector3(sprite.getX(), sprite.getY(), 0); 
     camera.unproject(worldCoordinates); 
     sprite.setPosition(Gdx.input.getX(), Gdx.input.getY()); 

     float moveX = 0; 
     float moveY = 0; 

} 
    } 

Coseché este código en aras de simplicty. También hice un video que demuestra el error: http://www.youtube.com/watch?v=m89LpwMkneI

Respuesta

27

Camera.unproject convierte coordenadas de pantalla a coordenadas mundo.

Vector3 pos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0); 
camera.unproject(pos); 
sprite.setPosition(pos.x, pos.y); 
+1

Esta debería ser la respuesta correcta. – HAL9000

+0

Intenté la solución aceptada, pero se vuelve muy engorroso una vez que cambia la resolución de su pantalla. Este es el camino a seguir si no desea reescribir todos los cálculos requeridos. – MxyL

+0

He cambiado la respuesta aceptada. Esto fue publicado después de que aceptaría la primera respuesta. – Derek

1

En primer lugar, Gdx.input.getX() y Gdx.input.getY() Devuelve "coordenadas de la pantalla". Desea transformarlos en sus "coordenadas de la cámara". Las coordenadas de pantalla suelen tener (0,0) en la esquina superior izquierda de la ventana. Creo que las coordenadas de su cámara tienen (0,0) en la esquina inferior izquierda (ya sea libgdx o opengl están haciendo eso). Tu video parece sugerir que esto es cierto. Entonces necesitarás multiplicar el valor de Y por -1. En segundo lugar, sospecho que la escala de la pantalla es diferente de la escala de la cámara. Creo que puedes arreglar la escala multiplicando por (mundo/pantalla).

Digamos que su pantalla tiene ancho = 800, alto = 600 y su mundo tiene ancho = 480 alto = 320. Entonces su nueva X, Y de tu sprite debe ser:

X = Gdx.input.getX()*(480/800) 
Y = Gdx.input.getY()*(320/600)*-1 
+0

¿Por qué se agregaron barras diagonales inversas antes que las estrellas? – HAL9000

0

debe comprobar su contacto cordinates.

Gdx.app.log("", "hello x"+touchx); 
Gdx.app.log("", "hello x"+touchy); 

aquí touchx y delicado son las variables de entrada X y Y de entrada luego hacer el cálculo, donde táctil debería funcionar como si u tocó x = 100, y = 100

y touchx está viniendo 120 y toque y viene 120

Soo en su método de actualización de hacer esto

sprite.setPosition(Gdx.input.getX()-20, Gdx.input.getY()-20); 

Creo º es ayudará

0

me di cuenta de la relación de tamaño de la pantalla/de mesa y multiplicado al tamaño de pantalla actual:

rect.x = ((((1024/Gdx.graphics.getWidth())) * Gdx .graphics.getWidth())

para un ancho de 1024 píxeles

tiene que haber una manera más fácil sin embargo, esto funciona para mí.

Cuestiones relacionadas