Mit JavaFX einfaches Game programmieren

wolfgang63

Bekanntes Mitglied
Hallo,
ich möchte ein kleines Spiel mit JavaFX programmieren.
Es sollen sich am oberen Fensterbereich in zufälligen abständen Bälle (Kreise) von rechts nach links bewegen,
die dann von unten abgeschossen werden.
Meine Frage: Wie packt man das vom Prinzip an?
Ist jeder Ball ein Objekt das erzeugt wird?
Kann ich den Ball mit einer Transition bewegen, oder ist es besser einen eigenen Thread zu starten?
Bei meinen ersten Versuchen mit Transition fällt auf, das die Objekte sich nicht gleichmäßig bewegen.
Es entstehen immer wieder kleine Ruckler bei der Animation.
Wär für ein paar Tips, oder ein ähnliches Tutorial dankbar.
 
1. Ja, jeder Ball sollte durch ein Objekt repräsentiert werden, wobei ich dir empfehle, einfach eine Reihe von Points in eine ArrayList zu packen!
2. Die Ruckler entstehen (mit einer Wahrscheinlichkeit von 99.999...%) dadurch, dass die Abstände zwischen zwei Frames nicht gleich sind, zur Lösung dieses Problems gibt es jedoch mehr als genug Methoden!
 
Welche Methoden sind das Beispielsweise unter JavaFX?
Die sind nicht speziell auf JavaFX bezogen,
z. B. kannst du mit System.currentTimeMillis():long die aktualle Systemzeit vor und nach einem jeden Durchgang abfragen und dann
entweder die, auf die gewünschte Verzögerung fehlende, Zeit mit Thread.sleep( long ):void auffüllen
oder die "Stärke" der Transition(en) mit diesem Wert (durch 100, bzw. 1000, damit die Werte nicht so groß sind) multiplizieren
 
Zuletzt bearbeitet:
Das ist gar nicht nötig, sich bei JavaFX mit Tranistionen etc. so zu verkopfen, wenn man ein Spiel programmieren will. Man kann auch einfach die AnimationTimer-Klasse verwenden, deren Animationfunktion im Idealfall 60 Mal pro Sekunde drankommt. In dieser Funktion kann man dann seine Logik ausprogrammieren.
Hier ein Kleines Beispiel
Java:
public class JavaFxTest extends Application
{
   // Exemplarvariablen.
   private final Text mTextFPS;
   private long mZeitJetzt;
   private long mZeitVorher = 0;
   private int    mFps          = 0;

  /**
  * @param args the command line arguments
  */
  public static void main(String[] args)
  {
     Application.launch(args);
  }

  @Override
  public void start(Stage bühne) throws Exception
  {
     mTextFPS = new Text(30, 30, "FPS: 0");
     mTextFPS.setFont(new Font(14));
     mTextFPS.setFill(Color.LIGHTGRAY);
     Group wurzel = new Group(mTextFPS);

     Scene szene = new Scene(wurzel, 786, , 512, Color.LIGHTBLUE);
     bühne.setScene(szene);
     bühne.setTitle("Titel");
     bühne.show();

     wurzel.requestFocus();

     // Animations-Zeitgeber initialisieren.
     animationsZeitgeber = new AnimationTimer()
     {
        @Override
        public void handle(long nanosekunden)
        {
        spielschleife();
        }
     };
     animationsZeitgeber.start();
  }

 
  private void spielschleife()
  {
     // Beispielsweise FPS anzeigen lassen.
     mZeitJetzt = System.nanoTime();
     if (mZeitJetzt >= mZeitVorher + 1_000_000_000) {
        mTextFPS.setText("FPS: " + mFps);
        mZeitVorher = mZeitJetzt;
        mFps = 0;
     }
     mFps++;
  }
 

Neue Themen


Zurück
Oben