package MyGame;

import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;

/**
 * Implementa el juego.
 * @author IntelligentSoft
 */
public class clsCanvas extends GameCanvas implements Runnable {

// key repeat rate en milisegundos
public static final int keyDelay = 250;    


public static final int fireKey = 4;

//estados de las teclas para up, left, down, right, y tecla disparo
private boolean[] isDown = {
    false, false, false, false, false
};

//última vez que la tecla cambió de estado
private long[] keyTick = {
    0, 0, 0, 0, 0
};

//buscar en la tabla para constantes de teclas
private int[] keyValue = {
    GameCanvas.UP_PRESSED, GameCanvas.LEFT_PRESSED,
    GameCanvas.DOWN_PRESSED, GameCanvas.RIGHT_PRESSED, 
    GameCanvas.FIRE_PRESSED
};

private boolean isRunning = true;    
private Graphics g;
private midMain fParent;

// Secuencia hacia frente
int[] sequence1 = {0,1,2,3,4,5,6,7};
// Secuencia a derecha
int[] sequence2 = {8,9,10,11,12,13,14,15};
// Secuencia hacia arriba
int[] sequence3 = {16,17,18,19,20,21,22,23};
// Secuancia a izquierda
int[] sequence4 = {24,25,26,27,28,29,30,31};

int up=0;
int down=0;
int left=0;
int right=0;

int cont = 0;

private Image imgLolo;
private Sprite Heroe;
private Sprite Enem1;
private Sprite Enem2;
private Sprite Enem3;
private Sprite Enem4;
private Sprite Enem5;
private Sprite Enem6;
private Sprite Enem7;
private Sprite Enem8;
private Sprite Enem9;
private Sprite Enem10;
private Sprite Enem11;
private Sprite Enem12;
private Sprite Enem13;
private Sprite Enem14;
private Sprite Enem15;
private Sprite Enem16;
private Sprite Enem17;
private Sprite Enem18;
private Sprite Enem19;
private Sprite Enem20;
private Sprite Enem21;
private Sprite Enem22;
private Sprite Enem23;

private int vanSpeed = 2;
private int enem1Speed = 1;
private int enem2Speed = 1;
private int enem3Speed = 3;
private int enem4Speed = 3;
private int enem5Speed = 5;
private int enem6Speed = 5;
private int enem7Speed = 2;
private int enem8Speed = 2;
private int enem9Speed = 2;
private int enem10Speed = 2;
private int enem11Speed = 2;
private int enem12Speed = 2;
private int enem13Speed = 2;
private int enem14Speed = 2;
private int enem15Speed = 2;
private int enem16Speed = 2;
private int enem17Speed = 1;
private int enem18Speed = 1;
private int enem19Speed = 1;
private int enem20Speed = 1;
private int enem21Speed = 5;
private int enem22Speed = 2;
private int enem23Speed = 2;



private Image imgTileset;
private Image imgTileset1;
private Image imgTileset2;
private Image imgTilesetE;
private TiledLayer roadMap;
private TiledLayer blockMap;
private TiledLayer blockMap1;
private TiledLayer blockMap2;

    /**
     * Constructor
     * @param m clase principal que crea el midlet
     */
    public clsCanvas(midMain m) {
        super(true);
        fParent = m;
        setFullScreenMode(true);
    }
    
    /**
     * Inicia el thread o hilo
     */
    public void start(){
        Thread runner = new Thread(this);
        runner.start();
    }
    
    /**
    * Carga el los gráficos del nivel (piso)
    */
    public void loadRoadMap(){
        //inicializar roadMap
        roadMap = new TiledLayer(15, 20, imgTileset, 16, 16);
        
        // Crear nuevo Random para numeros al azar
        Random Rand = new Random();
        
        //recorre todas las celdas del mapa
        for (int y = 0; y < 20; y++){
            for (int x = 0; x < 15; x++){
                //obtener un número aleatorio entre 2 y 5
                int index = (Math.abs(Rand.nextInt()>>>1) % (3)) + 2;
                
                //asigna el índice de tile para la celda actual
                roadMap.setCell(x, y, index);
            }          
        }
        
        roadMap.setCell(13, 18, 1);
        
        Rand = null;
    }
    /**
     * Carga el mapa del nivel
     * @param nivel nivel a cargar 
     */
    public void loadBlockMap(int nivel){
        // define el número de tile a ser usado en cada celda del mapa
        byte[][] blockData1 = {
            {10, 8 , 7 , 6 , 10, 9 , 8 , 7 , 6 , 10, 9 , 9 , 9 , 9 , 9 },  
            {6 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 },  
            {7 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },  
            {8 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 },  
            {9 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10},  
            {10, 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 9 },  
            {6 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 8 },  
            {7 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },  
            {8 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 6 },  
            {9 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 10},  
            {10, 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 9 },  
            {6 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 8 },  
            {7 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 7 },
            {7 , 8 , 9 , 10, 6 , 7 , 8 , 9 , 10, 6 , 9 , 9 , 7 , 7 , 10}
            
        };
        
        byte[][] blockData2 = {
            {10, 8 , 7 , 6 , 10, 9 , 8 , 7 , 6 , 10, 9 , 9 , 9 , 9 , 9 },  
            {6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 },  
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },  
            {8 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 },  
            {9 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10},  
            {10, 0 , 0 , 0 , 8 , 8 , 8 , 9 , 8 , 8 , 8 , 8 , 8 , 8 , 9 },  
            {6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 },  
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },  
            {8 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 },  
            {9 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10},  
            {6 , 7 , 7 , 7 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 9 , 0 , 0 , 8 },  
            {8 , 0 , 0 , 0 , 0 , 6 , 0 , 0 , 6 , 0 , 0 , 6 , 0 , 0 , 6 }, 
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 7 },
            {7 , 0 , 0 , 0 , 6 , 6 , 0 , 0 , 9 , 9 , 9 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 6 , 6 , 0 , 0 , 9 , 9 , 9 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 8 , 9 , 10, 6 , 7 , 8 , 9 , 10, 6 , 9 , 9 , 7 , 7 , 10}
            
        };
        
        byte[][] blockData3 = {
            {10, 8 , 7 , 6 , 10, 9 , 8 , 7 , 6 , 10, 9 , 9 , 9 , 9 , 9 },  
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 6 , 6 , 0 , 7 , 0 , 8 , 0 , 0 , 8 , 0 , 0 , 7 },
            {7 , 0 , 0 , 6 , 0 , 0 , 7 , 0 , 8 , 8 , 0 , 8 , 0 , 0 , 7 },
            {7 , 0 , 0 , 6 , 6 , 0 , 7 , 0 , 8 , 0 , 8 , 8 , 0 , 0 , 7 },
            {7 , 0 , 0 , 6 , 0 , 0 , 7 , 0 , 8 , 0 , 0 , 8 , 0 , 0 , 7 },
            {7 , 0 , 0 , 6 , 0 , 0 , 7 , 0 , 8 , 0 , 0 , 8 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 9 , 9 , 0 , 0 , 0 , 6 , 0 , 6 , 0 , 0 , 0 , 7 }, 
            {7 , 0 , 0 , 9 , 0 , 9 , 0 , 0 , 6 , 6 , 6 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 9 , 0 , 9 , 10, 10, 6 , 0 , 6 , 8 , 8 , 8 , 7 },
            {7 , 0 , 0 , 9 , 0 , 9 , 10, 0 , 6 , 0 , 6 , 8 , 0 , 8 , 7 },
            {7 , 0 , 0 , 9 , 9 , 0 , 10, 10, 6 , 0 , 6 , 8 , 0 , 8 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 10, 0 , 0 , 0 , 0 , 8 , 0 , 8 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 10, 10, 0 , 0 , 0 , 8 , 8 , 8 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 , 6 , 7 },
            {7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 , 0 , 7 },
            {7 , 8 , 9 , 10, 6 , 7 , 8 , 9 , 10, 6 , 9 , 9 , 7 , 7 , 10}
            
        };
        
        //initialize blockMap, aquí se define el tamano de blockmap
        //dos primeros numeros definen el tamano x,y
        blockMap = new TiledLayer(15, 20, imgTileset, 16, 16);
        blockMap1 = new TiledLayer(15, 20, imgTileset1, 16, 16);
        blockMap2 = new TiledLayer(15, 20, imgTileset2, 16, 16);
        
        //recorre todas las celdas del mapa
        for (int y = 0; y < 20; y++){
            for (int x = 0; x < 15; x++){
                // asignar el índice de tile a ser usada en la celda actual
                // notar indices invertidos para acceder a blockdata (fila,col)
                if (nivel == 1)
                   blockMap.setCell(x, y, blockData1[y][x]);  
                else if (nivel == 2)
                   blockMap1.setCell(x, y, blockData2[y][x]);
                else if (nivel == 3)
                    blockMap2.setCell(x, y, blockData3[y][x]);
                

            }
        }
        
        blockData1 = null;
        blockData2 = null;
        blockData3 = null;
    }
    /**
     * Codigo de inicializacion del juego
     * Carga las imagenes que conformaran los personajes y el mapa
     * @param nivel el nivel que se desea cargar
     */
    public void load(int nivel){
        try{
            // aqui se cargan las imagenes
            imgLolo = Image.createImage("/images/jugador.png");
            
            imgTileset = Image.createImage("/images/tileset1_1.png");
            imgTileset1 = Image.createImage("/images/tileset2.png");
            imgTileset2 = Image.createImage("/images/tileset3.png");
            imgTilesetE = Image.createImage("/images/malos2.png");
        }catch(Exception ex){
            // salir de la aplicacion si ni se logra cargar una imagen
            isRunning = false;
            return;
        }
        
        // inicialiar el objeto sprite
        // Sprite(objeto que contiene frames, ancho, alto)
        Heroe = new Sprite(imgLolo, 18, 18);
        /***************ENEMIGOS*********************/
        
            Enem1 = new Sprite(imgTilesetE, 16, 16);
            Enem1.setFrame(5);
            Enem1.setPosition(32, 80);
            Enem2 = new Sprite(imgTilesetE, 16, 16);
            Enem2.setFrame(6);
            Enem2.setPosition(32, 160);
            Enem3 = new Sprite(imgTilesetE, 16, 16);
            Enem3.setFrame(7);
            Enem3.setPosition(80, 160);
            Enem4 = new Sprite(imgTilesetE, 16, 16);
            Enem4.setFrame(8);
            Enem4.setPosition(96, 160);
            Enem5 = new Sprite(imgTilesetE, 16, 16);
            Enem5.setFrame(9);
            Enem5.setPosition(112, 160);
            Enem6 = new Sprite(imgTilesetE, 16, 16);
            Enem6.setFrame(5);
            Enem6.setPosition(128, 160);
            Enem7 = new Sprite(imgTilesetE, 16, 16);
            Enem7.setFrame(6);
            Enem7.setPosition(192, 96);
            Enem8 = new Sprite(imgTilesetE, 16, 16);
            Enem8.setFrame(7);
            Enem8.setPosition(192, 112);
            Enem9 = new Sprite(imgTilesetE, 16, 16);
            Enem9.setFrame(8);
            Enem9.setPosition(192, 128);
            Enem10 = new Sprite(imgTilesetE, 16, 16);
            Enem10.setFrame(9);
            Enem10.setPosition(160, 176);
            Enem11 = new Sprite(imgTilesetE, 16, 16);
            Enem11.setFrame(5);
            Enem11.setPosition(160, 192);
            Enem12 = new Sprite(imgTilesetE, 16, 16);
            Enem12.setFrame(6);
            Enem12.setPosition(160, 208);
            Enem13 = new Sprite(imgTilesetE, 16, 16);
            Enem13.setFrame(7);
            Enem13.setPosition(64, 48);
            Enem14 = new Sprite(imgTilesetE, 16, 16);
            Enem14.setFrame(8);
            Enem14.setPosition(112, 32);
            Enem15 = new Sprite(imgTilesetE, 16, 16);
            Enem15.setFrame(9);
            Enem15.setPosition(160, 48);
            Enem16 = new Sprite(imgTilesetE, 16, 16);
            Enem16.setFrame(5);
            Enem16.setPosition(128, 112);
            Enem17 = new Sprite(imgTilesetE, 16, 16);
            Enem17.setFrame(6);
            Enem17.setPosition(144, 112);
            Enem18 = new Sprite(imgTilesetE, 16, 16);
            Enem18.setFrame(7);
            Enem18.setPosition(128, 144);
            Enem19 = new Sprite(imgTilesetE, 16, 16);
            Enem19.setFrame(8);
            Enem19.setPosition(144, 144);
            Enem20 = new Sprite(imgTilesetE, 16, 16);
            Enem20.setFrame(9);
            Enem20.setPosition(80, 128);
            Enem21 = new Sprite(imgTilesetE, 16, 16);
            Enem21.setFrame(5);
            Enem21.setPosition(160, 208);
            Enem22 = new Sprite(imgTilesetE, 16, 16);
            Enem22.setFrame(6);
            Enem22.setPosition(112, 272);
            Enem23 = new Sprite(imgTilesetE, 16, 16);
            Enem23.setFrame(7);
            Enem23.setPosition(112, 288);
        
        /**********************************************/
        
        // los frames se cuentan de izquierda a derecha 
        // en la imagen origen
        Heroe.setFrame(0);
               
        // move to 16, 16 (X, Y)
        Heroe.setPosition(16, 16);
        
        loadRoadMap();
        loadBlockMap(nivel);
        
    }
    
    /**
     * Asegura la destruccion de los objeto
     */
    public void unload(){
        blockMap = null;
        blockMap1 = null;
        blockMap2 = null;
        roadMap = null;
        Heroe = null;
        /********************ENEMIGOS********/
        Enem1 = null;
        Enem2 = null;
        Enem3 = null;
        Enem4 = null;
        Enem5 = null;
        Enem6 = null;
        Enem7 = null;
        Enem8 = null;
        Enem9 = null;
        Enem10 = null;
        Enem11 = null;
        Enem12 = null;
        Enem13 = null;
        
        Enem14 = null;
        Enem15 = null;
        Enem16 = null;
        Enem17 = null;
        Enem18 = null;
        Enem19 = null;
        Enem20 = null;
        Enem21 = null;
        Enem22 = null;
        Enem23 = null;
        /************************************/
        imgTileset = null;
        imgLolo = null;
    }
 /**
 * Comprueba qué teclas estan presionadas
 * @param iKey estado de teclas
 * @param currTick timepo actual 
 */
    public void checkKeys(int iKey, long currTick){
        long elapsedTick = 0;
        //recorrer las teclas
        for (int i = 0; i < 5; i++){ 
            //por defecto, tecla no apretada por usuario
            isDown[i] = false;
            //está el usuiario presionando la tecla?
            if ((iKey & keyValue[i]) != 0){ 
                elapsedTick = currTick - keyTick[i];
                //es tiempo de cambiar el estado de la tecla?
                if (elapsedTick >= keyDelay){ 
                   //guardar el tiempo actual
                    keyTick[i] = currTick;  
                    //toggle estado a presionada
                    isDown[i] = true; 
                }
            }
        }
    }
    
    
      
    /**
     * Contiene el loop principal y la mayoria del código del juego
     */
    public void run() {
       int iKey = 0;
       int screenW = getWidth();
       int screenH = getHeight();
       long lCurrTick = 0; // tiempo actual del sistema en milisegundos
       /***********ENEMIGOS************/
       int en1left = 1;
       int en2left = 0;
       int en3up = 1;
       int en4up = 1;
       int en5up = 0;
       int en6up = 0;
       int en7left = 1;
       int en8left = 1;
       int en9left = 1;
       int en10left = 0;
       int en11left = 0;
       int en12left = 0;
       int en13up = 1;
       int en14up = 0;
       int en15up = 1;
       int en16up = 0;
       int en17up = 0;
       int en18up = 1;
       int en19up = 1;
       int en20up = 0;
       int en21left = 1;
       int en22left = 0;
       int en23left = 1;
       /*******************************/
       int nivelActual = 1;
       load(nivelActual);
       g = getGraphics();
       
       while(isRunning){
           
           lCurrTick = System.currentTimeMillis();
           iKey = getKeyStates();
           
           checkKeys(iKey, lCurrTick);
           
           //Si la tecla de disparo o tecla 5 es presionada
           //se termina el loop y la aplicacion
           if (isDown[fireKey]){
               isRunning = false;    
           }
           
           // obtener la posicion actual del heroe
           int cx = Heroe.getX();
           int cy = Heroe.getY();
           
           /****************ENEMIGOS****************/
           
           
           // obtener posición enemigo 1
           int e1x = Enem1.getX();int e1y = Enem1.getY();
           // movimiento de enemigo 1 izquierda o derecha
           if(en1left == 1)       e1x -= enem1Speed;    
           else if(en1left == 0)  e1x += enem1Speed;
           //Posicion actual enemigo 1
           int e1tx = e1x;int e1ty = e1y;
           // obtener posición enemigo 2
           int e2x = Enem2.getX();int e2y = Enem2.getY();
           // movimiento de enemigo 2 izquierda o derecha
           if(en2left == 1)       e2x -= enem2Speed;    
           else if(en2left == 0)  e2x += enem2Speed;
           //Posicion actual enemigo 2
           int e2tx = e2x;int e2ty = e2y;
           // obtener posición enemigo 3
           int e3x = Enem3.getX();int e3y = Enem3.getY();
           // movimiento de enemigo 3 izquierda o derecha
           if(en3up == 0)       e3y -= enem3Speed;    
           else if(en3up == 1)  e3y += enem3Speed;
           //Posicion actual enemigo 3
           int e3tx = e3x;int e3ty = e3y;
           // obtener posición enemigo 4
           int e4x = Enem4.getX();int e4y = Enem4.getY();
           // movimiento de enemigo 4 izquierda o derecha
           if(en4up == 0)       e4y -= enem4Speed;    
           else if(en4up == 1)  e4y += enem4Speed;
           //Posicion actual enemigo 4
           int e4tx = e4x;int e4ty = e4y;
           
           // obtener posición enemigo 5
           int e5x = Enem5.getX();int e5y = Enem5.getY();
           // movimiento de enemigo 3 izquierda o derecha
           if(en5up == 0)       e5y -= enem5Speed;    
           else if(en5up == 1)  e5y += enem5Speed;
           //Posicion actual enemigo 5
           int e5tx = e5x;int e5ty = e5y;
           
           // obtener posición enemigo 6
           int e6x = Enem6.getX();int e6y = Enem6.getY();
           // movimiento de enemigo 6 izquierda o derecha
           if(en6up == 0)       e6y -= enem6Speed;    
           else if(en6up == 1)  e6y += enem6Speed;
           //Posicion actual enemigo 6
           int e6tx = e6x;int e6ty = e6y;
           
           // obtener posición enemigo 7
           int e7x = Enem7.getX();int e7y = Enem7.getY();
           // movimiento de enemigo 7 izquierda o derecha
           if(en7left == 1)       e7x -= enem7Speed;    
           else if(en7left == 0)  e7x += enem7Speed;
           //Posicion actual enemigo 7
           int e7tx = e7x;int e7ty = e7y;
           
           // obtener posición enemigo 8
           int e8x = Enem8.getX();int e8y = Enem8.getY();
           // movimiento de enemigo 8 izquierda o derecha
           if(en8left == 1)       e8x -= enem7Speed;    
           else if(en8left == 0)  e8x += enem7Speed;
           //Posicion actual enemigo 8
           int e8tx = e8x;int e8ty = e8y;
           
           // obtener posición enemigo 9
           int e9x = Enem9.getX();int e9y = Enem9.getY();
           // movimiento de enemigo 9 izquierda o derecha
           if(en9left == 1)       e9x -= enem9Speed;    
           else if(en9left == 0)  e9x += enem9Speed;
           //Posicion actual enemigo 9
           int e9tx = e9x;int e9ty = e9y;
           
           // obtener posición enemigo 10
           int e10x = Enem10.getX();int e10y = Enem10.getY();
           // movimiento de enemigo 10 izquierda o derecha
           if(en10left == 1)       e10x -= enem10Speed;    
           else if(en10left == 0)  e10x += enem10Speed;
           //Posicion actual enemigo 10
           int e10tx = e10x;int e10ty = e10y;
           
           // obtener posición enemigo 11
           int e11x = Enem11.getX();int e11y = Enem11.getY();
           // movimiento de enemigo 11 izquierda o derecha
           if(en11left == 1)       e11x -= enem11Speed;    
           else if(en11left == 0)  e11x += enem11Speed;
           //Posicion actual enemigo 11
           int e11tx = e11x;int e11ty = e11y;
           
           // obtener posición enemigo 12
           int e12x = Enem12.getX();int e12y = Enem12.getY();
           // movimiento de enemigo 12 izquierda o derecha
           if(en12left == 1)       e12x -= enem12Speed;    
           else if(en12left == 0)  e12x += enem12Speed;
           //Posicion actual enemigo 12
           int e12tx = e12x;int e12ty = e12y;
           
               
           
           // obtener posición enemigo 13
           int e13x = Enem13.getX();int e13y = Enem13.getY();
           // movimiento de enemigo 13 izquierda o derecha
           if(en13up == 0)       e13y -= enem13Speed;    
           else if(en13up == 1)  e13y += enem13Speed;
           //Posicion actual enemigo 13
           int e13tx = e13x;int e13ty = e13y;
           
           // obtener posición enemigo 14
           int e14x = Enem14.getX();int e14y = Enem14.getY();
           // movimiento de enemigo 14 izquierda o derecha
           if(en14up == 0)       e14y -= enem14Speed;    
           else if(en14up == 1)  e14y += enem14Speed;
           //Posicion actual enemigo 14
           int e14tx = e14x;int e14ty = e14y;
           
           // obtener posición enemigo 15
           int e15x = Enem15.getX();int e15y = Enem15.getY();
           // movimiento de enemigo 15 izquierda o derecha
           if(en15up == 0)       e15y -= enem15Speed;    
           else if(en15up == 1)  e15y += enem15Speed;
           //Posicion actual enemigo 15
           int e15tx = e15x;int e15ty = e15y;
           
           // obtener posición enemigo 16
           int e16x = Enem16.getX();int e16y = Enem16.getY();
           // movimiento de enemigo 16 izquierda o derecha
           if(en16up == 0)       e16y -= enem16Speed;    
           else if(en16up == 1)  e16y += enem16Speed;
           //Posicion actual enemigo 16
           int e16tx = e16x;int e16ty = e16y;
           
           // obtener posición enemigo 17
           int e17x = Enem17.getX();int e17y = Enem17.getY();
           // movimiento de enemigo 17 izquierda o derecha
           if(en17up == 0)       e17y -= enem17Speed;    
           else if(en17up == 1)  e17y += enem17Speed;
           //Posicion actual enemigo 17
           int e17tx = e17x;int e17ty = e17y;
           
           // obtener posición enemigo 18
           int e18x = Enem18.getX();int e18y = Enem18.getY();
           // movimiento de enemigo 18 izquierda o derecha
           if(en18up == 0)       e18y -= enem18Speed;    
           else if(en18up == 1)  e18y += enem18Speed;
           //Posicion actual enemigo 18
           int e18tx = e18x;int e18ty = e18y;
           
           // obtener posición enemigo 19
           int e19x = Enem19.getX();int e19y = Enem19.getY();
           // movimiento de enemigo 19 izquierda o derecha
           if(en19up == 0)       e19y -= enem19Speed;    
           else if(en19up == 1)  e19y += enem19Speed;
           //Posicion actual enemigo 19
           int e19tx = e19x;int e19ty = e19y;
           
           
           // obtener posición enemigo 20
           int e20x = Enem20.getX();int e20y = Enem20.getY();
           // movimiento de enemigo 20 izquierda o derecha
           if(en20up == 0)       e20y -= enem20Speed;    
           else if(en20up == 1)  e20y += enem20Speed;
           //Posicion actual enemigo 20
           int e20tx = e20x;int e20ty = e20y;
//           
           // obtener posición enemigo 21
           int e21x = Enem21.getX();int e21y = Enem21.getY();
           // movimiento de enemigo 21 izquierda o derecha
           if(en21left == 1)       e21x -= enem21Speed;    
           else if(en21left == 0)  e21x += enem21Speed;
           //Posicion actual enemigo 21
           int e21tx = e21x;int e21ty = e21y;
           
           // obtener posición enemigo 22
           int e22x = Enem22.getX();int e22y = Enem22.getY();
           // movimiento de enemigo 22 izquierda o derecha
           if(en22left == 1)       e22x -= enem22Speed;    
           else if(en22left == 0)  e22x += enem22Speed;
           //Posicion actual enemigo 22
           int e22tx = e22x;int e22ty = e22y;
           
           // obtener posición enemigo 23
           int e23x = Enem23.getX();int e23y = Enem23.getY();
           // movimiento de enemigo 23 izquierda o derecha
           if(en23left == 1)       e23x -= enem23Speed;    
           else if(en23left == 0)  e23x += enem23Speed;
           //Posicion actual enemigo 23
           int e23tx = e23x;int e23ty = e23y; 
                   
                   
           
           /*****************************************/
           
           // guardar la posicion actual en variables temporales
           // para poder restaurarla cuando chocamos con un bloque
           int tx = cx;
           int ty = cy;   
                     
           // aqui se asignan las animaciones dependiendo del
           //sentido en que avance el personaje
           //UP - decrease the value of the Y coordinate
           //Down - increase the value of the Y coordinate
           //Left - decrease the value of the X coordinate
           //Right - increase the value of the X coordinate
           if ((iKey & GameCanvas.UP_PRESSED) != 0){
               if(up==0){
                   up=1;
                   down=0;
                   left=0;
                   right=0;
                   Heroe.setFrameSequence(sequence3);                   
               }
               Heroe.nextFrame();           
               cy -= vanSpeed;
               
           } else if ((iKey & GameCanvas.DOWN_PRESSED) != 0){
               if(down==0){
                   up=0;
                   down=1;
                   left=0;
                   right=0;
                   Heroe.setFrameSequence(sequence1);                   
               }
               Heroe.nextFrame();
               
               
               cy += vanSpeed;
               
           } else if ((iKey & GameCanvas.LEFT_PRESSED) != 0){
               if(left==0){
                   up=0;
                   down=0;
                   left=1;
                   right=0;
                   Heroe.setFrameSequence(sequence4);                   
               }
               Heroe.nextFrame();
               
               
               cx -= vanSpeed;
           } else if ((iKey & GameCanvas.RIGHT_PRESSED) != 0){
               if(right==0){
                   up=0;
                   down=0;
                   left=0;
                   right=1;
                   Heroe.setFrameSequence(sequence2);                   
               }
               
               if(cont%180==0){
               Heroe.nextFrame();
               }
               
               cx += vanSpeed;
                       
           }                   
           
                 
           // update the vans position
           Heroe.setPosition(cx, cy);
           //check if the van hits a block
           if ((Heroe.collidesWith(blockMap, true))||(Heroe.collidesWith(blockMap1, true))
                   ||(Heroe.collidesWith(blockMap2, true))){
             //reset the van to the original position  
             Heroe.setPosition(tx, ty);
           }
           
           /*************ENEMIGOS****************/
          // colision con enemigos
           if ((Heroe.collidesWith(Enem1, true)||Heroe.collidesWith(Enem2, true)
                   ||Heroe.collidesWith(Enem3, true)||Heroe.collidesWith(Enem4, true)
                   ||Heroe.collidesWith(Enem5, true)||Heroe.collidesWith(Enem6, true)
                   ||Heroe.collidesWith(Enem7, true)||Heroe.collidesWith(Enem8, true)
                   ||Heroe.collidesWith(Enem9, true)||Heroe.collidesWith(Enem10, true)
                   ||Heroe.collidesWith(Enem11, true)||Heroe.collidesWith(Enem12, true)
                   )&&(nivelActual==1))
                   {
             //reset the van to the original position  
             Heroe.setPosition(16, 16);
             up=0;
             down=0;
             left=0;
             right=0;
           }
           
           if ((Heroe.collidesWith(Enem13, true)||Heroe.collidesWith(Enem14, true)
              ||Heroe.collidesWith(Enem15, true)||Heroe.collidesWith(Enem16, true)
              ||Heroe.collidesWith(Enem17, true)||Heroe.collidesWith(Enem18, true)
              ||Heroe.collidesWith(Enem19, true)||Heroe.collidesWith(Enem20, true)
              ||Heroe.collidesWith(Enem21, true)||Heroe.collidesWith(Enem22, true)
              ||Heroe.collidesWith(Enem23, true)
                   )&&(nivelActual==2)){
               //reset the van to the original position  
             Heroe.setPosition(208, 16);
             up=0;
             down=0;
             left=0;
             right=0;
           }    
           
           
           // update the enem1 position
           Enem1.setPosition(e1x, e1y);
           //check if the Enem1 hits a block
           if (Enem1.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem1.setPosition(e1tx, e1ty);
             if(en1left == 1){en1left=0;e1x += enem1Speed;}
             else if(en1left == 0){en1left=1;e1x -= enem1Speed;}
           }
           
           // update the enem2 position
           Enem2.setPosition(e2x, e2y);
           //check if the Enem2 hits a block
           if (Enem2.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem2.setPosition(e2tx, e2ty);
             if(en2left == 1){en2left=0;e2x += enem2Speed;}
             else if(en2left == 0){en2left=1;e2x -= enem2Speed;}
           }
           // update the enem3 position
           Enem3.setPosition(e3x, e3y);
           //check if the Enem3 hits a block
           if (Enem3.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem3.setPosition(e3tx, e3ty);
             if(en3up == 1){en3up=0;e3x -= enem3Speed;}
             else if(en3up == 0){en3up=1;e3x += enem3Speed;}
           }
           // update the enem4 position
           Enem4.setPosition(e4x, e4y);
           //check if the Enem4 hits a block
           if (Enem4.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem4.setPosition(e4tx, e4ty);
             if(en4up == 1){en4up=0;e4x -= enem4Speed;}
             else if(en4up == 0){en4up=1;e4x += enem4Speed;}
           }
           
           // update the enem5 position
           Enem5.setPosition(e5x, e5y);
           //check if the Enem5 hits a block
           if (Enem5.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem5.setPosition(e5tx, e5ty);
             if(en5up == 1){en5up=0;e5x -= enem5Speed;}
             else if(en5up == 0){en5up=1;e5x += enem5Speed;}
           }
           
           // update the enem6 position
           Enem6.setPosition(e6x, e6y);
           //check if the Enem6 hits a block
           if (Enem6.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem6.setPosition(e6tx, e6ty);
             if(en6up == 1){en6up=0;e6x -= enem6Speed;}
             else if(en6up == 0){en6up=1;e6x += enem6Speed;}
           }
           
           // update the enem7 position
           Enem7.setPosition(e7x, e7y);
           //check if the Enem7 hits a block
           if (Enem7.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem7.setPosition(e7tx, e7ty);
             if(en7left == 1){en7left=0;e7x += enem7Speed;}
             else if(en7left == 0){en7left=1;e7x -= enem7Speed;}
           }
           
           // update the enem8 position
           Enem8.setPosition(e8x, e8y);
           //check if the Enem8 hits a block
           if (Enem8.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem8.setPosition(e8tx, e8ty);
             if(en8left == 1){en8left=0;e8x += enem8Speed;}
             else if(en8left == 0){en8left=1;e8x -= enem8Speed;}
           }
           
           // update the enem9 position
          Enem9.setPosition(e9x, e9y);
           //check if the Enem9 hits a block
           if (Enem9.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem9.setPosition(e9tx, e9ty);
             if(en9left == 1){en9left=0;e9x += enem9Speed;}
             else if(en9left == 0){en9left=1;e9x -= enem9Speed;}
           }
           
           // update the enem10 position
           Enem10.setPosition(e10x, e10y);
           //check if the Enem10 hits a block
           if (Enem10.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem10.setPosition(e10tx, e10ty);
             if(en10left == 1){en10left=0;e10x += enem10Speed;}
             else if(en10left == 0){en10left=1;e10x -= enem10Speed;}
            }
           
           // update the enem11 position
           Enem11.setPosition(e11x, e11y);
           //check if the Enem11 hits a block
           if (Enem11.collidesWith(blockMap, true)){
             //reset the van to the original position  
             Enem11.setPosition(e11tx, e11ty);
             if(en11left == 1){en11left=0;e11x += enem11Speed;}
             else if(en11left == 0){en11left=1;e11x -= enem11Speed;}
           }
           
            //update the enem12 position
           Enem12.setPosition(e12x, e12y);
          // check if the Enem12 hits a block
           if (Enem12.collidesWith(blockMap, true)){
            // reset the van to the original position  
             Enem12.setPosition(e12tx, e12ty);
             if(en12left == 1){en12left=0;e12x += enem12Speed;}
             else if(en12left == 0){en12left=1;e12x -= enem12Speed;}
           }
          
           
           // update the enem13 position
          Enem13.setPosition(e13x, e13y);
//           //check if the Enem13 hits a block
           if (Enem13.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem13.setPosition(e13tx, e13ty);
             if(en13up == 1){en13up=0;e13y -= enem13Speed;}
             else if(en13up == 0){en13up=1;e13y += enem13Speed;}
           }
           
          // update the enem14 position
          Enem14.setPosition(e14x, e13y);
//           //check if the Enem14 hits a block
           if (Enem14.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem14.setPosition(e14tx, e14ty);
             if(en14up == 1){en14up=0;e14y -= enem14Speed;}
             else if(en14up == 0){en14up=1;e14y += enem14Speed;}
           }
          
          // update the enem15 position
          Enem15.setPosition(e15x, e15y);
//           //check if the Enem15 hits a block
           if (Enem15.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem15.setPosition(e15tx, e15ty);
             if(en15up == 1){en15up=0;e15y -= enem15Speed;}
             else if(en15up == 0){en15up=1;e15y += enem15Speed;}
           }
          
          // update the enem16 position
          Enem16.setPosition(e16x, e16y);
//           //check if the Enem16 hits a block
           if (Enem16.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem16.setPosition(e16tx, e16ty);
             if(en16up == 1){en16up=0;e16y -= enem16Speed;}
             else if(en16up == 0){en16up=1;e16y += enem16Speed;}
           }
          
          // update the enem17 position
          Enem17.setPosition(e17x, e17y);
//           //check if the Enem17 hits a block
           if (Enem17.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem17.setPosition(e17tx, e17ty);
             if(en17up == 1){en17up=0;e17y -= enem17Speed;}
             else if(en17up == 0){en17up=1;e17y += enem17Speed;}
           }
          
          // update the enem18 position
          Enem18.setPosition(e18x, e18y);
//           //check if the Enem18 hits a block
           if (Enem18.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem18.setPosition(e18tx, e18ty);
             if(en18up == 1){en18up=0;e18y -= enem18Speed;}
             else if(en18up == 0){en18up=1;e18y += enem18Speed;}
           }
          
          // update the enem19 position
          Enem19.setPosition(e19x, e19y);
//           //check if the Enem19 hits a block
           if (Enem19.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem19.setPosition(e19tx, e19ty);
             if(en19up == 1){en19up=0;e19y -= enem19Speed;}
             else if(en19up == 0){en19up=1;e19y += enem19Speed;}
           }
          
          // update the enem20 position
          Enem20.setPosition(e20x, e20y);
//           //check if the Enem20 hits a block
           if (Enem20.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem20.setPosition(e20tx, e20ty);
             if(en20up == 1){en20up=0;e20y -= enem20Speed;}
             else if(en20up == 0){en20up=1;e20y += enem20Speed;}
           }
          
          // update the enem21 position
          Enem21.setPosition(e21x, e21y);
//           //check if the Enem21 hits a block
           if (Enem21.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem21.setPosition(e21tx, e21ty);
             if(en21left == 1){en21left=0;e21x -= enem21Speed;}
             else if(en21left == 0){en21left=1;e21x += enem21Speed;}
           }
          
          // update the enem22 position
          Enem22.setPosition(e22x, e22y);
//           //check if the Enem22 hits a block
           if (Enem22.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem22.setPosition(e22tx, e22ty);
             if(en22left == 1){en22left=0;e22x -= enem22Speed;}
             else if(en22left == 0){en22left=1;e22x += enem22Speed;}
           }
          
          // update the enem23 position
          Enem23.setPosition(e23x, e23y);
//           //check if the Enem23 hits a block
           if (Enem23.collidesWith(blockMap1, true)){
//             //reset the van to the original position  
             Enem23.setPosition(e23tx, e23ty);
             if(en23left == 1){en23left=0;e23x -= enem23Speed;}
             else if(en23left == 0){en23left=1;e23x += enem23Speed;}
           }
           
            /***************************************/
           
           // Cambio de nivel al llegar a salida del nivel actual
           if((cx>200)&&(cy>280)){
               up=0;
               down=0;
               left=0;
               right=0;
               
               unload();
               nivelActual++;
               load(nivelActual);
               if(nivelActual==2)
               Heroe.setPosition(208, 16);
               else Heroe.setPosition(16, 16);
               g = getGraphics();
               }
           
           
           //restaurar el clipping rectangle a pantalla completa
           g.setClip(0, 0, screenW, screenH);
           //dibujar el camino
           roadMap.paint(g);
           
           //Dibujar los bloques
           if(nivelActual==1)
           blockMap.paint(g);
           else if(nivelActual==2)
           blockMap1.paint(g);
           else if(nivelActual==3)
           blockMap2.paint(g);
           
           // dibujar sprites
           Heroe.paint(g);
           /*************ENEMIGOS***********/
           if(nivelActual==1){
           Enem1.paint(g);
           Enem2.paint(g);
           Enem3.paint(g);
           Enem4.paint(g);
           Enem5.paint(g);
           Enem6.paint(g);
           Enem7.paint(g);
           Enem8.paint(g);
           Enem9.paint(g);
           Enem10.paint(g);
           Enem11.paint(g);
           Enem12.paint(g);
           }
           else if(nivelActual==2){
               Enem13.paint(g);
               Enem14.paint(g);
               Enem15.paint(g);
               Enem16.paint(g);
               Enem17.paint(g);
               Enem18.paint(g);
               Enem19.paint(g);
               Enem20.paint(g);
               Enem21.paint(g);
               Enem22.paint(g);
               Enem23.paint(g);
           }
           /********************************/
           
          
           //al final del loop flushGraphics() dibuja lo que se desea
           //ver por pantalla
           flushGraphics();
           
           try{
        	   //el thread se duerme 30 ms y luego continua
               Thread.sleep(30);
           } catch (Exception ex){
               
           }
       }
       g = null;
       unload();
       fParent.destroyApp(false);
       fParent = null;
       cont++;
    }
}  
    

