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

/* Uživatel může pohybovat pálkou a pokusit se odpálkovat míček.
   Každý zásah zvýší počítadlo 'odrazů'. Každé minutí jej sníží.

   Nový míček se posílá dolů z horního okraje v momentě, kdy 
   předchozí opustí obrazovku.

   Jakmile počet odražených míčků dosáhne předepsaného maxima
   nebo klesne na 0, hra končí a zobrazí se dosažený počet bodů.
  
   -----
   Pozastavení, opětovné spuštění a ukončení se ovládá pomocí
   metod okna určených k naslouchání událostem.

   Panel JPanel se aktualizuje pomocí aktivního vykreslování. 
   Dalším příkladem s dodatečnými statistikami je aplikace WormP.

   Používáme časovač knihovny Java 3D: J3DTimer.getValue()
     * pro interval raději používáme nanosekundy místo milisekund

   Pomocí tříd MidisLoader, ClipsLoadera ImagesLoader manipulujeme s hudbou a obrázky.

   Pálka i míček jsou podtřídami třídy Sprite.
*/


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


public class BugRunner extends JFrame implements WindowListener
{
  private static int DEFAULT_FPS = 40; 

  private BugPanel bp;        // na tento panel se hra vykresluje
  private MidisLoader midisLoader;


  public BugRunner(long period)
  { super("BugRunner");

    // načti podbarvující sekvenci MIDI
    midisLoader = new MidisLoader();
    midisLoader.load("br", "blade_runner.mid");
    midisLoader.play("br", true);   // opakovaně přehrej sekvenci

    Container c = getContentPane();    // použije implicitní BorderLayout
    bp = new BugPanel(this, period);
    c.add(bp, "Center");

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


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

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

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


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

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


  public void windowClosing(WindowEvent e)
  {  bp.stopGame();  
     midisLoader.close();  // ve skutečnosti není potřeba
  }


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

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

  public static void main(String args[])
  { 
    long period = (long) 1000.0/DEFAULT_FPS;
    // System.out.println("fps: " + DEFAULT_FPS + "; period: " + period + " ms");
    new BugRunner(period*1000000L);    // ms --> nanosecs 
  }

} // konec třídy: BugRunner


