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

Graphisme Java Discussion :

Sprite "creux" sous GTGE


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut Sprite "creux" sous GTGE
    Bonjour,

    Je réalise actuellement un jeu de Tetris (le même que celui de mon post précédent). J'utilise pour cela la bibliothèque GTGE qui permet la gestion de sprites. Je rencontre le problème suivant :

    Toutes les briques apparaissent correctement, sauf la brique "T" qui apparaît "en creux", c'est à dire que ses bords apparaissent (ils ne sont pourtant pas d'1 pixel de large ! Ce sont des surfaces de quelques pixels) mais que l'intérieur est vide : on voit l'arrière-plan à travers.

    Un bon dessin valant mieux qu'un long discours :

    http://www.flickr.com/photos/59143248@N02/5418227382

    Ce qui est étonnant, c'est que je ne rencontre ce problème que pour le sprite en "T" ! En effet, pour "O" par exemple :

    [ame="http://www.flickr.com/photos/59143248@N02/5417632799/"]tetris_o | Flickr - Photo Sharing!@@AMEPARAM@@http://farm6.static.flickr.com/5098/5417632799_20c410c81c_m.jpg@@AMEPARAM@@5417632799@@AMEPARAM@@20c410c81c[/ame]

    Voici mon code pour l'importation de l'image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public BufferedImage getBrique(char type) {
    	BufferedImage retour = new BufferedImage(30, 30, BufferedImage.SCALE_DEFAULT);
    	if (type == 'O') retour = o;
    	else if (type == 'Z') retour = z;
    	else if (type == 'S') retour = s;
    	else if (type == 'T') retour = t;
    	else if (type == 'J') retour = j;
    	else if (type == 'L') retour = l;
    	else if (type == 'I') retour = i;
    	return retour;
    }
    o, z, ..., i étant des variables BufferedImage déclarées dans la classe contenant le main, initialisées convenablement semble-t-il (puisque ça marche).

    Je soupçonne le BufferedImage.SCALE_DEFAULT de ne pas convenablement prendre en compte les options d'opacité de mon "t.png". Peut-être est-ce aussi la méthode getImage(String image_name) de GTGE qui les prend mal en compte, ou la conversion entre la BufferedImage générée par getImage(String) et ma BufferedImage retour qui se passe mal.

    Ci-joint en tout cas :
    - t.png représentant une brique unitaire du T-tetromino ;
    - o.png représentant une brique unitaire du O-tetromino, comme élément de comparaison.

    Voici où je les ai découpées : http://fc07.deviantart.net/fs16/f/20...Swordholio.gif

    Je précise que j'ai agrandi les briques : elles faisaient à l'origine 10*10 px², j'en ai fait du 30*30 sous The Gimp.
    Images attachées Images attachées   

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    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 817
    Par défaut
    Salut,

    Quelques questions:

    • est-ce uniquement pour les T?
    • est-ce uniquement pour les T violets?
    • est-ce que ça se produit aussi sur les O violets?


    Si les autres briques sont importées correctement, il n'y a guère de raison que ça foire pour les T... et si ça fonctionne pour les autres briques violettes non plus.
    A moins que tu n'aies enregistré tes sprites de T en mettant d'autres options que pour les autres (genre une transparence pour la couleur violette).

    Le bout de code que tu as mis ne gère pas l'importation de l'image ni la création du sprite (il renvoie juste la bufferedImage correspondant à la forme), donc il n'aide pas.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut
    Salut,

    Merci plegat pour ta réponse. J'explique un peu plus en détail mon projet, dont Tetris n'est qu'une partie : il s'agit de programmer un robot qui joue à ce jeu, captant ce qui se passe à l'écran grâce à une caméra (i.e. reconnaissance de formes et de couleurs) et appuyant sur les boutons du clavier en fonction de ce qu'il voit. Pour cela, compte tenu des différences de luminosité dans lesquelles mon robot aura à travailler, j'ai choisi l'option du Tetris "original", c'est à dire une forme = une couleur. Il se trouve que le T-tetromino (selon Wikipedia ; tetromino = assemblage de 4 carrés qui partagent au moins un côté commun avec au moins un autre carré) est rose.

    Cependant j'ai fait quelques tests, et il se trouve que c'est bien la brique rose (j'ai nommé "t.png") qui est en cause. En effet, quand je modifie mon code pour que le O-tetromino soit affiché en rose, les briques apparaissent de nouveau transparentes. (Et je dis bien transparentes : quand je modifie la couleur de mon fond, l'intérieur apparaît dans la couleur du fond.)

    Ce qui m'étonne c'est que j'ai découpé les sprites roses exactement de la même manière que les autres sprites, sous The Gimp. Peut-être ai-je sans faire exprès modifié un réglage dans Gimp ?

    Voici quelques fragments de code, ceux qui me paraissent pertinents :

    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
     
    public class Tetromino {
            /** BufferedImage correspondant aux sprites */
    	public static BufferedImage i, o, s, z, l, j, t;
     
            /** Brique choisie */
            public BufferedImage brique;
     
    	/** Détermine la couleur du tetromino
             * @param char type du tetromino (OZSTJLI)
             * @return BufferedImage retour
             */
    	public BufferedImage getBrique(char type) {
    		BufferedImage retour = new BufferedImage(30, 30, BufferedImage.SCALE_DEFAULT);
    		if (type == 'O') retour = o;
    		else if (type == 'Z') retour = z;
    		else if (type == 'S') retour = s;
    		else if (type == 'T') retour = t;
    		else if (type == 'J') retour = j;
    		else if (type == 'L') retour = l;
    		else if (type == 'I') retour = i;
    		return retour;
    	}
    Avec GTGE, les objets doivent être initialisés dans une fonction initResources(), soit le code suivant :

    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
    public class Tetris extends Game {
    	Tetromino TETROMINO;
    
    	public void initResources() {
    
    		/** La fonction getImage(String) est une fonction de l'API GTGE, qui renvoie une BufferedImage ; je n'ai pas étudié son code source. Si personne ne trouve mon erreur je vais devoir mettre les mains dans le cambouis et disséquer getImage, mais je ne vois pas comment le problème peut venir de cette fonction étant donné qu'elle marche parfaitement pour {i, j, ..., o}.png. */
    		Tetromino.i = getImage("i.png");
    		Tetromino.j = getImage("j.png");
    		Tetromino.l = getImage("l.png");
    		Tetromino.s = getImage("s.png");
    		Tetromino.z = getImage("z.png");
    		Tetromino.o = getImage("o.png");
    		Tetromino.t = getImage("t.png");
    		
    		TETRION = new Tetrion();
    		TETROMINO = new Tetromino();
    
    		/** getBrique('T') pour étudier exclusivement le T-tetromino, les autres ne posant aucun problème. */
    		TETROMINO.brique = TETROMINO.getBrique('T');
    	}
    }
    Je précise que je suis en première année de maths-info, que j'ai découvert le Java précisément le 10 janvier 2011 (soit il y a moins d'un mois) lorsque le directeur du stage que j'ai réussi à obtenir de ma propre initiative m'a dit "bah, tu vas faire un robot qui joue à Tetris en Java" - ce qui explique la relative saleté de mon code (je pense notamment à l'absence de méthodes accesseur/modifieur et à la déclaration "public" de toutes mes variables). Ceci n'est qu'une version de test destinée à être améliorée au cours de l'année (elle ne permet d'ailleurs pas encore de jouer réellement, elle fait juste tomber des tetrominos dans le puits), et je suis avide de tous vos conseils !

    Par ailleurs, au cas où le fragment de code que j'ai mis plus haut ne suffirait pas, je joins un ZIP contenant tous mes fichiers source, mes sprites ainsi que GTGE qui est opensource.

    Ma théorie reste que j'ai touché sans le vouloir aux réglages du canal alpha de "t.png", mais seulement je ne sais pas comment restaurer l'opacité. Gimp me dit que l'opacité de l'unique calque est de 100%. Le fichier "t.png" est disponible en pièce jointe de mon premier post ainsi que dans le ZIP ci-joint.

    Merci d'avance pour vos réponses,
    endreillie
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip src.zip (115,6 Ko, 90 affichages)

Discussions similaires

  1. Caractere echappement (quote) et variables sous pgsql
    Par tonio.jt dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/10/2009, 21h06

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