différences de système de coordonnées libgdx entre le rendu et l'entrée tactile
J'ai un écran (BaseScreen implémente l'interface de l'Écran) qui rend une image PNG. Sur le clic de l'écran, il se déplace le caractère à la position touché (à des fins de test).
public class DrawingSpriteScreen extends BaseScreen {
private Texture _sourceTexture = null;
float x = 0, y = 0;
@Override
public void create() {
_sourceTexture = new Texture(Gdx.files.internal("data/character.png"));
}
.
.
}
Lors du rendu de l'écran, si l'utilisateur a touché l'écran, je prends les coordonnées de la touche, puis utilisez-les pour rendre le personnage de l'image.
@Override
public void render(float delta) {
if (Gdx.input.justTouched()) {
x = Gdx.input.getX();
y = Gdx.input.getY();
}
super.getGame().batch.draw(_sourceTexture, x, y);
}
Le problème est que les coordonnées de dessin de l'image de démarrage en bas à gauche de la position (comme indiqué dans le LibGDX Wiki) et les coordonnées de la touche d'entrée démarre à partir du coin supérieur gauche. Donc la question que je vais avoir, c'est que je clique en bas à droite, il déplace l'image vers le haut à droite. Mes coordonnées peut être X 675 Y 13, qui, sur touch près du haut de l'écran. Mais le personnage montre au fond, puisque les coordonnées démarrer en bas à gauche.
Pourquoi est-ce? Pourquoi les systèmes de coordonnées inversée? Suis-je utiliser le mauvais objets pour déterminer ce?
source d'informationauteur Brian Mains
Vous devez vous connecter pour publier un commentaire.
Pour détecter la collision-je utiliser
camera.unproject(vector3)
. J'ai misvector3
:Maintenant je passe ce vecteur dans
camera.unproject(vector3)
. Utilisationx
ety
de ce vecteur pour dessiner votre personnage.Vous le faites à droite. Libgdx fournit généralement des systèmes de coordonnées dans leur "native" format (dans ce cas, la native de l'écran tactile de coordonnées, et la valeur par défaut OpenGL coordonnées). Ce n'est pas créer de la cohérence, mais il signifie que la bibliothèque ne possède pas mettre entre vous et tout le reste. La plupart des jeux OpenGL utiliser un appareil photo cartes relativement arbitraire "monde" coordonnées sur l'écran, de sorte que le monde/jeu coordonnées sont souvent très différentes des coordonnées de l'écran (si la cohérence est impossible). Voir Changer le Système de Coordonnées dans LibGDX (Java)
Il y a deux façons de contourner cela. L'un est de transformer votre contact coordonnées. L'autre est d'utiliser un autre appareil photo (une projection différente).
À fixer le toucher coordonnéesjuste soustraire le y de la hauteur de l'écran. C'est un peu un hack. Plus généralement vous voulez "unproject" à partir de l'écran dans le monde (voir le
Appareil photo.unproject()
les variations). C'est probablement la méthode la plus simple.Sinon, pour fixer la caméra voir "Changer le Système de Coordonnées dans LibGDX (Java)", ou ce post sur le forum libgdx. Fondamentalement, vous définissez une caméra personnalisée, puis définissez la
SpriteBatch
à utiliser à la place de la valeur par défaut.:Tout en fixant la caméra fonctionne, il est "nager à contre-courant" un peu. Vous rencontrerez d'autres moteurs de rendu (
ShapeRenderer
la police et les convertisseurs, etc), qui va également par défaut à la "mauvaise" de la caméra et ont besoin d'être fixé.J'ai eu le même problème , j'ai simplement fait ce.
et chaque fois que vous voulez prendre une entrée de l'utilisateur à ne pas utiliser Gdx.d'entrée.getY();
au lieu d'utiliser (Gdx.les graphiques.getHeight()-Gdx.d'entrée.getY())
ce qui a fonctionné pour moi.
Le lien ci-dessous traite de ce problème.
Les projets de la donnée coordonnées dans l'espace de coordonnées de l'écran.
Vous devez utiliser la méthode
project(Vector3 worldCoords)
dans la classecom.badlogic.gdx.graphics.Camera
.Créer une instance du vecteur et de l'initialiser avec les coordonnées de l'entrée de gestionnaire d'événements.
Projets de la worldCoors donné dans l'espace de coordonnées de l'écran.
Utilisation des coordonnées projetées.