2011-11-12 3 views
5

J'essaie de faire apparaître un objet à l'endroit où la personne a touché la dernière fois. Cependant quand j'essaye de faire ainsi il apparaît au mauvais endroit. Je suppose que cela est dû au fait que les coordonnées que l'entrée revient est différent aux coordonnées d'affichage, mon code est le suivant:Appliquer le pixel Coordonnée aux coordonnées de l'écran

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; 

} 
    } 

Je recadrée ce code pour l'amour de simplicty. Je a également fait une vidéo montrant le bug: http://www.youtube.com/watch?v=m89LpwMkneI

Répondre

27

Camera.unproject convertit les coordonnées écran coordonnées du monde.

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

Cela devrait être la bonne réponse. – HAL9000

+0

Essayé la solution acceptée, mais il devient vraiment lourd une fois que votre résolution d'écran change. C'est la voie à suivre si vous ne voulez pas réécrire tous les calculs nécessaires. – MxyL

+0

J'ai changé la réponse acceptée. Cela a été posté après que j'accepte la première réponse. – Derek

1

Tout d'abord, Gdx.input.getX() et Gdx.input.getY() retour "coordonnées de l'écran". Vous voulez les transformer en "coordonnées de caméra". Les coordonnées de l'écran ont généralement (0,0) dans le coin supérieur gauche de la fenêtre. Je pense que les coordonnées de votre caméra ont (0,0) dans le coin inférieur gauche (libgdx ou opengl le font). Votre vidéo semble suggérer que cela est vrai. Vous devrez donc multiplier la valeur Y par -1. Deuxièmement, je soupçonne que l'échelle de l'écran est différente de l'échelle de la caméra. Je pense que vous pouvez corriger l'échelle en multipliant par (monde/écran). Disons que votre écran a une largeur = 800, hauteur = 600 et votre monde a une largeur = 480 hauteur = 320. Ensuite, votre nouveau X, Y pour l'image-objet doit être:

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

Pourquoi avez-vous ajouté des barres obliques inverses avant les étoiles? – HAL9000

0

vous devriez vérifier vos cordons tactiles.

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

ici touchx et chatouilleux sont vos x d'entrée et entrée variables y puis faire le calcul où le toucher doit travailler comme si u touché x = 100, y = 100

et touchx est à venir 120 et y toucher est à venir 120

soo dans votre méthode de mise à jour ce faire

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

Je pense e est aidera

0

je me suis dit la taille de l'écran/rapport de jeu et à la multipliai taille de l'écran:

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

pour une largeur d'écran de 1024 pixels

Il doit y avoir un moyen plus facile mais cela fonctionne pour moi.

Questions connexes