Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Evento mouselistener per cambiare immagine
Forum - Java - Evento mouselistener per cambiare immagine

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Torre (Normal User)
Newbie


Messaggi: 14
Iscritto: 24/11/2009

Segnala al moderatore
Postato alle 17:58
Martedì, 24/11/2009
Ciao a tutti!!

sto progettando il gioco del memory, quello insomma dove devi trovare le coppie di carte uguali. Però ho qualche problema con il gestire l'evento del click del mouse per mostrare le carte e poi confrontarle..voi come lo fareste?? io ho creato un frame con un jpanel principale diviso con un gridlayout in 4x4. in ogni cella ho poi inserito un altro jpanel nel quale mettere le carte..per il momento ho creato le seguenti classi:

- Main;
- Frame per la creazione del frame;
- PrincipalPanel per la gestione del JPanel principale
- RetroPanel per la gestione dei 16 singoli pannelli nel gridlayout
- Carte che contiene le stringhe con il percorso del file delle immagini delle 8 carte e una funzione getUrl per passare il percorso del file quando bisogna istanziare le immagini

Grazie mille a chiunque potrà darmi una mano :)

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 18:25
Martedì, 24/11/2009
in questa situazione l'ideale è ricorrere al pattern Model-View-Controller.
In pratica così separi la parte dei dati e dell'elaborazione, quindi nel Model hai griglia array n*n con metodi per selezionare l'elemento in (x, y) e fare tutti i controlli e settare lo stato delle varie celle (tutti astrattivamente, senza pensare a jpanel ecc...).

Poi la parte grafica starà nella View che si auto aggiornarà in base ai valori che prenderà dal model.

Infine il Controller gestirà i click intercettando dove è stato fatto e dicendo poi al model che è stata cliccata la cella (x, y) allora il Model aggiornerà il suo stato interno, notificherà la View dell'aggiornamento che si ridisegnerà coi dati aggiornati.

Cercando magari qualche documento su google trovi maggiori spiegazioni su questo pattern fondmentale.

PM Quote
Avatar
Torre (Normal User)
Newbie


Messaggi: 14
Iscritto: 24/11/2009

Segnala al moderatore
Postato alle 11:36
Mercoledì, 25/11/2009
Grazie mille! solo una cosa..non ho ben capito il concetto della griglia array n*n..devo farla senza GridLayout? Se sì come?? Io ho pensato a un array di tipo byte
(es.:private byte griglia[][];
     griglia = new byte[4][4];
     ecc...)

ma poi non posso fare il cast delle immagini se le carico come tipo IMAGE. Quindi?

Ultima modifica effettuata da Torre il 25/11/2009 alle 12:20
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:17
Mercoledì, 25/11/2009
nel modello devi dimenticarti di come poi implementi la View, nel modello fai una struttura dati astratta come un array bidimensionale, poi se nella View usi un gridlaout, disegni a mano in un cavans o altre cose non deve influenzare l'implementazone del modello di base.

cmq usare un tipo di dato byte per rappresentare la griglia di immagini non ha senso, devi usare un tipo di dato che possa rappresentare la griglia di immagini (e con un singolo byte è difficile).

potresti fare un array bidimensionale di tipo short dove con 0 indichi una cella coperta, con 1 una girata, e con 2 una eliminata perchè è stata scartata.

poi crei un altro array n*n di stringhe dove associ alla stessa cordinata (x, y) della griglia si short il nome dell'immagine che sarà poi il nome del file fisico contenente l'immagina.

O meglio ancora fai un array bidimensionale di una classe tuo chiamata Cella dove incapsuli tutte queste caratteristiche.

Ultima modifica effettuata da netarrow il 25/11/2009 alle 21:18
PM Quote
Avatar
Torre (Normal User)
Newbie


Messaggi: 14
Iscritto: 24/11/2009

Segnala al moderatore
Postato alle 1:04
Giovedì, 26/11/2009
ok perfetto grazie mille!! :) tutto più chiaro...solo un ultima cosa..potresti spiegare meglio la questione dei due array come intendi costruirli?? scusa ma il java non lo adoro..ma l'esame devo darlo :)

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 7:42
Giovedì, 26/11/2009
No ora che ci penso quella soluzione dei due array è troppo vecchio-stile, in java è più pulita la soluzione della cella.

Nel senso che la cosa migliora dal punto di vista progettuale è fare la classe Cella, che incapsula:

- nome dell'immagine (che sarà anche il nome del file fisico dell'immagine, ma al modello questo non deve interessare)
- uno status in una enum magari dove indichi se è coperta, scoperta o scartata
- magari per comodità incapsuli le sue cordinate x, y nell'array bidimensionale dove è inserita

Poi nel modello dichiari un array bidimensionale che contiene oggetti Cella e metti dentro dei metodi per gestire il gioco quindi gestire la scelta della cella x, y e impostarla su scoperta, confrontare due celle, scartarle se sono uguali ecc...

Praticamente devi fare un Engine del gioco astratto, a tal punto di poterlo provare a console, e poi costruirci attorno una View grafica.

Se fai il programma orientato ai dati anzichè alle funzioni fondamentalmente si scrive da solo.

Ti allego un piccolo progetto che implementa il pattern MVC per giocare a una battagia navale semplficata, così vedi come strutturare questo genere di progetti


netarrow ha allegato un file: battaglianavale.zip (8159 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da netarrow il 26/11/2009 alle 7:44
PM Quote
Avatar
Torre (Normal User)
Newbie


Messaggi: 14
Iscritto: 24/11/2009

Segnala al moderatore
Postato alle 10:19
Giovedì, 26/11/2009
Grazie mille di tutto!!! non potevo chiedere di meglio! ;)

PM Quote
Avatar
Torre (Normal User)
Newbie


Messaggi: 14
Iscritto: 24/11/2009

Segnala al moderatore
Postato alle 14:23
Giovedì, 03/12/2009
Finalmente ho quasi completato il gioco e ho fatto tutto in 4 classi:
Carta
Codice sorgente - presumibilmente Java

  1. package memory;
  2.  
  3. import java.awt.Image;
  4. import java.awt.Toolkit;
  5.  
  6. public class Carta {
  7.     static final int VISIBILE = 1;
  8.     static final int COPERTA = 0;
  9.     static final int RIMOSSA = -1;
  10.  
  11.  
  12.     private short stato;
  13.     private short tipo;
  14.     private Image immagine;
  15.     private Image retro;
  16.  
  17.     public Carta(short simbolo){
  18.         caricaImmagine(simbolo);
  19.         stato = Carta.COPERTA;
  20.     }
  21.  
  22.     public Image disegna(){
  23.         if (stato == Carta.VISIBILE)
  24.             return immagine;
  25.         else
  26.             if(stato == Carta.COPERTA)
  27.                 return retro;
  28.             else
  29.                 return null;
  30.     }
  31.  
  32.     public void volta(){
  33.         if (stato == Carta.VISIBILE)
  34.             stato = Carta.COPERTA;
  35.         else
  36.             if(stato == Carta.COPERTA)
  37.                 stato = Carta.VISIBILE;
  38.     }
  39.    
  40.     public void rimuovi(){
  41.         stato = Carta.RIMOSSA;
  42.     }
  43.  
  44.     public void caricaImmagine(int n){
  45.         Toolkit kit = Toolkit.getDefaultToolkit();
  46.         immagine = kit.getImage("C:/Users/Nicolò/Pictures/carta"+n+".jpg");
  47.         retro = kit.getImage("C:/Users/Nicolò/Pictures/carta_retro.jpg");
  48.     }
  49.  
  50.     public int simbolo() {
  51.         return tipo;
  52.     }
  53.  
  54.     public boolean Uguale(Carta compara) {
  55.         if (compara.simbolo() == tipo)
  56.             return true;
  57.         else
  58.             return false;
  59.     }
  60. }



Mazzo
Codice sorgente - presumibilmente Java

  1. package memory;
  2.  
  3. import java.awt.*;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. /**
  7.  *
  8.  * @author Nicolò
  9.  */
  10. public class Mazzo {
  11.  
  12.     ArrayList<Carta> mazzo;
  13.     Carta carte[];
  14.  
  15.     public Mazzo(){
  16.  
  17.         Toolkit kit = Toolkit.getDefaultToolkit();
  18.         carte = new Carta[16];
  19.         mazzo = new ArrayList<Carta>(15);
  20.         mescola();
  21.     }
  22.  
  23.     public void mescola(){
  24.  
  25.         int i = 0;
  26.  
  27.         for(int j = 0; j < 2; j++)
  28.             for(short p = 1; p <= 8; p++){
  29.                 carte[i] = new Carta(p);
  30.                 mazzo.add(i, carte[i]);
  31.                 i++;
  32.         }
  33.  
  34.         Collections.shuffle(mazzo);
  35.  
  36.         for (int h = 0; h < mazzo.size(); h++){
  37.             carte[h] = mazzo.get(h);
  38.         }
  39.     }
  40.  
  41.     public Carta[] mazzo(){
  42.         return carte;
  43.     }
  44.    
  45.     public void rimuoviMazzo(int i){
  46.         carte[i].rimuovi();
  47.     }
  48. }



View
Codice sorgente - presumibilmente Java

  1. package memory;
  2.  
  3. import java.awt.Canvas;
  4. import java.awt.Color;
  5. import java.awt.Dimension;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.GridLayout;
  9. import java.awt.Image;
  10. import java.awt.Toolkit;
  11. import java.awt.event.MouseEvent;
  12. import java.awt.event.MouseListener;
  13. import java.awt.image.BufferedImage;
  14. import java.util.Observable;
  15. import java.util.Observer;
  16. import javax.swing.JFrame;
  17. import javax.swing.JPanel;
  18. /**
  19.  *
  20.  * @author Nicolò
  21.  */
  22. public class View extends JPanel implements MouseListener{
  23.     private int wc, hc, w, h;
  24.     private final Mazzo m;
  25.     private BufferedImage buffer;
  26.     private Graphics gbuf;
  27.     private JFrame frame;
  28.     private Carta c[];
  29.  
  30.     /**
  31.      * Viene richiamato ogni volta che un componetne grafico
  32.      * viene aggiornato.
  33.      */
  34.     @Override
  35.     public void update(Graphics g) {
  36.         paint(g);
  37.     }
  38.  
  39.     public View (Mazzo m){
  40.         this.m = m;
  41.         c = m.mazzo();
  42.         gbuf = (Graphics2D) buffer.getGraphics();
  43.         this.addMouseListener(this);
  44.         frame = new JFrame("Memory 1.0 - Nicolò Torreggiani");
  45.         frame.setBounds(20, 20, 400, 420);
  46.         frame.setResizable(false);
  47.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  48.         this.setLayout(null);
  49.         frame.getContentPane().add(this);
  50.         frame.setVisible(true);
  51.         }
  52.  
  53.     @Override
  54.     public void paint(Graphics g) {
  55.  
  56.         int i = 0;
  57.         buffer = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
  58.         Graphics immagine = buffer.getGraphics();
  59.         for (int x = 0; x < 4; x++){
  60.             for(int y = 0; y < 4; y++){
  61.                 immagine.drawImage(c[i].disegna(), x*100, y*100, null);
  62.                 i++;
  63.             }
  64.         }
  65.     }
  66.  
  67.     public void mouseClicked(MouseEvent e) {}
  68.  
  69.     public void mousePressed(MouseEvent e) {
  70.         short p = 0;
  71.         int x, y, i, j;
  72.         Carta one, two;
  73.         one = new Carta(p);
  74.         two = new Carta(p);
  75.         x = y = i = j = 0;
  76.         while(j < 2){
  77.         if (e.getX() >= x*100 && e.getX() <= (x*100)+74 && e.getY() >= y*100 && e.getY() <= (y*100)+74){
  78.             c[i].volta();
  79.             i++;
  80.             j++;
  81.             two = one;
  82.             one = c[i];
  83.             }
  84.         }
  85.          if(one.Uguale(two)){
  86.              one.rimuovi();
  87.              two.rimuovi();
  88.          }
  89.          else{
  90.             one.volta();
  91.             two.volta();
  92.          }
  93.     }
  94.  
  95.     public void mouseReleased(MouseEvent e) {}
  96.  
  97.     public void mouseEntered(MouseEvent e) {}
  98.  
  99.     public void mouseExited(MouseEvent e) {}
  100.  
  101. }


Ovviamente c'è anche il main. Quando faccio partire il programma però mi ritorna il seguente errore:

Codice sorgente - presumibilmente Java

  1. Exception in thread "main" java.lang.NullPointerException
  2.         at memory.View.<init>(View.java:42)
  3.         at memory.Main.main(Main.java:13)
  4. Java Result: 1
  5. BUILD SUCCESSFUL (total time: 2 seconds)



Se non sbaglio significa che ho dimenticato di istanziare qualcosa ma non capisco. Cmq poi volevo anche consigli sulla gestione dell'evento mouse pressed e sulla grafica se secondo voi è ok.

Grazie mille a chiunque riuscirà a rispondermi ;)

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 18:03
Giovedì, 03/12/2009
allegaci il progetto intero così abbiamo pronto per provare e non dobbiamo noi metterci a copiare file per file.

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo