Methode wird nicht überprüft

Pianoman.20

Mitglied
Hallo zusammen,

Mein Problem ist folgendes:

Ich habe auf einem JLabel die paintComponent-Methode aufgerufen und ein paar Bilder gezeichnet. In der Klasse des JLabels habe ich dann 2 Methoden konstruiert. Bei der ersten Methode habe ich zwei Timer erstellt und bei der zweiten Methode eine If-Abrage. Die If-Abfrage sollte überprüfen, ob der zweite Timer am laufen ist. Nur tut es das nicht... kann mir da jemand weiterhelfen?

Hier der Code:
Java:
import javax.swing.*;
import java.awt.*;

public class Spielfeld extends JLabel{
   
    int yStickfigure;
    double y;
    Timer timer1;
    Timer timer2;

    public Spielfeld(){

        //Grenzen setzen
        this.setBounds(420,85,570,740);

        //Methoden aufrufen
        jumpAnimation();
        collision();
    }

    public void paintComponent(Graphics g){

        //Hier habe ich die Bilder gezeichnet

        repaint();
    }

    public void jumpAnimation(){

        yStickfigure = this.getHeight()-163;
        y = 25;

        timer1 = new Timer(20, e -> {
            if (y >= 1.2){
                yStickfigure -= (int) y;
                y /= 1.3;
            } else {
                timer1.stop();
                timer2.start();
            }
        });
        timer1.start();

        timer2 = new Timer(20, e -> {
            if (y <= 25){
                y *= 1.3;
                yStickfigure += (int) y;
            } else {
                timer2.stop();
                timer1.start();
            }
        });
    }

    public void collision(){

        if (timer2.isRunning()){
            System.out.println("Timer 2 is running");
        }
    }
}
 
Also erst einmal vom Ablauf her:
Du rufst ja im Konstruktor erst jumpAnimation und dann collision auf.

jumpAnimation erstellt timer1 und timer2 und timer1 wird gestartet.
Dann kommt direkt im Anschluss collision mit der Prüfung ob timer2 läuft und das tut er natürlich nicht, denn timer1 hatte ja noch gar keine Zeit, den timer2 zu starten.
 
Danke, ich habe nun Gedankenfehler erkannt.

Ich habe jetzt die Methode collision nicht im Konstruktor aufgerufen sondern in der Methode jumpAnimation. Und zwar gleich nach der Anweisung "timer2.start". Somit braucht es keine If-Abfrage und die Methode collsion wird jedes Mal wenn timer2 gestartet wird einmalig ausgeführt.
 
Evtl. solltest du dir überlegen, das Spiel etwas umzuändern.

Bei der Spielentwicklung ist es durchaus üblich, dass es eine Gameloop gibt. In dieser werden in einer Schleife erst die Veränderungen gemacht und dann die Darstellung angepasst.
So würde ich in der Gameloop auch ein BufferedImage zur Darstellung erstellen und dann dem UI Thread bereit stellen. Danach erfolgt dort der repaint Aufruf.

paintComponent stellt dann nur das bereitgestellte Bild da.

Damit du nicht ständig neue BufferedImages erstellen musst, hast du eine feste Anzahl, die immer wieder verwendet werden. So hast du spezielle „Positionen“
  • ein aktuell angezeigtes Bild
  • das Bild, das als nächstes angezeigt werden soll
  • ein Bild, das aktuell gemalt wird.
  • ein Bild, das als Nächstes gemalt werden soll.

Übergänge sind dann synchronisiert, damit immer nur ein Thread da etwas verändern kann.

Eine der Positionen ist immer null.
paintComponent prüft, ob es ein neues Bild gibt, dann ist die Position für das nächste zu malende Bild null. Und es kann dann einmal verschoben werden (bis auf aktuell zu malendes Bild)
Der Thread, der gerade ein Bild gemalt hat, will das als Nächstes zu malendes Bild bereit stellen. Wenn da ein Bild ist, dann wird das das als Nächstes zu malende Bild und dann erfolgt da ein Tausch …

Das kann man sich aufmalen und dann wird das schnell deutlich.

Das wäre so der Aufbau, den ich wählen würde….
 

Zurück
Oben