3 votes

Erreur de coordonnées de position du toucher LibGDX

J'utilise LibGdx et j'essaie d'utiliser leur classe Rectangle comme limite pour appuyer sur les boutons de l'écran tactile. Cela fonctionne parfaitement à l'échelle 1:1, mais lorsque je mets le jeu sur mon téléphone (avec un écran plus petit), les images sont mises à l'échelle et dessinées correctement, mais pas les Rectangles. J'ai donc essayé de garder mes Rectangles à leur échelle normale, et de "mettre à l'échelle" les coordonnées XY de l'écran tactile, mais je suppose que je ne fais pas ça correctement, car ça ne fonctionne pas.

optionsMenu = new Vector<Rectangle>();
optionsMenu.add(new Rectangle(100 + (120 * 0), 100, 100, 100));
optionsMenu.add(new Rectangle(100 + (120 * 1), 100, 100, 100));
optionsMenu.add(new Rectangle(100 + (120 * 2), 100, 100, 100));
optionsMenu.add(new Rectangle(100 + (120 * 3), 100, 100, 100));

C'est comme ça que j'initialise mes rectangles de délimitation.

C'est comme ça que j'initalise mon appareil photo :

camera = new OrthographicCamera();
camera.setToOrtho(true, 800, 480);

C'est comme ça que je dessine mes boutons :

spriteBatch.draw(buttonImage, optionsMenu.get(2).bounds.getX(), 
optionsMenu.get(2).bounds.getY(), optionsMenu.get(2).bounds.getWidth(), 
optionsMenu.get(2).bounds.getHeight(), 0, 0, buttonImage.getWidth(), 
buttonImage.getHeight(), false, true);

Et c'est comme ça que je fais ma logique d'écran tactile :

public boolean tap(float x, float y, int count, int button) {
    Vector3 temp = new Vector3(x, y, 0);
    camera.unproject(temp);

    float scalePos = (int) ((float) Gdx.graphics.getWidth()/800.0f);
    temp.x = temp.x * scalePos;
    temp.y = temp.y * scalePos;

    if(optionsMenu.get(0).bounds.contains(temp.x, temp.y)){
        //do sutff
    }

    else if(optionsMenu.get(1).bounds.contains(temp.x, temp.y)){
        //do other stuff

    }

  return false;
}

4voto

macrobug Points 487

Il y a quelques jours, j'ai rencontré le même problème. Voici ce que j'ai fait pour le résoudre :

Si vous utilisez une fenêtre d'affichage, vous devez ajouter ces données à l'écran de l'utilisateur. camera.unproject pour s'assurer que la fenêtre d'affichage est prise en compte.

Par exemple :

camera.unproject(lastTouch,viewport.x,viewport.y,viewport.width,viewport.height);

Pour déboguer les limites du rectangle et la position du toucher, j'ai utilisé cette méthode pour les dessiner à l'écran :

private static ShapeRenderer debugShapeRenderer = new ShapeRenderer();

public static void showDebugBoundingBoxes(List<Rectangle> boundingBoxes) {
    debugShapeRenderer.begin(ShapeType.Line); // make sure to end the spritebatch before you call this line
    debugShapeRenderer.setColor(Color.BLUE);
    for (Rectangle rect : boundingBoxes) {
        debugShapeRenderer.rect(rect.x, rect.y, rect.width, rect.height);
    }
    debugShapeRenderer.end();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X