Mehrere MouseListener?

  • Themenstarter Themenstarter conzo
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

conzo

Gast
Hallo,
Ich habe folgendes Problem:

Ich soll für die Uni ein Mühle Spiel programmieren, dass durch MouseKlicks gesteuert werden kann.
Also ich bin jetzt soweit, dass ich alle grundlegenden Spielabläufe fertiggestellt habe und via Tastatur spielen kann.
Über ein Frame lasse ich mir das Spielfeld darstellen. Ok soweit. Spielsteine setzen per Mouseklicks kann ich auch (also ich habe Bereiche deklariert, wenn man auf diese klickt, wird dorthin ein Spielstein gezeichnet. Ausserhalb des Bereiches passiert nichts.) Nur jetzt kommt meine Problem:
Habe ich durch setzen der Steine eine Mühle geschlossen, müsste ich eigentlich den Stein anklicken, den das Spiel entfernen soll. Nur dann hänge ich daran fest, dass der zu entfernende Stein als der nächste Stein den es zu Setzen gilt erkannt wird. D.h. ich bräuchte eigentlich dafür einen eigenen Listener, der sobald eine Mühle erkannt wird den nächsten Klick als den erkennt der einen Stein entfernen soll... ...nur wie mache ich das?
Code sieht im allgemeinen so aus:

Code:
public class Spielfeld extends JFrame {

public Spielfeld (){

initalisieren der Koordinaten auf die geklickt werden soll

windowListener()

mouseListener(){
   mouseClicked(){
      bekomme X-Y Achsen
       schauen ob in deklarierten Positionen
        wenn ja, dann setze/zeichne Spielstein
         schauen ob gezeichneter Stein eine Mühle schliesst
          wenn ja dann...
-->      und ab hier hänge ich dann
}//mouseListener 
}//Konstruktor
}//Klasse-Spielfeld
class zeichneSpielfeld{
   Thread zum neuzeichnen

