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

 Java Discussion :

Swing et décalage d'affichage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut Swing et décalage d'affichage
    Bonjour,

    Je suis entrain d'écrire un moteur de jeu vidéo 2D basé sur le principe du "tile mapping".

    À priori Swing n'est pas la meilleure bibliothèque pour, qu'en pensez vous ?
    (Il est toujours temps pour moi d'en changer)

    Mon réel souci est ce qui suit,
    J'affiche donc des tiles :


    Cependant lors que j'anime cet affichage, par exemple lorsque je décale l'affichage d'un tile, le nouvel affichage est décalé d'un pixel.
    Ici, pour plus de clarté je n'ai utiliser que des tiles noirs et blanches (après 18 décalages) :


    On y voit bien les rangées de tiles noirs ou blanches mais tout à gauche l'effet n'est pas voulu... C'est ce qui reste des "sous-couches" disons.
    La preuve en est que si je rafraîchi l'affichage j'obtient ce qui suit :


    Les "sous-couches" résiduelles des anciens affichages successifs disparaissent.

    Je ne sais pas d'où vient ce décalage...
    Voilà la méthode paintComponent() de la classe Panneau qui hérite de JPanel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public class Panneau extends JPanel
    {
    	/* [...] */
    	public void paintComponent(Graphics graphic)
    	{
    		for (int i = 0; i < this.nbTilesLongeur; i++)
    		{
    			for (int j = 0; j < this.nbTilesLargeur; j++)
    			{
    				graphic.drawImage
    				(
    					this.carte.getTileset().getImage(),
    					j * this.carte.getTileset().getTailleTile(),
    					i * this.carte.getTileset().getTailleTile(),
    					(j+1) * this.carte.getTileset().getTailleTile(),
    					(i+1) * this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						% this.carte.getTileset().getNbTilesLargeur())
    						* this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						/ this.carte.getTileset().getNbTilesLargeur())
    						* this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						% this.carte.getTileset().getNbTilesLargeur()+1)
    						* this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						/ this.carte.getTileset().getNbTilesLargeur()+1)
    						* this.carte.getTileset().getTailleTile(),
    					this
    				);
    			}
    		}
    	}
    	/* [...] */
    }
    J'utilise la méthode drawImage() qui ici prend en entrée:
    l'image source ;
    la coordonée x du début d'affichage de la sous partie de l'image récupérée ;
    la coordonée y du début d'affichage de la sous partie de l'image récupérée ;
    la coordonée x de fin d'affichage de la sous partie de l'image récupérée ;
    la coordonée y de fin d'affichage de la sous partie de l'image récupérée ;
    la coordonée x du début de la sous partie de l'image que l'on souhaite récupérer ;
    la coordonée y du début de la sous partie de l'image que l'on souhaite récupérer ;
    la coordonée x de fin de la sous partie de l'image que l'on souhaite récupérer ;
    la coordonée y de fin de la sous partie de l'image que l'on souhaite récupérer ;
    l'objet où tous ça sera affiché.
    Grâce à un affichage en console des valeurs calculées et envoyées à cette méthode j'obtient :
    x==4
    Dx1 Dy1 Dx2 Dy2 Sx1 Sy1 Sx2 Sy2
    0, 0, 16, 16, 64, 48, 80, 64
    16, 0, 32, 16, 0, 0, 16, 16
    32, 0, 48, 16, 64, 48, 80, 64
    48, 0, 64, 16, 0, 0, 16, 16
    [...]
    La première ligne nous apprends qu'aprés 4 décalages (de la largeur d'un tile à chaque fois), la surface du panneau de coordonées (0,0) à (16,16) prend le tile du tileset de coordonées (64,48) à (80,64).

    Il devrait donc s'afficher le plus en haut à gauche de la fenêtre...
    (Mais il saffiche donc avec 4 pixels de décalages aux coordonnées (4,0) à (20,16))

    Merci de m'aider, n'hésitez pas à poser des questions, ce n'est pas forcement très clair...

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Comment réalise tu ton décalage?
    Comment réalise tu le rafraichissement de ton panel?
    Peux tu nous envoyer ton programme de test avec les bandes pour qu'on puisse tester chez nous.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Comment réalise tu ton décalage?

    Il est fait dans la méthode d'affichage paintComponent() par l'appel à la méthode drawImage(), dans le calcul des arguments déterminant :
    la coordonnée x du début de la sous partie de l'image que l'on souhaite récupérer ;
    la coordonnée y du début de la sous partie de l'image que l'on souhaite récupérer ;
    la coordonnée x de fin de la sous partie de l'image que l'on souhaite récupérer ;
    la cordonnée y de fin de la sous partie de l'image que l'on souhaite récupérer ;
    Par exemple le premier de ces 4 argument est calculé comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this.carte.getMatrice()[i+this.getY()][j+this.getX()] / this.carte.getTileset().getNbTilesLargeur()) * this.carte.getTileset().getTailleTile()
    On récupère une valeur stockée dans une matrice schématisant la carte (une valeur entière représente un unique tile) avec un décalage de x et y.
    On divise le résultat pas le nombre de tiles en largeur dans le tileset.
    On multiplie le résultat pas la taille d'un tile.

    Exemple sans décalage :
    Soit : nbTilesLargeur = 10; tailleTile = 16;
    i == 0; j == 0; x == 0; y == 0;
    Par exemple : matrice[i+y][j+x] = 1;
    La coordonnée vaut donc : 1 / 10 * 16 = 0
    La cordonnée x du début de la sous partie de l'image source que je veux récupérer est donc 32 (en pixels)

    Exemple avec décalage :
    Soit : nbTilesLargeur = 10; tailleTile = 16;
    i == 0; j == 0; x == 5; y == 1;
    Par exemple : matrice[i+y][j+x] = 22;
    La coordonnée vaut donc : 22 / 10 * 16 = 32
    La cordonnée x du début de la sous partie de l'image source que je veux récupérer est donc 32 (en pixels)

    J'ai peut-être mal exporter cet algorithme en Java.
    Comment réalise tu le rafraîchissement de ton panel?
    Quand je dis :
    La preuve en est que si je rafraîchi l'affichage [...]
    En fait je minimise ma fenêtre et Swing (ou Xorg ?) se débrouille pour la rafraîchir.
    Comme je suis pas sûre de répondre à la question je précise aussi que j'utilise la méthode repaint() après la modifiation de mes variables x et y.

    Peux tu nous envoyer ton programme de test avec les bandes pour qu'on puisse tester chez nous.
    Oui mais n'étant qu'étudiant, je débute avec Eclipse, je ne sais pas comment exporter un projet...

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Il manque un appel a super.paintComponent(g) pour effacer la surface affichable du composant (alternativement tu peux dessiner un grand rectangle de la couleur de fond).

    Si tes images sont toutes déjà chargées (puisque nous ignorons comment tu les charges), le dernier paramètre de drawImage() peut être mis a null au lieu de this (en fait c'est plus rapide ainsi).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Le dernier paramètre de drawImage() peut être mis a null au lieu de this
    Effectivement...
    Il manque un appel a super.paintComponent(g)
    J'ai fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    	public void paintComponent(Graphics graphic)
    	{
    		super.paintComponent(graphic);
    		for (int i = 0; i < this.nbTilesLongeur; i++)
    		{
    			for (int j = 0; j < this.nbTilesLargeur; j++)
    			{
    				graphic.drawImage
    				(
    					this.carte.getTileset().getImage(),
    					j * this.carte.getTileset().getTailleTile(),
    					i * this.carte.getTileset().getTailleTile(),
    					(j+1) * this.carte.getTileset().getTailleTile(),
    					(i+1) * this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						% this.carte.getTileset().getNbTilesLargeur())
    						* this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						/ this.carte.getTileset().getNbTilesLargeur())
    						* this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						% this.carte.getTileset().getNbTilesLargeur()+1)
    						* this.carte.getTileset().getTailleTile(),
    					(this.carte.getMatrice()[i+this.getY()][j+this.getX()]
    						/ this.carte.getTileset().getNbTilesLargeur()+1)
    						* this.carte.getTileset().getTailleTile(),
    					null
    				);
    			}
    		}
    	}
    Ce qui ne fonctionne pas, il y a toujours le décalage et les traits d'un pixel de large.

    Merci de m'aider !

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Quelle est la couleur de fond de ton panel ? Est-ce une couleur dont l'alpha est < 255 ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. [Swing][Jtree] Problème d'affichage
    Par shinchun dans le forum Composants
    Réponses: 2
    Dernier message: 10/08/2007, 14h33
  2. [SWING, JTable] Pb d'affichage
    Par slasch dans le forum Composants
    Réponses: 4
    Dernier message: 23/12/2006, 19h53
  3. swing et problème d'affichage
    Par tatatoui dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 04/10/2006, 11h35
  4. [Swing][ListCellRenderer]Pas d'affichage des composants
    Par Cyberwan dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 08/02/2006, 00h22
  5. [Swings]Quelques soucis à l'affichage !
    Par julienOriano dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 23/09/2004, 13h22

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