/* ---------------------------------------------------------------------------
                                   - Jade SDK -
                             (c) 2003 Alexis PAUTROT
                            Site Web  -  jadesdk.free.fr
                            Contact   -  jadesdk@free.fr
   --------------------------------------------------------------------------- */
package tutorial_04;

// importe package moteur
import jade.engine.*;

// importe package de chargement
import jade.loader.JadeLoader;
import jade.loader.JadeContainer;

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;


// classe de chargement et scène de jeu
public class MainScene extends JadeKeyListener implements JadeLoader, JadeScene
{
	// container d'affichage
	JadeContainer container;

	// moteur et surface d'affichage
	JadeDisplay display;

	// fond d'écran
	JadeBackground background;

	// fond d'écran le plus en arrière plan du composite
	JadeBackground compositeBack;
	JadeBackground compositeFront;

	// valeur de cycle des différents fonds d'écran
	int backgroundCycle;

	// nom du fond en cours d'affichage
	String backgroundName;

	// vitesse de scrolling en pixels
	int scrollX=2, scrollY=4;

	// images
	Image imgImage, imgMosaic, imgTilesABCD, imgTiles1234;

	// touche escape stoppe l'application
	public final void onKeyReleased(KeyEvent ke)
	{
		// sort si appui de la touche échappe
		if (ke.getKeyCode()==KeyEvent.VK_ESCAPE) container.exit();

		// cycle les fonds d'écran si appui de la touche espace
		if (ke.getKeyCode()==KeyEvent.VK_SPACE)
		{
			backgroundCycle++;
			backgroundCycle = backgroundCycle%5;

			switch ( backgroundCycle )
			{
				case 0:
					background=new JadeColoredBackground ( Color.white );
					backgroundName="JadeColoredBackground";
					break;

				case 1:
					background=new JadeImageBackground ( imgImage );
					backgroundName="JadeImageBackground";
					break;

				case 2:
					background=new JadeImageMosaicBackground ( imgMosaic );
					backgroundName="JadeImageMosaicBackground";
					break;

				case 3:
					Image[] tiles=JadeMediaLoader.parseImage ( imgTilesABCD, 2,2 );
					int[] map={3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,4,4,1,1,1,3,3,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,4,4,4,4,1,1,3,3,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,4,4,4,4,1,1,3,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2,2,2,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,2,2,2,1,1,1,1,4,4,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,2,2,2,2,2,1,1,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,2,2,2,3,3,2,2,1,3,3,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,2,2,3,3,1,1,1,3,3,1,1,1,1,3,3,1,1,1,1,2,2,2,2,2,1,1,1,3,3,1,1,1,3,3,1,1,1,1,3,3,1,1,1,1,1,2,2,2,2,1,1,1,3,3,1,1,1,3,3,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,4,4,1,3,3,1,1,1,3,3,1,1,1,1,3,3,3,3,3,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1,3,3,3,3};
					background=new JadeTileMapBackground ( tiles, map, 25 );
					backgroundName="JadeTileMapBackground";
					break;

				case 4:
					// en arrière plan profond
					compositeBack = new JadeImageMosaicBackground ( imgMosaic );

					// au centre, entre les deux
					Image[] tiles1234=JadeMediaLoader.parseImage ( imgTiles1234, 2,2 );
					int[] map1234={2,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,0,0,0,0,2,2,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,3,3,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,3,3,0,0,1,1,1,0,2,2,0,0,0,1,1,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,3,0,0,0,1,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,3,3,0,0,1,0,0,0,0,0,0,0,2,1,1,0,0,4,4,4,4,0,0,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,3,0,0,1,4,0,0,0,0,0,0,0,2,2,0,0,4,4,0,0,4,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,3,0,0,4,4,4,4,4,4,0,0,0,1,1,2,0,0,4,0,0,0,4,0,3,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,3,0,0,4,1,0,0,0,4,0,0,0,1,0,0,2,0,0,4,0,4,4,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,4,0,0,0,4,4,0,0,1,1,0,0,2,2,0,4,4,4,0,3,3,0,0,0,0,1,0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,4,0,0,1,1,0,0,0,0,2,0,0,0,0,3,3,0,0,0,0,0,1,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,4,4,0,4,4,0,0,1,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,1,1,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,2,2,3,2,2,2,2,4,4,4,2,0,0,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,0,0,0,1,0,0,4,4,4,4,4,0,0,0,0,0,0,0,2,2,2,0,3,0,0,0,1,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,2,3,3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,3,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,3,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,2,0,0,0,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,0,0,0,0,3,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,1,1,2,2,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,4,4,4,0,0,0,0,2,2,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,3,3,3,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,4,0,4,4,0,0,0,0,2,2,2,2,2,2,2,2,2,0,1,1,0,0,0,0,0,3,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,4,0,0,1,1,4,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,1,1,1,3,0,0,1,1,1,1,4,4,4,4,0,0,0,0,0,0,0,0,1,3,0,0,0,0,4,1,1,0,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,1,1,0,0,0,0,4,0,0,4,4,0,0,0,0,0,0,1,1,0,0,0,1,1,4,4,0,0,0,4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,4,0,0,0,4,4,0,0,0,0,0,1,0,0,0,1,0,0,0,4,4,0,0,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,4,4,0,0,4,4,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,4,4,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,4,4,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,4,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,4,3,3,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,4,3,0,0,0,4,4,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,3,3,4,4,2,2,2,0,4,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,0,2,4,4,0,0,0,4,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,3,3,3,3,0,1,0,2,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,3,3,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,3,3,3,0,0,0,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,3,3,2,2,2,2,2,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,2,2,2,2};
					JadeTileMapBackground tileMapBackground=new JadeTileMapBackground ( tiles1234, map1234, 50 );

					// en premier plan
					Image[] tilesABCD=JadeMediaLoader.parseImage ( imgTilesABCD, 2,2 );
					int[] mapABCD={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,1,1,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,1,1,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,4,4,0,0,0,1,1,1,0,0,0,2,2,2,2,2,2,0,0,0,0,2,2,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,2,0,0,0,2,2,2,2,0,2,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,1,1,0,0,2,2,2,0,0,0,0,0,0,0,3,3,0,0,0,3,3,0,0,0,0,1,1,0,0,0,2,2,2,2,0,0,0,0,0,3,3,0,0,0,3,3,0,0,0,0,1,1,1,1,0,0,2,2,2,2,2,0,0,0,3,3,0,0,0,3,3,0,0,0,0,1,1,1,1,0,0,0,2,2,2,2,0,0,0,3,3,0,0,0,3,3,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,3,3,0,0,0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
					compositeFront=new JadeTileMapBackground(tilesABCD,mapABCD,25);

					background=new JadeCompositeBackground
					(
						compositeBack,
						new JadeCompositeBackground ( tileMapBackground, compositeFront )
					);

					backgroundName="JadeCompositeBackground";
					break;
			}
		}
	}

	// méthode de chargement et de lancement de jeu
	public final void loadAndRun(JadeContainer container)
	{
		this.container=container;

		// créer moteur d'affichage
		display=new JadeDisplay(container);

		// créer interface de chargement
		JadeLoadingInterface jli=new JadeLoadingInterface(display);

		jli.setMessage("Loading..");
		jli.initializeProgress(100);

			// défini chemin de chargement
			JadeMediaLoader.setPath("tutorial_04/");

			// charge image pour fond
			imgImage = JadeMediaLoader.loadImage("image.gif");
			jli.setProgress(25);

			// charge image pour fond en mosaique
			imgMosaic = JadeMediaLoader.loadImage("mosaic.jpg");
			jli.setProgress(25);

			// charge et découpe image pour carte d'image
			imgTilesABCD = JadeMediaLoader.loadImage("tiles_ABCD.gif"); jli.setProgress(25);
			imgTiles1234 = JadeMediaLoader.loadImage("tiles_1234.gif"); jli.setProgress(25);

			// créer premier fond d'écran
			background=new JadeColoredBackground(Color.white);
			backgroundName="JadeColoredBackground";

		// accroche clavier
		display.setKeyListener(this);

		// lance la scène
		display.start(this);
	}

	// démarrage de la scène
	public final void begin()
	{
		// initialise moteur
		display.setAnimationRate(30);
	}

	// fin de la scène
	public final void end()
	{
	}

	// boucle d'animation
	public final void mainLoop()
	{
		// gestion touches clavier
		callKeyListener();

		// scrolling
		background.sx += scrollX;
		background.sy += scrollY;

		// inverse scrolling en bout de course
		if ( background.sx >= 0 ) { background.sx = 0; scrollX = -scrollX; }
		if ( background.sx < -400 ) { background.sx = -400; scrollX = -scrollX; }
		if ( background.sy >= 0 ) { background.sy = 0; scrollY = -scrollY; }
		if ( background.sy < -300 ) { background.sy = -300; scrollY = -scrollY; }

		// fait scroller le fond le plus en arrière plan du fond composite
		if ( compositeBack != null )
		{
			compositeBack.sx=background.sx;
			compositeBack.sy=background.sy;
		}

		// fait scroller en sens inverse le fond le plus en avant plan
		if ( compositeFront != null )
		{
			compositeFront.sx=-background.sx / 2;
			compositeFront.sy=-background.sy / 2;
		}

		draw();
	}

	// affichage
	public final void draw()
	{
		// efface surface d'affichage avec fond d'écran
		display.clearWithBackground(background);

		// affiche texte
		Graphics gc = display.getDoubleBufferedGraphics();
		gc.setColor(Color.black);
		gc.drawString("background position : "+(-background.sx)+","+(-background.sy),5,260);
		gc.drawString("background : "+backgroundName,5,275);
		gc.drawString("press space to cycle through backgrounds..",5,290);

		// affiche bandeau de texte
		gc.setColor(Color.black);
		gc.fillRect(0,0,400,15);
		gc.setColor(Color.white);
		gc.drawString("press escape to quit", 5,12 );
	}
}
