
// WormChase.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Červík se pohybuje přes obrazovku a uživatel musí
   klepnout (stisknout) na jeho hlavu.

   Pokud ji uživatel mine, přidá se na obrazovku modrá
   kostička (pokud neklepnul na tělo červíka).

   Červík se přes tuto kostičku nemůže pohybovat, takže 
   přidaná překážka může usnadnit lov.

   Červík začíná na nulové délce a roste až do své
   maximální délky, která mu zůstane.

   Na konci se na obrazovce zobrazí dosažený počet bodů,
   vypočítáný z počtu kostiček a uplynulého času. Méně kostiček
   a kratší čas znamená vyšší skóre.

   -------------

   Obrazovka zahrnuje dvě textová pole pro zobrazení aktuálního času
   a počtu kostiček. Průměrné hodnoty FPS/UPS se vykreslují do herního
   panelu.   
   
   Pozastavení, opětovné spuštení a ukončení je řízeno přes naslouchací metody 
   hlavního okna.

   Pro aktualizaci panelu používá aktivní vykreslování.

   Používá časovač knihovny Java 3D: J3DTimer.getValue()
     *  nanosekundy místo millisekund

   průměrná hodnota FPS / UPS
		20	    50		80	    100
   Win 98:    20/20       48/50       81/83       96/100
   Win 2000:  20/20       43/50       59/83       58/100    // pomalý počítač
   Win XP:    20/20       50/50       83/83      100/100
*/


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class WormChase extends JFrame implements WindowListener
{
  private static int DEFAULT_FPS = 80;

  private WormPanel wp;        // zde je červík vykreslován
  private JTextField jtfBox;   // zobrazí počet dosud použitých krabiček
  private JTextField jtfTime;  // zobrazí čas dosud strávený ve hře


  public WormChase(long period)
  { super("The Worm Chase");
    makeGUI(period);

    addWindowListener( this );
    pack();
    setResizable(false);
    setVisible(true);
  }  // konec konstruktoru: WormChase()


  private void makeGUI(long period)
  {
    Container c = getContentPane();    // použije implicitní BorderLayout

    wp = new WormPanel(this, period);
    c.add(wp, "Center");

    JPanel ctrls = new JPanel();   // řádek s textovými poli
    ctrls.setLayout( new BoxLayout(ctrls, BoxLayout.X_AXIS));

    jtfBox = new JTextField("Použitých krabiček: 0");
    jtfBox.setEditable(false);
    ctrls.add(jtfBox);

    jtfTime = new JTextField("Celkový čas: 0 sekund");
    jtfTime.setEditable(false);
    ctrls.add(jtfTime);

    c.add(ctrls, "South");
  }  // konec metody: makeGUI()


  public void setBoxNumber(int no)
  {  jtfBox.setText("Použitých krabiček: " + no);  }

  public void setTimeSpent(long t)
  {  jtfTime.setText("Uplynulý čas: " + t + " sekund"); }
  

  // ----------------- metody implementující rozhraní WindowListener -------------

  public void windowActivated(WindowEvent e) 
  { wp.resumeGame();  }

  public void windowDeactivated(WindowEvent e) 
  {  wp.pauseGame();  }


  public void windowDeiconified(WindowEvent e) 
  {  wp.resumeGame();  }

  public void windowIconified(WindowEvent e) 
  {  wp.pauseGame(); }


  public void windowClosing(WindowEvent e)
  {  wp.stopGame();  }


  public void windowClosed(WindowEvent e) {}
  public void windowOpened(WindowEvent e) {}

  // ----------------------------------------------------

  public static void main(String args[])
  { 
    int fps = DEFAULT_FPS;
    if (args.length != 0)
      fps = Integer.parseInt(args[0]);

    long period = (long) 1000.0/fps;
    System.out.println("fps: " + fps + "; period: " + period + " ms");

    new WormChase(period*1000000L);    // ms --> nanosekundy
  }

} // konec třídy: WormChase


