# Problem bei nem kleinen MemoryGame



## guenni81 (28. Aug 2004)

Hallo,
ich bin momentan dabei ein kleines Memory Spiel zu schreiben. Die Bilder sind schon auf der Form drauf, dies war soweit kein Problem. Nun ist meine Frage wie es möglich ist die obere Karte abzudecken...
Dies muss natürlich über die Position des Mauszeigers geschehen, dass ist mir soweit auch bewusst, bloss wie muss ich dann weiter vorgehen???


----------



## Beni (28. Aug 2004)

Sind diese Bild einzeln auf einer Component? Oder alle auf einer Component? Oder wie, oder was?
Ein bisschen mehr Informationen bitte :wink:

Je nachdem sieht die Lösung total anders aus, grundsätzlich musst du einer oder mehreren Components einen MouseListener hinzufügen. Da liest du am besten hier ein bisschen.


----------



## guenni81 (28. Aug 2004)

Hi,
die Bilder sind alle auf einer Componente. Hab mir eine Imagevariable angelegt, zeichne die Bilder darauf und zeichen anschließend das Image auf das JFrame.  Für das habe ich dann die paint Methode überschrieben. Der MouseListener ist ebenfalls schon eingebunden, gibt im moment aber nur ne showMessage aus...
Hier noch ein wenig code:

```
// Eigenschaften
	Image ScreenImage;	// Bild das bei der Paint Methode gezeichnet wird sobald es != null ist
	Image Pictures[]; // Var zum Bilder rein laden
	int  RandomImageField[];

	// Paint Methode überschreiben
	public void paint(Graphics b)
	{
		Graphics2D g = (Graphics2D)b;

		if(ScreenImage != null)
			g.drawImage(this.ScreenImage,0, 0, this);
	}

	// Funktion die die Bilder lädt
	private void LoadImage()
	{
		// Neue Bilder erstellen
		this.Pictures = new Image[20];

		// Alle Bilder laden
		for(int i=1, j=0; j < 20; i++,j++)
			this.Pictures[j] = new ImageIcon("C:/bilder/image" + i + ".jpg").getImage();	// Bilder laden
	}

	// Funktion zum zuteilen welches Bild auf dem Bildschirm wo gezeichnet werden soll
	private void makeRandomImages()
	{
		// Variable erzeugen
		Random r = new Random(); // Random erzeugen
		int ImageNumber;
		int Field = 0;
		int Number[] = new int[18];
		int ExistCount = 0;

		this.RandomImageField = new int[36]; // neue Int Wert erzeugen

		// Solange nicht alle Felder gefüllt wurden weitermachen
		while(Field < 36)
		{
			ImageNumber = r.nextInt(18); // Neue Zufallszahl zwischen 0 und 16 generieren

			// Überprüfen ob schon zwei Zahlen existieren
			if(Number[ImageNumber] < 2)
			{
				Number[ImageNumber]++;
				this.RandomImageField[Field] = ImageNumber;
				Field++;
			}

		}
	}


	// Funktion die die Bilder auf die Fläche zeichnet
	private void PaintImagesToFrame()
	{
		// Variable deklarieren
		Graphics g;
		int x = 10;
		int y = getInsets().top + 5;
		int displayImage = 0;

		this.ScreenImage = createImage(getSize().width, getSize().height); // Bild erstellen
		g = this.ScreenImage.getGraphics(); // Graphics Object holen

		// Schleifen zum Zeichnen der Bilder
		for(int i=0; i < 6;i++ )
		{
			for(int j=0; j < 6; j++)
			{
				g.drawImage(this.Pictures[this.RandomImageField[displayImage]],x,y,this); // Bild zeichnen
				g.drawImage(this.Pictures[19],x,y,this); // Bild zeichnen
				x += this.Pictures[this.RandomImageField[displayImage]].getWidth(this) + 10; // Bildbreite errechnen und 10 dazu addieren
				displayImage++;
			}

			x = 10; // x wieder auf Anfangswert setzen
			y += this.Pictures[0].getHeight(this) + 10; // Bildhöhe errechnen und 10 dazu addieren
		}
		repaint();	// Neuzeichnen
	}
```


----------



## guenni81 (31. Aug 2004)

Niemand ne idee???


----------



## Beni (1. Sep 2004)

Doch, die Idee wollte nur nicht ins Forum.

Füg der Component einen MouseListener hinzu, und mach das etwa so:

```
public class ImagePanel{

  public ImagePanel(){


    addMouseListener( new MouseAdapter(){
      public void mouseClicked( MouseEvent e ){
         int mx = e.getX();
         int my = e.getY();

         int x = 10, y = 10;

         for(int i=0; i < 6;i++ ){
           for(int j=0; j < 6; j++){
             int width = this.Pictures[this.RandomImageFiled[displayimage]].getWidth(this);
             int height = this.Pictures[this.RandomImageFiled[displayimage]].getHeight(this);

             if( x <= mx && y <= my && x + width >= mx && y + height >= my ){
                // das aktuelle Bild wurde angeklickt!

                return; // fertig mit rechnen
             }
             
             x += width + 10;
             displayImage++;
          }

          x = 10; // x wieder auf Anfangswert setzen
          y += height + 10; // Bildhöhe errechnen und 10 dazu addieren
          }         
        }
      }
    });
  }
}
```


----------



## guenni81 (1. Sep 2004)

Sobald ich zuhause bin werde ich es versuchen. Danke...
P.S. MouseListener hab ich schon eingefügt, der macht aber noch nix sinnvolles...


----------



## guenni81 (1. Sep 2004)

@Beni
Hi,
dein Code musste ich noch ein wenig ändern da er ausserhalb der Schleifen das width und height nicht kannte. 
Mein letztes Problem ist nur noch das er bei den Mausklicks nur bei der ersten Bilderreihe (nach x richtung) reagiert. Die Var y wird ebenfalls korrekt hochgezählt, also muss dieser Fehler an dem if liegen. Soweit ich dies aber sehen konnte ist dies Korrekt. Irgendwie versteh ich das nicht warum das nicht funktioniert. 
Hier mal der geänderte Code:

```
public void mouseClicked( MouseEvent e )
	{
        int mx = e.getX();
        int my = e.getY();

        int x = 10, y = getInsets().top + 5;
        int width = 0;
        int height = 0;
        int displayImage = 0;

        for(int i=0; i < 6;i++ )
        {
        	height = this.Pictures[this.RandomImageField[displayImage]].getHeight(this);
        	for(int j=0; j < 6; j++)
	        {
        		width = this.Pictures[this.RandomImageField[displayImage]].getWidth(this);
	            if(x <= mx && x + width >= mx && y <= my && y + height >= my)
	            {
	               // das aktuelle Bild wurde angeklickt!
	            	JOptionPane.showMessageDialog(this,"Jepp");
	
	               return; // fertig mit rechnen
	            }
         
	            x += width + 10;
	            displayImage++;
	        }
        	y += height + 10; // Bildhöhe errechnen und 10 dazu addieren
        }

        
        x = 10; // x wieder auf Anfangswert setzen
        y = 10;
	}
```


----------



## guenni81 (2. Sep 2004)

Hab den Fehler gefunden. 
Das x = 10; muss in die erste vor schleife rein, was ja auch logisch ist.


----------

