Programm soll auf die Eingabe vom Mouselistener warten.

Status
Nicht offen für weitere Antworten.
B

BlinderOpa

Gast
Hi...
ich möchte das altbekannte Übungsprogramm Schiffeversenken mit Java programmieren.
die Consolenversion ist schon komplett lauffähig und der Computer stellt sich sogar nicht mal soo dum an...^^

Jetzt bin ich dabei, das ganze grafisch aufzubauen.
Die anzeige selber funktioniert und ich hab für das Panel der Feld-Anzeige auch einen Mouselistener...
Im Moment soll der Mouslistener erstmal ermitteln, in welches Feld ich schießen möchte.

mein Problem:

das Programm rennt mir einfach über die Stelle hinweg, in der ich die Eingabe über die Maus machen möchte...
in der Console wartet der einfach bis die Eingabe über den Buffered Reader kommt.

ich hab da zwar eine Lösung, die saugt aber 100% der CPU da es eine Endlosschleife ist, die solange schleift, bis ich geclickt hab... und das mit der maximalen Geschwindigkeit...^^

Code:
         boolean clicked= Grafik.getclicked();
         while (clicked==false)
	{clicked= Grafik.getclicked();}

oder ich mach das über eine Eingabe in der Console und jedesmal wenn ich ein Feld auswähle muss ich Fenster wechseln und Eingabe drücken...-.-
Code:
			BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in) );
			System.out.println ("weiter? ");
			String input = userIn.readLine();
[/u]
 
G

Gast

Gast
Das Problem liegt bei deinem Programmdesign,
schreibe das programm einfach so um, dass es erst beim klicken eines schiffes den Algorithmus startet also -> prüft ob sich dort ein ziel befindet -> falls nein: zeige wasseranimation etc... -> falls doch: zeige brennende animation und speichere status in vector der schiffe...

ggf kannst du während diese animation und prüfung abläuft eine flag setzen, die weiteres klicken verbietet..
 

Leroy42

Top Contributor
Was du da machst, hat ja auch gar nichts mit einem MouseListener zu tun.

Der MouseListener wird automatisch aufgerufen, wenn die
Maustaste gedrückt wurde und informiert dann die Anwendung.

Hast du dir die Kapitel über Action/Mouse-Listener überhaupt
schon einmal durchgelesen?
 

BlinderOpa

Mitglied
hm... werd ich mal überdenken.. danke...
ist nur blöd, da ich bisher alles so in Module verschachtelt habe...
und wollte zu dem bisherigen Consolenspiel eigentlich nur die Grafik durch andere Module hinzufügen...^^
aber ich werde das mal ein wenig umdenken und so...

hab gehofft es gibt ein Befehl dafür, auf die Eingabe zu warten...
oder dass man den Buffered Reader etwas anders auslegen könnte...
so dass der anstatt der Tastatureingabe auf die Eingabe vom Mousemodul wartet...
 

Leroy42

Top Contributor
BlinderOpa hat gesagt.:
so dass der anstatt der Tastatureingabe auf die Eingabe vom Mousemodul wartet...
... der MouseListener (deines Maus-Moduls) muss deine
eigentliche Anwendung informieren, daß etwas durch
den user geschehen ist.
 

BlinderOpa

Mitglied
hm.... im Prinzip soll das Mouseevent die Koordinaten ausrechnen und neuX und neuY damit füttern...
neuX und neuY soll dann weitergeleitet werden über das Mainprogramm (in dem bei mir alles zusammenläuft...) zur Spielfeldclasse bzw zur Zielcomputerclasse die die Trefferverwertung usw. macht...
also soll das Programm abwarten bis ich mit der Eingabe fertig bin... oder bis ich n boolean auf True gesetzt habe oder ähnliches...
 

Leroy42

Top Contributor
Code:
public void mouseClicked(MouseEvent e) {
  int x = e.getX() / widthOfField;
  int y = e.getY() / heigthOfField;
  mainModule.doSomethingWith(x, y);
}
 

BlinderOpa

Mitglied
genau... nur die Main rauscht einfach über
mainModule.doSomethingWith(x, y);
drüber...-.-
so sieht mein Mouseevent aus... raus kommen schöne die Koordinaten meiner Tabelle..

Code:
	public void mouseClicked(MouseEvent m)
	{
	
		if( m.getSource() instanceof SpielfeldPanelModule) {
			SpielfeldPanelModule sfm = (SpielfeldPanelModule)m.getSource();

			neuX= m.getX();
			neuY = m.getY();
			neuX -= sfm.getInsets().left;
			neuX -= 20;
			neuY -= sfm.getInsets().top;
			neuY -= 20;
			neuX = (int)Math.floor(neuX / 20d)+1;
			neuY = (int)Math.floor(neuY / 20d)+1;
			
			click=true;
		}	
		//Objekt ist jetzt richtig. aber der wartet nicht auf den input...-.-
		PvE.setneuX(neuX); //hier wird das ganze an die Main "PvE" geschickt...
		PvE.setneuY(neuY);
		System.out.println(" Die Maus ist bei ( "+neuX+" | "+neuY+" )");
		}


und so siehts in der Main aus...

Code:
		Player1 schießt...
			System.out.println ("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM");
			System.out.println ("PLAYER 1 ist dran.");
			System.out.println ("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW");
			p1feld.printConsoleArray(zielP1.zielarray);
			Grafik.Hauptfenster(p1feld.getFeld(), zielP1.zielarray) ;


			BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in) );
			System.out.println ("weiter? ");
			String input = userIn.readLine();

			//Funktioniert... zieht aber Leistung ohne Ende durch das dauergefrage "clicked==true?" CPU Auslastung==100%...
//			boolean clicked= Grafik.getclicked();
//			while (clicked==false)
//			{clicked= Grafik.getclicked();}
//			daher wird das auskommentiert...

			neuX=Grafik.getneuX();
			neuY=Grafik.getneuY();
			
			zielP1.setneuX(neuX);
			zielP1.setneuY(neuY);

			System.out.println ("SCHUSS auf Y "+neuY+"! X "+neuX);

//			Schuss auswerten...
			treffer=false;
			treffer=p2feld.setMyFeldEnemyShot(neuY, neuX);

			if (treffer == true)
			{
				System.out.println ("TREFFER!!");
				zaehlerplayer2=zaehlerplayer2-1;
				System.out.println ("Ein Schiff-Feldchen weniger...:) "+zaehlerplayer2+" bleiben noch uebrig.");
			}
			else
			{
				System.out.println ("Daneben... Schade...");
			}
			zielP1.trefferAuswertung(treffer);

wie man sieht ist die hälfte noch auf die Console geschrieben... aber das ändere ich Schritt für Schritt...[/quote]
 

Marco13

Top Contributor
Hm. Das macht man ggf. über den wait/notify-Mechanismus. Sinngemäß wäre das dann sowas
Code:
class HauptPanel
{
    private int clickX, clickY;
 
    void spiele()
    {
         while (!spielZuende)
         {
              System.out.println("Warte auf Eingabe...");
              synchronized(this)
              {
                   try
                   {
                        wait();
                   }
                   catch (InterruptedException e) {}
              }
              System.out.println("Eingabe ist erfolgt. Es geht weiter");
              schießeAuf(clickX, clickY);
         }
    }


....
    public void mouseClicked(MouseEvent e)
    {
         clickX = berechneX();
         clickY = berechneY();
         
         System.out.println("Eingabe ist erfolgt. Sage dem main-loop, dass es weitergehen kann");
         synchronized(this)
         {
              notify();
         }
    }

Innerhalb eines "synchronized(hauptPanel)"-Blocks wird 'wait' aufgerufen. Dieses wait wartet (ohne Prozessorbelastung!) so lange, bis in einem anderen "synchronized(hauptPanel)"-Block dann 'notify' aufgerufen wird.
 

BlinderOpa

Mitglied
geht das auch klassen übergreifend?
das klingt so ziemlich danach was ich bräuchte...^^
ich bastle das mal so als versuch in einer Klasse...
 

Marco13

Top Contributor
Das geht auch Klassenübergreifend. Das entscheidende ist, dass in BEIDEN 'synchronized(object)'-Blöcken wirklich auf ein und dasselbe Objekt gesynchronized wird!
 

BlinderOpa

Mitglied
GEIL... funktioniert..:)
jetzt noch ein wenig verschönern...
danke...
das Problem beim Programmieren meistens ist, dass man einfach die Befehle nicht alle kennt... bzw nicht alle kennen kann...
 

Leroy42

Top Contributor
BlinderOpa hat gesagt.:
GEIL... funktioniert..:)

Dann ist ja gut!

Dennoch frage ich wozu das ganze Geraffel mit
wait/notify eigentlich notwendig ist.

Mit einer anderen Modulstruktur wäre das nicht
nötig gewesen.

Aber egal, ... es läuft :)
 

Marco13

Top Contributor
Warum "Geraffel"? Ich könnte mir vorstellen, dass da ein Thread lauft, der abwechselnd von zwei Spielern Eingaben erwartet. Und dieses Erwarten wird eben durch das 'wait' erreicht...? Aber vielleicht habe ich BlinderOpa's Absichten falsch verstanden...
 

phyrexianer

Bekanntes Mitglied
ist es nicht geschickter einfach durch den Mouslistener eine Methode aufzurufen ??? und der einfach die Koordinaten übergeben ??? also das was er in der Main hat einfach als eine Methode Schreiben ??? da braucht man keine Schleifen kein Sync usw. Die Methode wird dann aufgerufen wenn sie auch gebraucht wird. Denn wenn ich es richtig gelesen habe ist sogar ein "OnePlayer" Game !?!
Selbst bei zwei Spielern gäbe es da kein Prob wenn man zusätzlich noch den Spieler übergibt welche gedrückt hat.... zusätzlich zu den Koordinaten!
 

Leroy42

