Quadterm poznámky

JavaFX zápočtové úlohy

Rýchly prehľad toho, čo sa v týchto zadaniach typicky hodnotí: scéna, vstupné dáta, vlastný stav objektov, animácia, kreslenie, kolízie, kliky a korektné ukončenie simulácie.

1. Kostra JavaFX aplikácie

  • Trieda extends Application, v start(Stage stage) poskladáš scénu, nastavíš Scene a stage.show().
  • Dôležité polia sú rozmery, stav hry/simulácie, Canvas + GraphicsContext alebo Pane so Shape objektmi.
  • GUI vytváraj raz pri štarte, počas behu iba men stav a prekresľuj.

2. Vstup, stav a inicializácia

  • Pri súbore čítaj riadky cez BufferedReader alebo Scanner, každý riadok rozdeľ na program/inštrukcie.
  • Každý objekt simulácie má vlastné premenné: x, y, rýchlosť, uhol, farbu, veľkosť, životný stav.
  • Ak zadanie pýta viac objektov, použi List<T> a vytvor samostatnú inštanciu pre každý riadok alebo klik.

3. Kreslenie a vrstvy

  • Canvas je dobrý na trvalú stopu, mriežku alebo prekresľovanie celej scény cez gc.clearRect(...).
  • Pane + Circle/ImageView je dobrý, keď sa objekty hýbu a chceš meniť layoutX/layoutY/rotate.
  • Pri korytnačke sa často kombinuje Canvas pre čiaru a Pane nad ním pre ikonku korytnačky.

4. Animácia a čas

  • Timeline + KeyFrame použi na pravidelný krok, napr. každých 10 ms posuň objekty a prekresli.
  • AnimationTimer použi na plynulú simuláciu, kde sa ráta delta čas z parametra now.
  • Thread použi pri samostatných životných cykloch objektov; z neho men JavaFX prvky cez Platform.runLater(...).

5. Myš, klávesnica a ovládanie

  • setOnMouseMoved drží aktuálnu polohu myši alebo zobrazuje náhľad objektu.
  • setOnMouseClicked spúšťa objekt, vyberá najbližší objekt alebo pridáva nový objekt do simulácie.
  • setOnKeyPressed sa často používa na pauzu, pokračovanie, reset alebo zastavenie simulácie.

6. Ukončenie, výpis a body

  • Kontroluj odchod mimo plochy, koniec simulácie, zrážky a podmienky podľa zadania po každom kroku.
  • Pri skončení odstráň vizuálny objekt zo scény a vypíš poradové číslo, prejdenú stopu, čas alebo skóre.
  • Najviac bodov býva za správny stavový model, simuláciu viacerých objektov a presné správanie podľa zadania.

Canvas vs Pane

Canvas + GraphicsContext

Kedy použiť
trvalé čiary, stopa korytnačky, mriežka, prekreslenie celej scény
Typické API
gc.clearRect(...), gc.strokeLine(...), gc.fillOval(...), gc.drawImage(...)
Pozor na
Canvas si nepamätá jednotlivé objekty. Ak chceš zmeniť starú kresbu, musíš prekresliť celú scénu zo svojho stavu.

Pane + Shape/ImageView

Kedy použiť
pohybujúce sa objekty, klikateľné prvky, rotácia ikon, samostatné gule
Typické API
pane.getChildren().add(node), node.setLayoutX(...), node.setLayoutY(...), node.setRotate(...)
Pozor na
Pane drží konkrétne Node objekty. Je výborný na pohyb, ale pri veľa prvkoch treba udržať poriadok v zozname a odstraňovaní.

Kombinácia vrstiev

Kedy použiť
najčastejšie pri zápočtoch: stopa ostáva na Canvas, živý objekt je nad tým v Pane
Typické API
StackPane root = new StackPane(canvas, topLayer)
Pozor na
Model drž v premenných objektu. Canvas aj Pane sú iba zobrazenie toho istého stavu.

Najčastejšie typy zadaní

Korytnačky / LOGO štýl

Čítanie príkazov, relatívne argumenty so znamienkom, uhol v stupňoch, farba ako int RGB, stopa na Canvas a ikona v Pane.

  • FORWARD: x += stepsize * arg * cos(toRadians(angle)), y += stepsize * arg * sin(toRadians(angle)).
  • COLOR: Color.rgb(colorInt >> 16 & 0xff, colorInt >> 8 & 0xff, colorInt & 0xff).
  • Viac korytnačiek znamená viac nezávislých stavov; pri Thread riešení aktualizuj GUI cez Platform.runLater.
  • Klik vyberá najbližšiu živú korytnačku a prepína pause/resume cez wait/notify alebo boolean stav.

Padajúce gule / fyzika

Hodnota gule, radius podľa plochy, náhodná farba, gravitácia, odrazy od stien a zrážky medzi guľami.

  • Stav gule: x, y, r, vx, vy, hodnota, farba, Circle alebo vlastné kreslenie na Canvas.
  • Gravitácia: v každom kroku zvýš vy, potom x += vx, y += vy.
  • Stena: po náraze oprav polohu, otoč znamienko rýchlosti a prípadne ju zmenši.
  • Kolízia: vzdialenosť stredov <= r1 + r2; pri rovnakých hodnotách sa gule spájajú do vyššej hodnoty.

Hry a mriežky

GridPane s bunkami alebo jeden Canvas, ktorý prepočíta klik na riadok/stĺpec a prekreslí stav poľa.

  • Stav drž v poli int[][] alebo v samostatnej State triede, nie iba vo farbe tlačidla.
  • Klik: col = (int)(event.getX() / cellWidth), row = (int)(event.getY() / cellHeight).
  • Pri resize naviaž rozmery Canvasu na rodiča a pri zmene zavolaj paint().
  • Save/load serializuje stav hry, nie JavaFX Node, Image alebo GraphicsContext.

Základ scény

public class App extends Application {
  Canvas canvas = new Canvas(800, 800);
  GraphicsContext gc;
  Pane layer = new Pane();
  List<Objekt> objekty = new ArrayList<>();

  @Override
  public void start(Stage stage) {
    gc = canvas.getGraphicsContext2D();
    StackPane root = new StackPane(canvas, layer);
    Scene scene = new Scene(root, 800, 800);
    scene.setOnMouseClicked(e -> handleClick(e.getX(), e.getY()));
    stage.setScene(scene);
    stage.show();
    startSimulation();
  }
}

Timeline krok

Timeline timer = new Timeline(
    new KeyFrame(Duration.millis(16), e -> {
      updateState();
      paint();
    })
);
timer.setCycleCount(Timeline.INDEFINITE);
timer.play();

Thread + GUI

new Thread(() -> {
  while (!dead) {
    updateModel();
    Platform.runLater(() -> updateNodes());
    try {
      Thread.sleep(sleepTime);
    } catch (InterruptedException e) {
      return;
    }
  }
}).start();

Checklist pred odovzdaním