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

/* Hra typu FPS bez střílení. Průchod bludištěm. 
   Znaky:
      * načítání bludiště s textového souboru s vygenerovaným plánem bludiště
            -- používá objekt typu MazeManager
      * otexturovaná podlaha, bloky a sloupy
      * pozatí tvoří koule s texturou
      * trocha osvětlení, pozorovatel vlastní reflektor
      * dopředu a dozadu směřující kamery
      * pohled z ptačí perspektivy
      * GUI knihovny Swing se třemi panely typu JPanel zobrazujícími několik pohledů
      * třída MazeManager vytváří 3D a 2D reprezentace bludiště
      * detekce kolizí se stěnami bludiště
      * ovládání pohybu pomocí klávesnice s aktualizací všech pohledů
*/

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


public class Maze3D extends JFrame
{
  public Maze3D(String args[]) 
  {
    super("3D Maze");

    String fnm = null;
    if (args.length == 1)
      fnm = args[0];
    else if (args.length == 0) 
      fnm = "maze.txt";  // default maze file
    else {
      System.out.println( "Použití: java Maze3D <fileName>");
      System.exit(0);
    }

    MazeManager mm = new MazeManager(fnm);
    BirdsEye be = new BirdsEye(mm);      // pohled na bludiště z ptačí perspektivy
    SecondViewPanel secondVP = new SecondViewPanel(mm);  
	// panel se zpětnou kamerou

    WrapMaze3D w3d = new WrapMaze3D(mm, be, secondVP.getCamera2TG() );

    /* Hlavní kamera je vlevo uprostřed. Na pravé straně je zpětná kamera nad
       pohledem z ptačí perspektivy (obě okna mají čtvrtinovou velikost oproti hlavnímu).
    */
    Container c = getContentPane();
    c.setLayout( new BoxLayout(c, BoxLayout.X_AXIS) );
    c.add(w3d);   // políčko s hlavní kamerou
    c.add( Box.createRigidArea( new Dimension(8,0)) ); // trocha místa

    Box vertBox = Box.createVerticalBox();
    vertBox.add( secondVP );   // políčko se zpětnou kamerou
    vertBox.add( Box.createRigidArea( new Dimension(0,8)) );  // místo
    vertBox.add(be);           // políčko s pohledem s ptačí perspektivy
    c.add(vertBox);

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    pack();
    setResizable(false);    // rozměry okna jsou pevně dány
    setVisible(true);
  } // konec metody: Maze3D()


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

  public static void main(String[] args) 
  {  new Maze3D(args); }

} // konec třídy: Maze3D

