IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Physique Discussion :

Position d'une caméra 2D isométrique


Sujet :

Physique

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Position d'une caméra 2D isométrique
    Bonjour,

    J'ai tenté d'adapter la fonction screenToIso (présente ici : http://www.developpez.net/forums/d88...s/#post5005921) pour mon jeu (merci à son auteur de l'avoir partagée d'ailleurs), mais je me heurte à un problème lorsqu'il s'agit de déplacer la caméra. Elle se comporte étrangement.

    Je dessine ma map en parcourant tous les points de l'écran ou je dois dessiner mes tiles, et en faisant un screenToIso pour récupérer le type du tile correspondant.

    Jusqu'ici, ca fonctionnait bien jusqu'à ce que je place un personnage. J'ai fait en sorte que la position a laquelle est centrée ma caméra soit la position du personnage que je dirige. Seulement, quand je me déplace, même si mon personnage est bien placé par rapport à la map, lui (et donc la case ou il se trouve, qui devrait être au centre de l'écran) n'est pas où il faut ...

    Par exemple (oui je sais ca fait un peu copier coller mes 4 phrases mais bon) :
    - Je bouge mon personnage vers le haut, il reste bien centré à l'écran en hauteur, mais la caméra se déplace en même temps d'une case vers la droite (le perso n'est donc plus au centre horizontalement).
    - Je bouge mon personnage vers le bas, il reste bien centré à l'écran en hauteur, mais la caméra se déplace en même temps d'une case vers la gauche (le perso n'est donc plus au centre horizontalement).
    - Je bouge mon personnage vers la gauche, il reste bien centré à l'écran en largeur, mais la caméra se déplace en même temps d'une case vers le bas (le perso n'est donc plus au centre verticalement).
    - Je bouge mon personnage vers la droite, il reste bien centré à l'écran en largeur, mais la caméra se déplace en même temps d'une case vers le haut (le perso n'est donc plus au centre verticalement).

    Notez que mes coordonnées sont un poil différentes , l'axe des x est vers le haut a droite et l'axe des y est vers le haut à gauche (donc une "rotation" de 90° vers la gauche par rapport à l'exemple présenté dans le lien pré-cité).

    Je suis un peu bloqué du coup, peut être quelqu'un aura-t-il une idée ...

    Merci d'avance.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 578
    Points
    218 578
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Cela semble un problème de if / else if / else ou alors de switch / case dans lesquelles il manque les breaks.
    Sinon sans code ... je ne sais pas quoi dire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Voila la fonction qui détermine les coordonnées d'une case en fonction de sa position dur l'écran (=paramètres passés à la fonction) :

    (code Java)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	private Point screenToIso(int screenX, int screenY) {
    		float x = -this.camera.getX() * Tileset.TILE_WIDTH - this.getWidth() / 2 + screenX;
    		float y = this.camera.getY() * Tileset.TILE_HEIGHT - this.getHeight() / 2 + screenY;
     
    		Point position = new Point();
    		float y2 = y / Tileset.TILE_HEIGHT;
    		float x2 = x / Tileset.TILE_WIDTH;
    		position.x = (int) Math.floor(y2 - x2);
    		position.y = (int) Math.ceil(y2 + x2);
     
    		return position;
    	}
    Camera étant un objet Player.

    Dans Player, j'ai les 4 méthodes suivantes qui sont appellées lors de l'appui sur les touches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public void goUp() 		{ this.y--; this.x--; }
    	public void goDown() 	{ this.y++; this.x++; }
    	public void goLeft() 	{ this.x++; this.y--; }
    	public void goRight() 	{ this.x--; this.y++; }

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut,

    Les changements de signe dans les calculs par rapport au code de base, c'est fait exprès ou pas? Ca correspond à quoi?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    C'est parce que je n'utilise pas le même système de coordonnées (je l'ai décrit dans le premier post). J'ai quand même testé en remettant les signes de départ mais le problème est le même.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 578
    Points
    218 578
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par sebcap26 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public void goUp() 		{ this.y--; this.x--; }
    	public void goDown() 	{ this.y++; this.x++; }
    	public void goLeft() 	{ this.x++; this.y--; }
    	public void goRight() 	{ this.x--; this.y++; }
    Je vais surement dire une bétise, mais pourquoi ne pas faire juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public void goUp() 		{ this.y--; }
    	public void goDown() 	{ this.y++; }
    	public void goLeft() 	{ this.x++; }
    	public void goRight() 	{ this.x--;  }
    Vous devriez essayer :p
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Si je fais ca la caméra est bien placée, effectivement, mais le personnage ne bouge plus correctement sur la map.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Autant pour moi, en fait même comme ca la caméra n'est pas centrée ...

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bon, j'ai un peu avancé. Si je remplace la première ligne de ma fonction screenToIso par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float x = -(this.camera.getX() - this.camera.getY()) * Tileset.TILE_WIDTH - this.getWidth() / 2 + screenX;
    Le personnage reste au centre quand je me déplace en haut ou en bas.

    Par contre si j'essaye d'appliquer la même chose à l'axe des y ca se remet a foirer sur les deux axes.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bon ben j'ai fini par trouver la solution tout seul .

    Voila la code fonctionnel si quelqu'un a le meme problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	private Point screenToIso(int screenX, int screenY) {
    		int cameraX = this.camera.getX();
    		int cameraY = this.camera.getY();
    		float x = -(cameraX - cameraY) * (Tileset.TILE_WIDTH  / 2) - this.getWidth()  / 2 + screenX;
    		float y =  (cameraX + cameraY) * (Tileset.TILE_HEIGHT / 2) - this.getHeight() / 2 + screenY;
     
    		Point position = new Point();
    		float y2 = y / Tileset.TILE_HEIGHT;
    		float x2 = x / Tileset.TILE_WIDTH;
    		position.x = (int) Math.floor(y2 - x2);
    		position.y = (int) Math.ceil(y2 + x2);
     
    		return position;
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OpenSceneGraph] Position d'une caméra dans l'espace
    Par Invité(e) dans le forum OpenSceneGraph
    Réponses: 2
    Dernier message: 28/08/2008, 10h58
  2. Réponses: 2
    Dernier message: 04/11/2007, 13h10
  3. Récuperer la taille & position d'une fenêtre
    Par TheDarkLewis dans le forum Windows
    Réponses: 3
    Dernier message: 20/09/2004, 22h15
  4. Position d'une balise dans un document externe
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 02h56
  5. [VB6] Position d'une MDIchild dans un MDI
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2003, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo