package Naves;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;

public class Dibujar extends JPanel {
    Nave miNave;
    List <Bala> balazos;
    MueveBalas disparo;
    int dx, dy;
    MueveNave mueveNave;
            
    public Dibujar() {
        miNave = new Nave();
        balazos = new ArrayList <Bala> ();      
        disparo = new MueveBalas();
        disparo.start();
        dx=0; dy =0;
        mueveNave = new MueveNave();
        mueveNave.start();
        this.setPreferredSize(new Dimension(400, 400)); // Tamanio del lienzo
        this.setBackground(Color.WHITE); // Pone un color de fondo
        this.setVisible(true);
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        try {
            miNave.dibuja(g); 
            for(Bala b: balazos)
                b.dibuja(g);
        } catch (ConcurrentModificationException e) {}
    }

    public void keyPressed(KeyEvent arg0) {
        if(arg0.getKeyCode() == KeyEvent.VK_LEFT)  dx--;
        if(arg0.getKeyCode() == KeyEvent.VK_RIGHT) dx++;
        if(arg0.getKeyCode() == KeyEvent.VK_UP)  dy--;        
        if(arg0.getKeyCode() == KeyEvent.VK_DOWN) dy++;
        
        if(arg0.getKeyCode() == KeyEvent.VK_A) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), -1, 0));
        
        if(arg0.getKeyCode() == KeyEvent.VK_S) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), 1, 0));
        
        if(arg0.getKeyCode() == KeyEvent.VK_W) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), 0, -1));
        
        if(arg0.getKeyCode() == KeyEvent.VK_Z) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), 0, 1));
        
    }
    
    public void keyReleased(KeyEvent arg0) {
        dx=0;
        dy=0;
    }
    
    private class MueveNave extends Thread {
        @Override        
        public void run(){
            while(true) {
                miNave.mueve(dx, dy);
                repaint();
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Dibujar.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }        
    }
    
    private class MueveBalas extends Thread {      
        void borra() {
            int k, elimina =-1;
            
            if (balazos.size() <1) return;
            do {
                k=0;
                elimina = -1;
                for(Bala b: balazos) {
                    if(b.getX() <= 0   ) { elimina = k; break;}
                    if(b.getX() >= 400 ) { elimina = k; break;}
                    if(b.getY() <= 0   ) { elimina = k; break;}
                    if(b.getY() >= 400 ) { elimina = k; break;}
                }
                if(elimina >= 0) balazos.remove(elimina);
            } while(elimina >=0);
        }
        
        @Override        
        public void run(){
            while(true) {
                for(Bala b: balazos)
                    b.mueve();
                borra();
                repaint();
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                }
            }         
        }
    }
}