 paint(){} //Zeichnen des Spielfeldes
}

Vielleicht liegt es auch daran, dass ich zum zeichnen, bzw zum neuzeichnen des Spielfeldes einen Thread benutze...
Also, wäre nett, wenn mir jemand weiterhelfen kann. Ich bedanke mich schonmal im Vorraus!!!

mfg conzo
 
Warum so kompliziert?
Du kannst doch mit Wahrheitstypen (boolean) arbeiten.
Wenn ein Stein gesetzt ist = true, wenn nicht = false. Die Variable kannst Du in der "Steinklasse" einführen und verwalten. Somit "weiß" jede Stein-Instanz, ob sie gesetzt wurde, oder nicht.
Und bei einem Mausklick kannst Du nun abfragen
Code:
if(stein.istGesetzt())
  ...
 
erstens mal würd ich das anders machen:
Code:
 mouseClicked(){
      bekomme X-Y Achsen
      schauen ob in deklarierten Positionen
      wenn ja, dann setze/zeichne Spielstein
      schauen ob gezeichneter Stein eine Mühle schliesst
      wenn ja dann... 
            schauen ob gezeichneter Stein eine Mühle schliesst
            wenn ja dann...  
                [b]entferne den anderen...[/b]
}//mouseListener

wenn der stein automatisch entfernt wird, ist das für den spieler eh angenehmer.
falls du jetzt das problem hast, dass du auf den alten stein nicht zugreifen kannst, dann leg dir beim erzeugen ein array an, das dein spielfeld darstellt, und halt dir da referenzen auf die steine. (aber vermutlich wirst du das eh haben).

edit: falls du an deiner methode festhalten willst (wovon ich abraten würde):
mach dir einen boolean removingStone.
im mouselistener:
Code:
public void mouseClicked(MouseEvent e) {
   if (removingStone) {
         // jag den stein zum teufel (vorher prüfen ob es auch der stein in der mühle ist!!!!! )
         removingStone = false;
   }
    else {
         //was du vorher auch getan hast, dann:
          schauen ob gezeichneter Stein eine Mühle schliesst
            wenn ja dann...  
                removingStone = true;
   }
   
}

mehrere mouselistener kannst du zwar theoretisch setzten, macht aber keinen sinn, da nur "der oberste" ausgewertet wird.
sprich der zuerst (oder der zuletzt?!?) geaddete mouseListener fängt das event ab und verarbeitet es, bei den restlichen kommt nichts mehr an.
 
zd hat gesagt.:
mehrere mouselistener kannst du zwar theoretisch setzten, macht aber keinen sinn, da nur "der oberste" ausgewertet wird.
sprich der zuerst (oder der zuletzt?!?) geaddete mouseListener fängt das event ab und verarbeitet es, bei den restlichen kommt nichts mehr an.

Jap, genau das ist mein Problem. Wenn ich 2 mouseListener setze, wird immer nur der letzte, also der, der eigentlich zum entfernen von Steinen dienen soll verarbeitet. D.h. ich kann alle Spielsteine vom Feld entfernen, bis es leer ist und dann ist das Spiel "sozusagen beendet" weil keine Steine mehr da sind.
Angenommen ich setze einen Stein, klicke ich auf das Feld, rufe die Methode
Code:
setze(int Position)
auf und markiere den Stein in der entsprechenden Klasse als besetzt.
So, nun setze ich weiter steine, und prüfe ob der gesetzte Stein eine Mühle schliesst, tut er dies bekomme ich einen boolean zurückgegeben, dass eine Mühle vorhanden ist.
Code:
muehleVorhanden = positionInMuehle(int position)
So wenn jetzt muehleVorhanden == true, dann soll der nächste Klick die Position sein, die entfernt werden soll.
Code:
nehme(int position, String farbe)
und wie gesagt, handele ich diese Abfrage mit 2 mouseListenern ab, bleibe ich in der letzten hängen und bin nur noch am entfernen...

achso: und erstmal thx 4 fast Help!!!

mfg conzo
 
conzo hat gesagt.:
und wie gesagt, handele ich diese Abfrage mit 2 mouseListenern ab, bleibe ich in der letzten hängen und bin nur noch am entfernen...
du musst nur die zwei zu einem zusammenfassen, und prüfen, ob muehleVorhanden gesetzt ist (wie oben beschrieben).
wenn du noch probleme hast, dann poste doch einfach mal den code von deinen beiden mouseListenern.

mfg
 
Jup, ich teste das morgen früh mal, danke nochmal für die Mühe 🙂
wenn ich dann noch Probleme habe, melde ich mich noch...
 
zd hat gesagt.:
mehrere mouselistener kannst du zwar theoretisch setzten, macht aber keinen sinn, da nur "der oberste" ausgewertet wird.
sprich der zuerst (oder der zuletzt?!?) geaddete mouseListener fängt das event ab und verarbeitet es, bei den restlichen kommt nichts mehr an.

Was? Versteh ich dich falsch (hab nicht alles gelesen)? Oder ist das Schmarrn? Der Sinn von MouseListenern ist doch, dass alle ausgewertet werden, das wird in ner Collection gehalten ???:L
Man könnte consume() aufrufen, dann würden andere nicht mehr aufgerufen.
 
Illuvatar hat gesagt.:
zd hat gesagt.:
mehrere mouselistener kannst du zwar theoretisch setzten, macht aber keinen sinn, da nur "der oberste" ausgewertet wird.
sprich der zuerst (oder der zuletzt?!?) geaddete mouseListener fängt das event ab und verarbeitet es, bei den restlichen kommt nichts mehr an.

Was? Versteh ich dich falsch (hab nicht alles gelesen)? Oder ist das Schmarrn? Der Sinn von MouseListenern ist doch, dass alle ausgewertet werden, das wird in ner Collection gehalten ???:L
Man könnte consume() aufrufen, dann würden andere nicht mehr aufgerufen.

ich weiss es nicht, aber ich habe das oben beschriebene verhalten einmal so beobachtet.
ich bin der sache aber nicht weiter nachgegangen, weil eine andere lösung für mich eh praktikabler war.
soweit ich mich erinnere waren aber wirklich zwei (oder mehrere) mouseListener auf dem element, reagiert hat aber nur einer. hat man diesen wieder entfernt, hat der untere das event verarbeitet.
mfg
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben