Partage
  • Partager sur Facebook
  • Partager sur Twitter

Carte (map) de jeux 2D

comment m'y prendre ?

Sujet résolu
    14 mars 2010 à 21:41:25

    Bonsoir à tous,

    Mon but : Créer un objet (Panneau) qui m'affiche un tableau d'image.

    Je pensai m'y prendre comme ça :

    lecture d'un fichier texte qui ressemble à ça :
    000000000000000
    000000000000000
    111111111111111
    222222222222222
    222222222222222
    je met chaque caractère dans un tableau
    je parcours mon tableau
    et j'affiche une image différente selon le caractère aux coordonnés
    [ i * taille , j * taille , i * taille + taille , j * taille + taille ]

    Je fais comment ? mon objet et du type JPanel et j'utilise la méthode void painComponent(Graphics g) avec une double boucle de lecture qui lit le tableau puis un g.drawImage() ?

    Au début je souhaiter créer une classe par élément avec en attribut le nom de l'image, le caractère correspondant et un attribut Image qui serait le lien vers l'image correspondante mais je n'est pas réussi à faire le lien entre le caractère lu et l'objet représentant.

    Une autre question est quel est le type d'objet pour mes images elles font 16x16, Image, ImageIcon, ... ?

    Si quelqu'un peut me dire ce qui est bien ou pas dans ma manière de faire pour m'aiguiller, ensuite je recommencerai au propre en postant les sources de l'avancement.

    En vous remerçiant,

    ++
    • Partager sur Facebook
    • Partager sur Twitter
      15 mars 2010 à 19:56:42

      C'est légèrement confus tout ça.
      Premier conseil : sépare la logique de l'affichage.

      Dans le cadre d'un éditeur, tu peux créer un JPanel qui affiche toutes les tiles disponibles et un autre qui affiche la map. Pour cela, tu peux remplir un tableau d'int et l'écrire dans un fichier. Ou encore sérialiser un objet qui comporte une Map par exemple.
      Pour l'affichage, le paintComponent() de JPanel est très bien.
      En accordance avec mon premier conseil, apprends à ta classe Map à se dessiner (en créant une méthode drawMap(Graphics), et dessine la sur le JPanel grâce au Graphics de paintComponent().

      Pour les types d'Image, bizarre comme question. Tu stockes tout dans une référence de type Image et tu la remplis avec ImageIO.read(). ImageIcon porte mal son nom ; tu peux mettre tout type d'images dedans.
      • Partager sur Facebook
      • Partager sur Twitter
        15 mars 2010 à 20:19:15

        Salut,

        Citation : Acolyte

        lecture d'un fichier texte qui ressemble à ça :
        000000000000000
        000000000000000
        111111111111111
        222222222222222
        222222222222222


        Je ne pense pas que ça suffira. Une case d'une map possède plusieurs attributs (traversable, lien vers image, ...). Peut être stocké les map dans des fichiers xml ?

        Citation : Acolyte

        Je fais comment ? mon objet et du type JPanel et j'utilise la méthode void painComponent(Graphics g) avec une double boucle de lecture qui lit le tableau puis un g.drawImage() ?


        Ca c'est la maniére bourrine ^^
        Pour un jeux il y a des techniques comme le double-buffering, la boucle de jeu...

        Citation : Acolyte

        Une autre question est quel est le type d'objet pour mes images elles font 16x16, Image, ImageIcon, ... ?


        Des images de 16x16 ?
        Je te conseille de prendre de grandes images et tu affiches seulement la partie concernée. Un peu comme les tilesets de rpg maker.
        Ainsi tu n'as qu'une image en mémoire et tu économises ta ram.

        Essaye de réfléchir à une structure pour ton appli voir même faire un petit UML.
        Par exemple une map peut avoir plusieurs couches d'images. Une couche possède un tableau de case. Une case peut être traversable ou pas.
        Rien que la on peut voir certaines classes apparaitre: map, couche, case ...

        Je te conseille de lire Killer Game Programming in Java ;)
        En tout cas bonne chance.
        • Partager sur Facebook
        • Partager sur Twitter
          20 mars 2010 à 15:43:51

          Bon alors j'ai fais ça peu être bourrin mais j'arrive à quelques chose !

          package environnement;
          
          import java.awt.Graphics;
          import java.awt.Image;
          import java.io.BufferedReader;
          import java.io.File;
          import java.io.FileReader;
          import java.io.IOException;
          import java.util.Hashtable;
          
          import javax.imageio.ImageIO;
          import javax.swing.JPanel;
          
          public class Map extends JPanel {
          	
          	private int[] map;
          	private Hashtable<Integer, String> dico;
          	
          	public Map() {
          		System.out.println("constructeur");
          		map = new int[400];
          		dico = new Hashtable<Integer, String>();
          		this.lectureMap();
          		this.lectureDico();
          	}
          	
          	//Lecture du fichier texte map.txt
          	public void lectureMap() {
          		System.out.println("lectureMap");
          		File fichier = new File("/home/acolyte/java/environnement/src/environnement/map.txt");
          		String ligne;
          		int index = 0;
          		try {
          			FileReader flotLecture = new FileReader(fichier);
          			BufferedReader buff = new BufferedReader(flotLecture);
          			while ((ligne = buff.readLine()) != null) {
          				for (int i = 0 ; i < 20*5 ; i+=5) {
          					map[index] = Integer.parseInt(ligne.substring(i+1, i+4));
          					index++;
          				}
          			}
          			flotLecture.close();
          			flotLecture.close();
          		} catch (IOException e) {
          			System.out.println("Erreur : " + e.toString());
          		}
          	}
          	//Lecture du fichier texte dictionnaire.txt
          	public void lectureDico() {
          		System.out.println("lectureDico");
          		dico.put(999, "brouillard");
          		String ligne;
          		File fichier = new File("/home/acolyte/java/environnement/src/elements/dictionnaire.txt");
          		try {
          			FileReader flotLecture = new FileReader(fichier);
          			BufferedReader buff = new BufferedReader(flotLecture);
          			while ((ligne = buff.readLine()) != null) {
          				dico.put(Integer.parseInt(ligne.substring(0, 3)), ligne.substring(4, ligne.length()));
          			}
          			flotLecture.close();
          		} catch (IOException e) {
          			System.out.println("Erreur : " + e.toString());
          		}
          	}
          
          	// peinture du JPanel
          	public void paintComponent(Graphics g) {
          		System.out.println("paintComponent");
          		String chemin;
          		int h = 0;
          		try {
          			for (int i = 0 ; i < map.length ; i++) {
          				if (i != 0 && (i % 20) == 0) {
          					h++;
          				}
          				chemin = new String("/home/acolyte/projet/environnement/" + dico.get(map[i]) + ".png");
          				Image img = ImageIO.read(new File(chemin));
          				g.drawImage(img, i*16-(h*16*20), h*16, this);
          			}
          		} catch (IOException e) {
          			e.printStackTrace();
          		}
          
          	}
          
          }
          


          Format des fichiers :

          map.txt
          [XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX]
          [XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX]
          [XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX][XXX]
          


          dictionnaire.txt
          XXX=nom1
          XXY=nom2
          XXZ=nom3

          XXX est un nombre à trois chiffres.

          la méthode lectureMap() lis mon fichier map.txt
          récupère tout les valeurs XXX et les stock dans un tableau

          la méthode lectureDico() lit mon fichier dictionnaire.txt
          et stock dans un Hashtable<Integer, String>

          j'ai plus qu'à transformer mon String en Objet dans le Hashtable, afin de pouvoir appeler différentes méthodes sur chaque éléments de la carte.

          Vous pensez quoi de ma manière de développement ?
          Et où vous auriez optimiser ?

          Par avance, merci aux participants et aux lecteurs !
          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2010 à 14:32:40

            Petit conseil :

            Citation

            Image img = ImageIO.read(new File(chemin));
            g.drawImage(img, i*16-(h*16*20), h*16, this);


            Faire ça dans paintComponent ce n'est pas super. Parce que à chaque fois que tu vas rafraichir ton écran il y aura lecture de l'image sur ton disque dur.

            Fais une méthode de chargement qui chargera en mémoire toutes les images utiles à la map et range les dans une hashmap.
            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2010 à 15:52:27

              Au risque de me répéter, je n'aime pas trop non plus les méthodes logique dans une classe graphique.
              Tu connais le pattern MVC ? Si tu veux mon avis, c'est ton meilleur ami pour faire un jeu vidéo, même tout petit.
              Essaie de te mettre dans le bain : le JPanel sert à afficher des choses, pas à calculer des choses. Donc si j'étais toi j'aurais déjà fait tout le jeu en mode console, puis à la fin et seulement à la fin j'aurais fait la vue.

              Si tu n'appliques pas ça, tu vas droit dans un mur je te le garantis.

              Ah dernier conseil, ne fais pas de calculs dans paintComponent(), et surtout, mets <code type="java">super.paintComponent(g)</minicode> en première instruction, c'est très important ça t'évitera un certain nombre de bugs...
              • Partager sur Facebook
              • Partager sur Twitter
                21 mars 2010 à 16:23:59

                Citation : elmh

                Au risque de me répéter, je n'aime pas trop non plus les méthodes logique dans une classe graphique. [...] le JPanel sert à afficher des choses, pas à calculer des choses. Donc si j'étais toi j'aurais déjà fait tout le jeu en mode console, puis à la fin et seulement à la fin j'aurais fait la vue.



                J'avais pas tout compris mais maintenant c'est bon ! :)

                Citation : elmh

                Tu connais le pattern MVC ? Si tu veux mon avis, c'est ton meilleur ami pour faire un jeu vidéo, même tout petit.



                J'ai certaines idées qui converge vers cette philosophie mais je vais lire le tuto de ce pas !

                Citation : elmh

                Si tu n'appliques pas ça, tu vas droit dans un mur je te le garantis.



                Je pense aussi, donc je vais en prendre de la graine.

                Citation : elmh

                Ah dernier conseil, ne fais pas de calculs dans paintComponent()



                Ok, je corrige.

                Citation : helitik

                Petit conseil :

                Citation

                Image img = ImageIO.read(new File(chemin));
                g.drawImage(img, i*16-(h*16*20), h*16, this);


                Faire ça dans paintComponent ce n'est pas super. Parce que à chaque fois que tu vas rafraichir ton écran il y aura lecture de l'image sur ton disque dur.

                Fais une méthode de chargement qui chargera en mémoire toutes les images utiles à la map et range les dans une hashmap.



                Merci aussi du conseil !

                Powa j'ai du boulot mais c'est pour mon bien :D !

                Merci les gens, je pense qu'avec tout ça je peux m'en sortir, je marque résolu !

                Bonne Prog à tous !

                ++
                • Partager sur Facebook
                • Partager sur Twitter

                Carte (map) de jeux 2D

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown