Hallo ,
ich habe ein Pong Spiel programmiert mit dem Java Editor. Nachdem das Programm endlich funktioniert hat wollte ich es weiter mit Eclipse programmieren, nur hierbei stoße ich auf folgendes Problem:
Ich habe vor jeden Start einer Runde einen 3 Sekunden Countdown eingebaut (der auch im JavaEditor problemlos funktioniert), welcher nach ablauf der zeit eine boolean Variable auf true setzt. Das Problem ist nun, dass Eclipse den Countdown nicht genauso ausführt wie der JavaEditor bzw. keinen true zurückgibt.
Ganz ehrlich. Kern doch erstmal ein wenig die Grundlagen zum OOP. Was macht es denn für einen Sinn wenn du verschiedene Methoden schreibst, diese aber, genau wie alle Variablen static sind und damit eigentlich alles totaler Müll ist.
Ich habe es mal getestet und start ist true, sobald der Timer fertig ist. Der Rückgabewert von countdown ist aber false, denn wenn die countdown-Methode fertig ist, wurde der Timer ja gerade erst gestartet und ist längst noch nicht fertig, hat start also noch nicht auf true gesetzt. Das ist also kein Compiler-Fehler, sondern ein fehlerhaftes Programm-Design.
Den Java-Editor kenne ich nicht, aber wenn es wirklich dasselbe Programm ist, wird der Rückgabewert von countdown() da auch false sein. Vielleicht hat der Java-Editor eine Anzeigefunktion, die einfach den Variableninhalt anzeigt und der ändert sich nach Timer-Ende ja wirklich noch einmal auf true (auch unter Eclipse). Ersetze im Java-Editor doch mal die Zeile start = countdown();durch System.out.println(countdown());. Da wird bestimmt auch false auf der Konsole ausgegeben.
Du hast leider nur Fragmente gepostet, so dass man die Variablendeklarationen nicht sieht, aber es scheint so, dass start eine Klassenvariable ist. Die Kritik von @Thallius ist schon gerechtfertigt. Das ist kein guter Entwurf. Du solltest dich wirklich mit den OOP-Grundlagen beschäftigen.
Der Ansatz über den Rückgabewert ist nicht so gut. Du könntest es mit dem Observer-Pattern versuchen. Das könnte so aussehen, dass du eine Countdown-Klasse programmierst. Dein Spiel kann dann bei Bedarf ein Countdown-Objekt erzeugen und sich dem Countdown-Objekt selbst als Referenz übergeben, damit das Countdown-Objekt weiß, wen es nach Ablauf der Zeit benachrichtigen soll. Die Benachrichtigung kann dadurch erfolgen, dass das Countdown-Objekt eine entsprechende Methode des Spiels aufruft, die dann die gewünschte Reaktion des Spiels veranlasst.
Dein Spiel kann dann bei Bedarf ein Countdown-Objekt erzeugen und sich dem Countdown-Objekt selbst als Referenz übergeben, damit das Countdown-Objekt weiß, wen es nach Ablauf der Zeit benachrichtigen soll.
Hier ein kurzes Beispiel, wie die Objekte kommunizieren könnten. Klasse A könnte deine Spielsteuerung sein, und Klasse B deine Countdown-Klasse.
Java:
publicclassA{publicA(){System.out.println("Konstruktor von A startet");newB(this);// Hier übergibt sich das A-Objekt an das B-Objekt}publicvoidmachWas(String infoAusB){System.out.println("A-Objekt wurde gerufen");System.out.println(infoAusB);}publicstaticvoidmain(String[] args){newA();}}
Java:
publicclassB{privateA a;publicB(A a){System.out.println("Konstruktor von B startet");this.a = a;// Hier speichert das B-Objekt das übergebene A-Objekt und könnte es dadurch auch später verwendenSystem.out.println("B-Objekt ruft A-Objekt");
a.machWas("Info von B");}}