kostenloser Webspace werbefrei: lima-city


Simples Memory Spiel - Sleep in Mausklick Event

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    Hallo zusammen,

    ich möchte ein Memory Spiel mit Java programmieren. Ich habe eine Klasse "GameFrame" die von der JComponent Klasse erbt und die MouseListener Klasse implementiert. Diese Klasse wird in der Main Klasse in ein JFrame geladen. Dann habe ich noch eine Klasse "Karte" für die Memory Karten. Dort werden folgende Informationen gespeichert:

    x & y Position, höhe, breite, Farbe der Vorderseite, Farbe der Rückseite, aktive Seite

    In der GameFrame Klasse werden alle Karten in einer ArrayList gespeichert und in der paintComponent Methode wird dann jede Karte aus der Liste mit der Farbe der aktiven Seite gezeichnet.

    Folgenden Code habe ich jetzt für ein Mausklick Event:

    public void mouseClicked(MouseEvent e) {
    	// Für jede Karte überprüfen ob auf sie geklickt wurde, falls ja wird die aktive Farbe geändert
    	for(Karte karte : karten){
    		// Es wird überprüft ob die Position des Mausklicks innerhalb der entsprechenden Karte liegt. 
    		// Bei x wird + 8 und bei y + 30 gerechnet, da man den Rand des Fensters dazu zählen muss 
    		if(e.getX() > karte.getX() + 8 && e.getX() < karte.getX()+karte.getWidth() + 8 && e.getY() > karte.getY() + 30 && e.getY() < karte.getY()+karte.getHeight() + 30){
    			karte.setAktiv(karte.getVorderseite());
    			
    			repaint();
    
    			if(!klicks.contains(karte)){
    				klicks.add(karte);
    			}
    				
    			// Aufgedeckte Karten überprüfen
    			if(klicks.size() == 2){
    				if(klicks.get(0).getAktiv() != klicks.get(1).getAktiv()){
    					klicks.get(0).setAktiv(klicks.get(0).getRueckseite());
    					klicks.get(1).setAktiv(klicks.get(1).getRueckseite());
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					}
    					repaint();
    				}
    				klicks.clear();	
    			}
    		}
    	}
    }


    Also zuerst wird halt überprüft auf welche Karte geklickt wurde. Dann wird die aktive Seite der Karte geändert und dann wird neu gezeichnet. Dann gibt es noch eine ArrayList wo jeweils immer zwei Klicks drin gespeichert werden. Wenn also auf zwei verschiedene Karten geklickt wurde, also wenn zwei Karten in der Liste sind, dann soll überprüft werden, ob sie die gleiche Farbe haben. Wenn nicht, dann soll die aktive Seite der beiden Karten wieder geändert werden und dann soll eine Sekunde gewartet werden, damit man eine Sekunde Zeit hat um zu sehen welche Farbe die zweite Karte hat, auf die man geklickt hat, und dann soll neu gezeichnet werden. Wenn sie aber gleich sind bleiben sie so liegen. Dann wird die "klicks" liste wieder geleert.

    Jetzt läuft es aber so ab:

    Beim ersten Klick wird alles normal ausgeführt, die Karte verändert die Farbe. Beim zweiten Klick auf eine andere Karte passiert dann erstmal eine Sekunde lang nichts und dann wird die erste Karte auf die geklickt wurde wieder umgedreht. Also die Karte auf die als zweites geklickt wird, wird erst gar nicht verändert. Und ich verstehe nicht warum das so ist. Weil eigentlich wird ja nach jedem Klick die aktive Farbe verändert und dann neu gezeichnet. Aber beim zweiten Klick wird komischerweise erst nach dieser einen Sekunde neu gezeichnet und somit sieht man ja nicht welche Farbe die zweite Karte hatte.

    Kann jemand erkennen woran das liegt?

    Hier noch der Code aus der paint Methode:

    public void paintComponent(Graphics g){
    	super.paintComponent(g);
    		
    	// Jede Karte aus der Liste wird gezeichnet
    	for(Karte karte : karten){
    		// Die aktive Farbe wird gezeichnet, also am Anfang die Farbe der Rückseite und nach einem Klick die Farbe der Vorderseite
    		g.setColor(karte.getAktiv());
    		g.fillRect(karte.getX(), karte.getY(), karte.getWidth(), karte.getHeight());
    	}
    }




    Viele Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mir ist erstmal etwas anderes aufgefallen, deine Fragestellung beantworte ich später.

    Ich gehe mal davon aus, dass die Memory-Karten immer gleich groß sind und aus dem, was du bisher geschrieben hast, gehe ich davon aus, dass die Karten nicht bewegt werden können. Wenn sie alle in einem Raster liegen mit gleichem Abstand, kannst du das Programm viel Performanter machen!

    Anstatt jede Karte zu testen, ob sie angeklickt wurde, kannst du ausrechnen, ob und welche Karte angeklickt wurde:
    Kartenbreite 10px, Kartenhöhe 10px, Kartenabstand 2px
    FeldX=floor(Maus.getX()/(10+2));
    FeldY=floor(Maus.getY()/(10+2));

    Die Lücke rechts von der Karte und darüber zählt bei diesem Code noch dazu, was aber eigentlich für ein Spiel kein Problem darstellen sollte. Zentrieren kannst du dein Klickbereich, indem du von der Mausposition die Hälfte des Kartenabstands abziehst.

    Letztlich erhältst du die Koordinaten deiner Karte ohne durch alle Karten durchzuschleifen.
    Wenn du statt einer X- und Y-Koordinate einen Index haben möchtest musst du lediglich rechnen Index=FeldX+LängeX*FeldY

    Wenn du es so nicht machen möchtest, dann beende zumindest deine Schleife, sobald die richtige Karte gefunden wurde. Dann läuft es zumindest für die ersten Karten schneller.



    Beitrag zuletzt geändert: 22.1.2016 22:24:11 von test42test
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!