/* ---------------------------------------------------------------------------
                                   - Jade SDK -
                             (c) 2003 Alexis PAUTROT
                            Site Web  -  jadesdk.free.fr
                            Contact   -  jadesdk@free.fr
   --------------------------------------------------------------------------- */
package tutorial_01;

// importe package moteur
import jade.engine.*;

// importe package de chargement
import jade.loader.JadeLoader;
import jade.loader.JadeContainer;

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Color;
import java.awt.Graphics;


// classe de chargement et scène de jeu
public class MainScene implements JadeLoader, JadeScene, KeyListener
{
	// container d'affichage
	JadeContainer container;

	// moteur et surface d'affichage
	JadeDisplay display;

	// fond d'écran
	JadeImageBackground background;

	// layer de sprites
	JadeSpriteLayer spriteLayer;

	// famille petites boules de neige
	JadeFamily smallBallFamily;
	// famille boules de neige
	JadeFamily ballFamily;
	// famille grosses boules de neige
	JadeFamily bigBallFamily;

	// touche escape stoppe l'application
	public final void keyReleased(KeyEvent ke)
	{
		// sort si appui de la touche échappe
		if (ke.getKeyCode()==KeyEvent.VK_ESCAPE) container.exit();
	}
	public final void keyPressed(KeyEvent ke){}
	public final void keyTyped(KeyEvent ke) {}

	// 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);

		// charge fond d'écran
		jli.setMessage("Loading background..");
		jli.initializeProgress(100);
			JadeMediaLoader.setPath("tutorial_01/");
			background = new JadeImageBackground(JadeMediaLoader.loadImage("back.jpg"));
			jli.setProgress(100);

		// 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(50);	// 50 images par seconde

		// créer layer de sprites
		spriteLayer=new JadeSpriteLayer(display,background,null); // un fond d'écran en arrière plan
		spriteLayer.setDisplayMode(JadeSpriteLayer.ALL,JadeSpriteLayer.ALL); // efface toute la surface du layer et affiche tous les sprites

		// créer familles
		smallBallFamily = new JadeFamily(JadeMediaLoader.loadImage("small_ball.gif"),null);
		ballFamily = new JadeFamily(JadeMediaLoader.loadImage("ball.gif"),null);
		bigBallFamily = new JadeFamily(JadeMediaLoader.loadImage("big_ball.gif"),null);

		// ajoute familles au layer
		spriteLayer.families.addElement ( ballFamily );
		spriteLayer.families.addElement ( smallBallFamily );
		spriteLayer.families.addElement ( bigBallFamily );

		// ajoute boules à des positions aléatoires
		for (int i =0; i<100; i++) smallBallFamily.addElement(new JadeSprite(JadeMath.urand(400),JadeMath.urand(300),smallBallFamily));
		for (int i =0; i<60; i++) ballFamily.addElement(new JadeSprite(JadeMath.urand(400),JadeMath.urand(300),ballFamily));
		for (int i =0; i<30; i++) bigBallFamily.addElement(new JadeSprite(JadeMath.urand(400),JadeMath.urand(300),bigBallFamily));
	}

	// fin de la scène
	public final void end() {}

	// boucle d'animation
	public final void mainLoop()
	{
		JadeSprite enumerated;
		JadeSpriteEnumerator enumerator = new JadeSpriteEnumerator();

		// énumère les petites boules
		enumerator.enumerate(smallBallFamily);
		while ((enumerated=enumerator.getNext())!=null)
		{
			// déplace vers le bas de 1 pixel et aléatoirement de 0 à 2 pixel horizontalement
			enumerated.moveOf(JadeMath.urand(3),1);

			// replace si hors écran ( 8x8 sont les dimensions du sprite, l'écran fait 400x300 )
			if (enumerated.y>300) enumerated.y = -8;
			if (enumerated.x>400) enumerated.x = -8;
		}

		enumerator.enumerate(ballFamily);
		while ((enumerated=enumerator.getNext())!=null)
		{
			enumerated.moveOf(JadeMath.urand(2),2);
			if (enumerated.y>300) enumerated.y = -12;
			if (enumerated.x>400) enumerated.x = -12;
		}

		enumerator.enumerate(bigBallFamily);
		while ((enumerated=enumerator.getNext())!=null)
		{
			enumerated.moveOf(0,3);
			if (enumerated.y>300) enumerated.y = -16;
			if (enumerated.x>400) enumerated.x = -16;
		}

		draw();
	}

	public final void draw()
	{

		// affiche le layer de sprite avec son fond d'écran
		spriteLayer.animateAndDraw();

		// affiche bandeau de texte
		Graphics gc = display.getDoubleBufferedGraphics();
		gc.setColor(Color.black);
		gc.fillRect(0,0,400,15);
		gc.setColor(Color.white);
		gc.drawString("press escape to quit", 5,12 );
	}
}
