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

/* Plošinová hra demonstrující jak implementovat pohyb pozadí,
   cihličky a skákání spritu (nazývá se jakc), který umí
   běhat, skákat a narážet do cihliček.

   Od pravé strany panelu lítá ohnivá koule, která při kolizi
   z Jackem exploduje.

   Pozadí je složeno s několika pásů (obrázky navazující samy na sebe),
   které se pohybují různými rychlostmi, v závislosti na tom, jak jsou
   'hluboko' ve scéně. Tomuto efektu se říká paralaxní scrolling.

   -----
   Pozastavení, opetovné spuštení a ukoncení je rízeno pres naslouchací metody 
   hlavního okna.

   Panel JPanel se aktualizuje pomocí aktivního vykreslování. 
   Dalším příkladem s dodatečnými statistikami je aplikace WormP.
   Používáme casovac knihovny Java 3D: J3DTimer.getValue()
     * pro interval radeji používáme nanosekundy místo milisekund

   Pro hudbu, obrázky a animaci se používají třídy MidisLoader, 
   ClipsLoader, ImagesLoader a ImagesPlayer.

   Sprity jacka a ohnivé koule jsou odvozeny od třídy Sprite,
   které se věnuje kapitola 6.
*/


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


public class JumpingJack extends JFrame implements WindowListener
{
  private static int DEFAULT_FPS = 30;      // 40 je moc rychlé!

  private JackPanel jp;        // na tento panel se hra vykresluje
  private MidisLoader midisLoader;


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

    // načti podbarvující sekvenci MIDI
    midisLoader = new MidisLoader();
    midisLoader.load("jjf", "jumping_jack_flash.mid");
    midisLoader.play("jjf", true);   // opakovane prehrej sekvenci

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

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


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

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

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


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

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


  public void windowClosing(WindowEvent e)
  {  jp.stopGame();  
     midisLoader.close();  // ve skutecnosti není potreba
  }


  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 JumpingJack(period*1000000L);    // ms --> nanosecs 
  }

} // konec třídy: JumpingJack