Top Contributor
Marco13 hat gesagt.:
dass da ein Thread lauft, der abwechselnd von zwei Spielern Eingaben erwartet.

Genau das sehe ich schon als falsches Design an (siehe phyrexianer).
Ich würde das Spiel eher so konzipieren, das das entsprechende
Modul sowohl von einer Kommandozeilen-GUI als auch via
richtiger GUI genutzt werden kann.
 

BlinderOpa

Mitglied
im Prinzip so, dass die GUI die "Main" Methode aufruft...
da ich momentan aber am lernen bin, hatte ich alles Modulartig zusammengebaut... also nach dem Motto:
main ruft grafik auf und bekommt X/Y zurück... dann ruft die Main das Spielfeld auf und frägt nach ob treffer oder nicht... usw usw... und im Prinzip wollte ich alles einfach ersetzbar machen... erst hatte ich alles über die Console laufen (lernstatus) und jetzt gehts eben an die GUI...

naja.. Danke für die Hilfe

thread closed...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Programm soll warten bis eine Passwort eingabe gemacht wurde. Allgemeine Java-Themen 6
O 2D-Grafik BioFarben-Programm soll auf Vollbild schalten Allgemeine Java-Themen 1
ARadauer programm soll sich selbst ändern können Allgemeine Java-Themen 20
U Programm soll sich nach update neustarten Allgemeine Java-Themen 30
E Java-Programm soll Java-Programm "fernsteuern" -wi Allgemeine Java-Themen 3
S Java Programm soll im Hintergrund laufen (vgl. fork() bei C) Allgemeine Java-Themen 10
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
T Der Aufruf von CMD-Programm Allgemeine Java-Themen 30
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
Mike80 Processing Programm fiert ohne Arduino ein Allgemeine Java-Themen 2
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
districon Programm zum Durchsuchen von (Ebay-)Artikeln Allgemeine Java-Themen 1
T Addons im eigenen Programm Allgemeine Java-Themen 1
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
D Programm designen Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
S Nachrichten Filter Programm Allgemeine Java-Themen 14
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
Lukas2904 Swing Anzeigen lassen das das Programm geschlossen wurde Allgemeine Java-Themen 3
TechnikTVcode Mail Programm Allgemeine Java-Themen 2
S Programm entwickeln, welches ein Dreieckspuzzle lösen kann Allgemeine Java-Themen 5
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
OSchriever Linux-Programm öffnen Allgemeine Java-Themen 6
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
L Eclipse Konsole im exportierten Programm Allgemeine Java-Themen 2
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
P Erstelltes Programm ist doppelt so groß Allgemeine Java-Themen 11
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
S Einfaches Programm programmieren Allgemeine Java-Themen 5
M kleines KI Programm Idee Allgemeine Java-Themen 7
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
N Programm startet nicht, nur per cmd Allgemeine Java-Themen 5
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
M Dieses Programm schneller machen? Allgemeine Java-Themen 2
R Programm zur Rekursion Allgemeine Java-Themen 5
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
dereki2000 Programm veröffentlichen Allgemeine Java-Themen 14
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
S Java Programm (Spiel mit den Boxen) Allgemeine Java-Themen 1
kodela Programm hängt in der Ereigniswarteschlange Allgemeine Java-Themen 13
A Java Programm verbessern/vereinfachen Allgemeine Java-Themen 20
P Programm darf nicht mehrfach startbar sein Allgemeine Java-Themen 16
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
JavaNewbie2.0 Programm nicht im Taskmanager schliesen können Allgemeine Java-Themen 15
J XML Datei mit installiertem Programm öffnen Allgemeine Java-Themen 7
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
JavaNewbie2.0 Programm bleibt "stehen" Allgemeine Java-Themen 2
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
E Mit Java ein Python Programm starten Allgemeine Java-Themen 20
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
Aruetiise Methoden .jar mit Programm öffnen Allgemeine Java-Themen 2
C anderes Programm schließen! Allgemeine Java-Themen 5
C Webseiten Programm problem Allgemeine Java-Themen 5
E Programm auf Installation prüfen Allgemeine Java-Themen 1
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
E Programm ohne Windowsrand(Vollbild) ? Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
P Schnittstelle java Programm zu Webserver / Browser Allgemeine Java-Themen 2
J Schutz Programm Jar Exe Allgemeine Java-Themen 7
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
B Programm updaten mit FXLauncher Allgemeine Java-Themen 1
D Nicht quelloffenes Programm Allgemeine Java-Themen 5
F Java-Programm lizensieren Allgemeine Java-Themen 21
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
X Aus Programm "Installationsprogramm" machen Allgemeine Java-Themen 6
T Java Programm in Internetseite? Allgemeine Java-Themen 4
T Java Programm frisst RAM Allgemeine Java-Themen 6
H Alter Java-Programm läuft nicht mehr. Laut strace fehlt libpthread.so.0 Allgemeine Java-Themen 3
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
Neumi5694 Offenes Programm nutzen Allgemeine Java-Themen 4
L Java-Programm Zahlenkombinationen ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben