# Mit JavaFX einfaches Game programmieren



## wolfgang63 (31. Jan 2015)

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.


----------



## Androbin (1. Feb 2015)

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!


----------



## wolfgang63 (3. Feb 2015)

Androbin hat gesagt.:


> 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?


----------



## dzim (6. Feb 2015)

Mir fiel gerade ein, dass es da mal ein Beispiel von Oracle gab:

Getting Started with JavaFX: Animation and Visual Effects in JavaFX | JavaFX 2 Tutorials and Documentation
Getting Started Sample | JavaFX 2 Tutorials and Documentation

Weitere Beispiele:
Creating Transitions and Timeline Animation in JavaFX: About This Document | JavaFX 2 Tutorials and Documentation
Creating Transitions and Timeline Animation in JavaFX: Tree Animation Example | JavaFX 2 Tutorials and Documentation


----------



## Androbin (7. Feb 2015)

wolfgang63 hat gesagt.:


> 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


----------



## Schmetterhand (14. Aug 2015)

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

```
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++;
  }
```


----------

