
// WormChaseApplet.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.

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

   Webová stránka, WormChaseApplet.html, specifikuje 80 FPS:

        <applet code="WormChaseApplet.class" width="500" height="515">
           <param name="fps" value="80">
        </applet>

   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 pomocí metod 
   životního cyklu appletu: stop(), start(), destroy()

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

   průměrná hodnota FPS / UPS
 	             20	        50	    80	        100
   Win 98 (práce): 20/20       50/50       82/83       98/100
   Win 98 (doma):  20/20       50/50       81/83       96/100
   Win 2000:       20/20       46/50       63/83       61/100   // pomalý počítač
   Win XP:         20/20       50/50       83/83      100/100

*/

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


public class WormChaseApplet extends JApplet 
{
   private static final 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 void init()
   {
	 String str = getParameter("fps");
	 int fps = (str != null) ? Integer.parseInt(str) : DEFAULT_FPS;

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

     makeGUI(period);
     wp.startGame();
   } // konec metody: init()


  private void makeGUI(long period)
  {
    Container c = getContentPane();
    c.setLayout( new BorderLayout() );   

    wp = new WormPanel(this, period*1000000L);    // ms --> nanosekundy 
    c.add(wp, "Center");

    JPanel ctrls = new JPanel();   // uchovává řá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(int t)
  {  jtfTime.setText("Celkový čas: " + t + " sekund"); }


  // -------------------- metody životního cyklu appletu --------------

   public void start()
   {  wp.resumeGame();  }

   public void stop()
   {  wp.pauseGame();  }

   public void destroy()
   {  wp.stopGame();  }


} // konec třídy: WormChaseApplet

