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

/* Hra AlientTiles je jednoduchou isometrickou hrou sestávající
   z jednoho hráče, který musí sebrat 3 předměty (pohár, květináč a 
   budík) aniž by jej 4 krvelační vetřelci zasáhli 3krát za sebou.

   Hráčem lze pohybovat pomocí numerických klívec: 7, 9, 3, 1, 5, a 2,
   což je také popsáno v obrazovce s nápovědou.

   Vetřelci jsou dvojího typu: jedni se aktivně ženou za hráčem 
   (objekty typu AlienAStarSprite) a druzí číhají kolem předmětů, ke
   kterým hráč právě míří (objekty typu AlienQuadSprite).

   Třída AlienAStarSprite používá k pronásledování hráče algoritmus
   hledání cesty známý pod názvem A*.

   Hrací plocha je tvořena isometrickou mapou obsahující nepřístupné dlaždice.
   Některé dlaždice obsahují překážky, přes něž sprity taktéž neprojdou.

   Když se sprite pohybuje za překážkou, je jí částečně překryt.

   Ve hře se vyskytují nejrůznější zvukové efekty a podbarvující hudba.

   Sprite hráče (objekt typu Player) se ve skutečnosti nepohybuje relativně
   vzhledem k hernímu panelu (JPanel). Místo toho se přemisťuje dalždicová síť,
   předměty, překážky a vetřelci.

   Síť dlaždic tvoří jediný obrázek typu GIF, není tedy složen s vícero obrázků 
   jednotlivých dlaždic.

   -----
   Pozastavení, opětovné spuštění a ukončení je řízeno přes naslouchací metody 
   hlavního okna.

   Panel JPanel aktualzujeme pomocí aktivního vykreslování. Další informace
   včetně statistik jsou k dispozici v aplikaci 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.

   Sprity hráče a vetřelců jsou odvozeny od třídy Sprite probírané v kapitole 6.
*/


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


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

  private AlienTilesPanel atp;        // na tento panel se hra vykresluje
  private MidisLoader midisLoader;


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

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

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

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


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

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

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


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

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


  public void windowClosing(WindowEvent e)
  {  atp.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 AlienTiles(period*1000000L);    // ms --> nanosekundy
  }

} // konec třídy: AlienTiles


