Afficher des images sur une images de fond (Pour jeu point'n'click)

Résolu
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012 - 12 févr. 2012 à 06:10
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 19 févr. 2012 à 18:36
Bonjour,

J'ai chercher un peu partout pour afficher des images, par dessus une autre image, mais je n'ai pas trouver. Je vous explique ce que j'aimerais faire :

Je voudrais créer un jeu de point'n'click, où a chaque changement de piece, on charge : l'image de la piece générale, puis chaque images des objets clickable (que l'utilisateur n'as pas encore trouver), et on affiche le tout. De maniere a pouvoir afficher que les objets que l'utilisateur n'as pas trouver (si il a clicker sur un objet, on affiche plus l'image de l'objet).

Je sais comment afficher une image (par exemple avec getClass.getResource() puis dans un jLabel ou ImageIcon), bien que je ne sache pas comment l'afficher a une coordonée (x,y)), mais par contre je ne sais pas comment afficher l'image de mes objets dessus. Est ce que Swing permet de faire ca ? Ou est ce qu'il faut utiliser des librairies type Java 2D/Java Fx ?

Merci d'avance pour toutes vos réponses, j'espere avoir été clair (sinon n'hesitez pas a demander des eclaircissements ^^)

Lastea

33 réponses

Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
17 févr. 2012 à 01:57
Bonjour !

Alors j'ai essayer d'afficher des images superposées, mais j'ai toujours pas réussi.
Quand j'utilise ce code :

  public void main(String[] args){
    JFrame f = new JFrame();
    PanelImage p = new PanelImage();
    PanelImage p2 = new PanelImage();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    p.setImage(getImage("image.jpg"),0,0);
    p2.setImage(getImage("image1.jpg"),25,0);
    f.add(p);
    f.add(p2);
    f.setSize(500, 500);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}



Il ne m'affiche que la deuxième image aux coordonnées (25,0), est ce que tu saurais pourquoi ?

Et j'ai donc réfléchit pour faire directement plusieurs appels de drawImage dans paintComponent, mais, je ne vois pas vraiment comment faire, étant donner que l'image a afficher est definie par setImage, et qu'on ne peux en faire qu'une seule a la fois.

En tout cas, merci pour tes réponses très rapides.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 févr. 2012 à 08:14
Peux tu me montrer ton Panelmage ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 févr. 2012 à 08:21
Pour ce qui est d'appeler plusieurs fois drawImage dans ton PanelImage, il faut un peu modifier la classe PanelImage en mettant deux attributs Image et en ajoutant un autre setImage pour que ca fonctionne.
0
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
17 févr. 2012 à 09:35
Mon PanelImage c'est exactement la classe que tu m'as envoyer en premier message :)


public class PanelImage extends JPanel {

    private static final long serialVersionUID = -6350324456764768311L;

    private Image image;
    private int aX;
    private int aY;
    private int aXt;
    private int aYt;

    public void setImage(Image image, int pX, int pY, int pXt, int pYt) {
        this.image = image;
        this.aX=pX;
        this.aY=pY;
        this.aXt=pXt;
        this.aYt=pYt;
    }

    public Image getImage() {
        return image;
    }
       
    @Override
    public void paintComponent(Graphics g){
        if(image!=null){
            Graphics2D g2d = (Graphics2D)g;
            //x, y, w, h représentent la position et la taille de l'image à dessiner
            g2d.drawImage(image, aX, aY, aXt, aYt, null);
             }
    }
}



Et donc pour afficher plusieurs images d'un coup, tu me conseild e faire un code de ce genre la ?


public class PanelImage extends JPanel {

    private static final long serialVersionUID = -6350324456764768311L;

    private Image image;
    private Image image1;
    private int aX;
    private int aY;
    private int aXt;
    private int aYt;

    public void setImage(Image image, int pX, int pY, int pXt, int pYt) {
        this.image = image;
        this.aX=pX;
        this.aY=pY;
        this.aXt=pXt;
        this.aYt=pYt;
    }
    
     public void setImage1(Image image, int pX, int pY, int pXt, int pYt) {
        this.image1 = image;
        this.aX=pX;
        this.aY=pY;
        this.aXt=pXt;
        this.aYt=pYt;
    }

    public Image getImage() {
        return image;
    }
       
    @Override
    public void paintComponent(Graphics g){
        if(image!=null){
            Graphics2D g2d = (Graphics2D)g;
            //x, y, w, h représentent la position et la taille de l'image à dessiner
            g2d.drawImage(image, aX, aY, aXt, aYt, null);
            }
            
        if(image1!=null){
            Graphics2D g2d = (Graphics2D)g;
            //x, y, w, h représentent la position et la taille de l'image à dessiner
            g2d.drawImage(image, aX, aY, aXt, aYt, null);
            }
            
           }
}


Mais ce code ne m'affiche toujours que la deuxieme image quand je fait :

    public void main(String[] args){
    JFrame f = new JFrame();
    PanelImage p = new PanelImage();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    p.setImage(getImage("image.jpg"),0,0,100,100);
    p.setImage1(getImage("image1.jpg"),25,0,100,100);
    f.add(p);
    f.setSize(500, 500);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}



Donc j'ai surement du louper quelque chose ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 févr. 2012 à 10:07
Non, ce n'est pas exactement la même classe que celle que je t'ai envoyé.

Et non, je ne ferais pas comme ca. Attend une seconde, je te fais un code.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 févr. 2012 à 10:16
Tu pourras constater que le code que je te donne est plus propre que ce que tu faisais : il n'y a pas de duplication de code, chaque opération n'est effectué qu'une fois et les classes ont des rôles plus modulaires : PanelImage sert uniquement à créer un JPanel avec une image en fond.
GroupeImage sert à regrouper un ensemble de PanelImage.

C'est plus simple à comprendre, et à maintenir.
0
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
17 févr. 2012 à 10:28
Ahhh Merci beaucoup ! j'ai enfin réussi à afficher deux images en même temps, avec l'une au dessus de l'autre !

C'est quand même beaucoup plus compliquer de gérer les images en java que en C/C++ ..
Maintenant, il me reste plus qu'a trouver comment gérer la souris pour détecter quand on clique sur une image, et j'aurais déjà bien avancer !

Merci encore pour tes réponses rapides et le temps que tu m'as consacré.
C'est fort probable qu'on se retrouve pour un autre post sur un autre sujet ^^

Lastea.
0
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
17 févr. 2012 à 12:33
Merci, c'est effectivement très simple j'aurais pas penser a faire ca ^^


Par contre j'ai un nouveau soucis,est ce qu'il est possible de faire une espece de database avec a chaque fois : String, String, int, int ?

Je m'explique :

Il faudrait que je fasse une boucle, qui pour chaque image, créer un PanelImage lui etant associer (sachant que j'ai rajouter une String qui correspond au nom de la commande a effectuer quand on click sur cette image dans le constructeur de PanelImage) pour pouvoir charger toutes les images a chaques changements de piece.

En shématisant :

GroupeImage g = new GroupImages();
for (int i = 0; i <= (nb d'images a charger); i++)
{
PanelImage p[i] = new PanelImage (image[i], command[i])
g.addPanelImage(p[i],x[i],y[i],640,480)
}

Je ne sais pas si c'est très très clair comme question .. On m'as conseiller de créer un fichier text et de le parcourir pour avoir chaque info correspondant a chaques PanelImages, mais je ne sais pas du tout faire ca ..
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 févr. 2012 à 13:34
Tu connais assez mal java non ? Tu devrais peut être commencer par trouver un tutoriel qui te montre un peu les bases.

Accéder à un fichier texte faisant selon moi partie des bases...
0
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
17 févr. 2012 à 15:10
Je ne connais pas tres bien Java effectivement, je sais comment acceder a un fichier Texte, mais je ne sais pas vraiment comment faire un fichier texte qui me sers de data, et l'utiliser a bon escient. Mais je vais regarder si il y'as un tuto la-dessus :)
0
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
18 févr. 2012 à 17:28
Re-Bonjour, ma question n'as plus rien a voir avec celle de départ, mais je ne sais pas trop dans quelle catégorie la poster, et apparemment c'est quasiment toujours toi (julien39) qui répond, donc bon ...

Alors voila, j'ai réussi a parcourir mes fichiers texte, jusqu'ici tout va bien, sauf que maintenant, il faudrait que je modifie mes fichiers au cours du programme.


Par exemple :

Mon fichier serait :

1 NomImage.jpg etc ........
1 NomImage2.jpg etc ........


Et je voudrait le modifier en, par exemple :

0 NomImage.jpg etc ....
1 NomImage.jpg etc ....


En fait, 1 ou 0 me servirais a savoir si je dois afficher l'image ou pas (suivant si l'utilisateur a pris l'objet ou non).
Donc je cherche une manière de faire pour que en gros je puisse modifier le premier caractère de la ligne X de mon fichier texte.
Je sais lire la ligne X de mon fichier, mais je ne sais pas comment en remplacer le premier caractere ...
0
Lastea Messages postés 16 Date d'inscription lundi 31 janvier 2011 Statut Membre Dernière intervention 19 février 2012
19 févr. 2012 à 11:31
Après moult recherche j'ai trouver ce qui me fallais avec RandomAccessFile.

Voila, mon systeme de point and click est enfin pret :)

Merci a toi Julien39, au plaisir :)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
19 févr. 2012 à 18:36
De rien, n'oubli pas d'accepter les réponses qui t'on aidé.

a+
0
Rejoignez-nous