Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Physique
Physique Forum d'entraide sur les algorithmes et moteurs physiques (ODE, Newton...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/11/2010, 21h15   #1
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2010
Messages : 17
Points : 10
Points : 10
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.
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 06h13   #2
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 403
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 403
Points : 39 597
Points : 39 597
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
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 18h05   #3
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2010
Messages : 17
Points : 10
Points : 10
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 :
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 :
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++; }
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 19h19   #4
plegat
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 3 214
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (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 214
Points : 5 377
Points : 5 377
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
plegat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 19h28   #5
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2010
Messages : 17
Points : 10
Points : 10
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.
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 20h05   #6
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 403
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 403
Points : 39 597
Points : 39 597
Citation:
Envoyé par sebcap26 Voir le message
Code :
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 :
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
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 20h18   #7
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2010
Messages : 17
Points : 10
Points : 10
Si je fais ca la caméra est bien placée, effectivement, mais le personnage ne bouge plus correctement sur la map.
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 18h38   #8
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2010
Messages : 17
Points : 10
Points : 10
Autant pour moi, en fait même comme ca la caméra n'est pas centrée ...
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 21h20   #9
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

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

Code :
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.
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 11h17   #10
sebcap26
Candidat au titre de Membre du Club
 
Homme Sébastien
Développeur Web
Inscription : février 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Sébastien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2010
Messages : 17
Points : 10
Points : 10
Bon ben j'ai fini par trouver la solution tout seul .

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

Code :
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;
	}
sebcap26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h57.


 
 
 
 
Partenaires

Hébergement Web