Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import processing.serial.*;
  2. PImage fon;
  3. PImage cuadro;
  4.  
  5. //Se inicializa el tamaño de la ventana
  6. final int anchoVentana = 700;
  7. final int largoVentana = 500;
  8.  
  9. //Poscicion de la Nave
  10. int posX = 320;
  11. int posY = 240;
  12.  
  13. //Direcion del movimiento del misil
  14. int movimientoX[] = {
  15.   2, 0, 0, -2
  16. };
  17. int movimientoY[] = {
  18.   0, -2, 2, 0
  19. };
  20.  
  21. ArrayList<Figura> figuras;
  22. ArrayList<Misil> misiles;
  23.  
  24. //Velocidad de la nave
  25. Punto velocidad;
  26.  
  27. //variable que indica si se mueve hacia la derecha o izquierda
  28. int intervalo = 5;
  29.  
  30. //variable que contendra el boton presionado
  31. int butonDisparo;
  32.  
  33. //distancia inicial del misil con el cañon
  34. int distanciaMisilAlCanon = 5;
  35. //tamaño del misil
  36. int radioMisil = 10;
  37. // definir la variable puerto del tipo Serial
  38. Serial puerto;
  39.  
  40. void setup() {
  41.  
  42.   fon = loadImage("uni.jpg");
  43.   cuadro = loadImage("nasa.jpg");
  44.   size(anchoVentana, largoVentana);
  45.   smooth();
  46.  
  47.   //se crean la instancia de los objetos
  48.   velocidad = new Punto();  
  49.   misiles = new ArrayList<Misil>();  
  50.   figuras = new ArrayList<Figura>();  
  51.  
  52.   //se carga los datos (x,y,ancho,largo,tipo de figura(rectangulo o circulo) de la nave
  53.   int figurasNave[] = cargarDatosNave();
  54.   for (int i = 0; i < figurasNave.length; i+=5) {
  55.     //selecciona el tipo de figura
  56.     if (figurasNave[i+4] == 0) {
  57.       //se crea un rectangulo y se adicciona a al arreglo figuras
  58.       figuras.add(new Rectangulo(figurasNave[i], figurasNave[i + 1],
  59.       figurasNave[i + 2], figurasNave[i + 3]));
  60.     }
  61.     else {
  62.       //se crea un circulo y se adicciona a al arreglo figuras
  63.       figuras.add(new Elipse(figurasNave[i], figurasNave[i+1],
  64.       figurasNave[i+2], figurasNave[i+3]));
  65.     }
  66.   }
  67.  
  68.   String COM = Serial.list()[0];
  69.   //comunicacion serial a 9600bps
  70.   puerto = new Serial(this, COM, 9600);
  71. }
  72.  
  73. void draw() {
  74.   background(255);
  75.   //noStroke();
  76.   fill(45, 45, 120 );
  77.  
  78.   image(fon, 0, 0, 700, 500);
  79.   //image(cuadro,330,280,35,30);
  80.  
  81.   for (Figura figura : figuras) {
  82.     //se modifica la posicion de la figura    
  83.     figura.getPuntos().setX(figura.getPuntos().getX()+velocidad.getX());
  84.     figura.getPuntos().setY(figura.getPuntos().getY()+velocidad.getY());
  85.     //Metodo que dibuja la figura
  86.     figura.dibujar();
  87.   }
  88.  
  89.   //Se indica que la figura se detenga si esta en movimiento
  90.   velocidad.setX(0);
  91.   velocidad.setY(0);
  92.  
  93.   image(cuadro, 330, 250, 35, 30);
  94.   serialRead();
  95. }
  96.  
  97. void serialRead() {
  98.   //
  99.   if (puerto.available() >= 2) {
  100.     //se lee los tados recibidos desde arduino
  101.     //variable que contendra el nombre del evento, X, Y o Boton.
  102.     int valor  = puerto.read();  
  103.     //variable que contendra el valor de X, Y o Boton presionado  
  104.     int accion = puerto.read();    
  105.     seleccionarEvento((char)valor, accion);
  106.   }
  107.   drawMisil();
  108. }
  109.  
  110. public int[] cargarDatosNave() {
  111.   //numero de figuras que tiene la nave
  112.   int numeroFigurasNave = 7;
  113.   //los atributos necesarios para crear e indicar el tipo de figura
  114.   int numeroAtributosFigura = 5;
  115.   //arreglo que contendra los datos de las figuras
  116.   int figurasNave[] = new int[numeroFigurasNave*numeroAtributosFigura];
  117.  
  118.   //figura centro
  119.   figurasNave[0] = posX; //posicion X
  120.   figurasNave[1] = posY; //posicion Y
  121.   figurasNave[2] = 50;   //ancho
  122.   figurasNave[3] = 50;   //largo
  123.   figurasNave[4] = 0;    //tipo de figura rectangulo
  124.  
  125.   //figura cañon derecho
  126.   figurasNave[5] = posX+50+5; //posicion X
  127.   figurasNave[6] = posY+50/2-10; //posicion Y
  128.   figurasNave[7] = 20;   //ancho
  129.   figurasNave[8] = 20;   //largo  
  130.   figurasNave[9] = 0;    //tipo de figura rectangulo
  131.  
  132.   //figura cañon arriba
  133.   figurasNave[10] = posX+50/2-10; //posicion X
  134.   figurasNave[11] = posY-25; //posicion Y
  135.   figurasNave[12] = 20;   //ancho
  136.   figurasNave[13] = 20;   //largo
  137.   figurasNave[14] = 0;    //tipo de figura rectangulo
  138.  
  139.   //figura cañon abajo
  140.   figurasNave[15] = posX+50/2-10; //posicion X
  141.   figurasNave[16] = posY+55; //posicion Y
  142.   figurasNave[17] = 20;   //ancho
  143.   figurasNave[18] = 20;   //largo
  144.   figurasNave[19] = 0;    //tipo de figura rectangulo
  145.  
  146.   //figura cañon izquierdo
  147.   figurasNave[20] = posX-20-5; //posicion X
  148.   figurasNave[21] = posY+50/2-10; //posicion Y
  149.   figurasNave[22] = 20;   //ancho
  150.   figurasNave[23] = 20;   //largo
  151.   figurasNave[24] = 0;    //tipo de figura rectangulo
  152.  
  153.   //figura ojo izquierdo
  154.   //figurasNave[25] = posX+40-15; //posicion X
  155.   //figurasNave[26] = posY+25; //posicion Y
  156.   //figurasNave[27] = 12;   //ancho
  157.   //figurasNave[28] = 12;   //largo
  158.   //figurasNave[29] = 1;    //tipo de figura circulo
  159.  
  160.   //figura ojo derecho
  161.   //figurasNave[30] = posX+40+15; //posicion X
  162.   //figurasNave[31] = posY+25; //posicion Y
  163.   //figurasNave[32] = 12;   //ancho
  164.   //figurasNave[33] = 12;   //largo
  165.   //figurasNave[34] = 1;    //tipo de figura circulo
  166.  
  167.   return figurasNave;
  168. }
  169.  
  170. void seleccionarEvento(char valor, int accion) {
  171.   switch(valor) {
  172.   case 'x':
  173.     int x = accion;
  174.     //se valida si el movimiento en x es hacia la derecha o izquierda
  175.     //de acuerdo al intervalo
  176.     //posX += (x>intervalo)?x-intervalo:((x-intervalo-1));        
  177.     velocidad.setX((x>intervalo)?x-intervalo:((x-intervalo-1)));
  178.     break;
  179.   case 'y':
  180.     int y = accion;
  181.     //posY += (y>intervalo)?(intervalo-y):((intervalo-1-y));
  182.     velocidad.setY((y>intervalo)?(intervalo-y):((intervalo-1-y)));
  183.     break;
  184.   case 'b':
  185.     //Hay evento de un boton
  186.     butonDisparo = accion;
  187.     //metodo para inicializar la posicion del misil de acuerdo
  188.     //al boton presionado
  189.     Punto posicionMisil = calculcularPosicionMisil(butonDisparo);          
  190.     //se crea el misil
  191.     misiles.add(new Misil(posicionMisil.getX(), posicionMisil.getY(),
  192.     radioMisil, radioMisil));  
  193.     misiles.get(misiles.size()-1).setEstado(true);
  194.     //se adicciona el cañon que lo disparo
  195.     misiles.get(misiles.size()-1).setDireccion(butonDisparo);          
  196.     break;
  197.   }
  198. }
  199.  
  200. Punto calculcularPosicionMisil(int butonDisparo) {
  201.   Punto posicionDisparo = new Punto();
  202.   switch(butonDisparo) {
  203.   case 0:
  204.     //cañon lado derecho
  205.     posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
  206.       + figuras.get(butonDisparo+1).getAncho()+distanciaMisilAlCanon);
  207.     posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
  208.       + figuras.get(butonDisparo+1).getLargo()/2);
  209.     break;
  210.   case 1:
  211.     //cañon lado arriba
  212.     posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
  213.       + figuras.get(butonDisparo+1).getAncho()/2);
  214.     posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
  215.       - distanciaMisilAlCanon);
  216.     break;
  217.   case 2:
  218.     //cañon lado abajo
  219.     posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
  220.       + figuras.get(butonDisparo+1).getAncho()/2);
  221.     posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
  222.       + figuras.get(butonDisparo+1).getLargo()+distanciaMisilAlCanon);
  223.     break;
  224.   case 3:
  225.     //cañon lado izquierdo
  226.     posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
  227.       - distanciaMisilAlCanon);
  228.     posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
  229.       + figuras.get(butonDisparo+1).getLargo()/2);
  230.     break;
  231.   }  
  232.   return posicionDisparo;
  233. }
  234.  
  235. void drawMisil() {
  236.   Misil inactivo = null;
  237.  
  238.   for (Misil misil : misiles) {
  239.     misil.mover(movimientoX[misil.getDireccion()], movimientoY[misil.getDireccion()]);
  240.     //si el misil ya no es visible en la ventana
  241.     if (misil.activo(anchoVentana, largoVentana)) {  
  242.       //variable que contendra el misil para ser removido de la lista    
  243.       inactivo = misil;
  244.       //misil.setEstado(false);
  245.     }
  246.   }
  247.  
  248.   //se elimina el misil que este fuera de la vista de la ventana
  249.   if (inactivo != null) {
  250.     misiles.remove(inactivo);
  251.   }
  252. }
  253.  
  254. class Punto {
  255.   private int x;
  256.   private int y;
  257.  
  258.   public Punto() {
  259.   }
  260.  
  261.   public Punto(int x, int y) {
  262.     this.x = x;
  263.     this.y = y;
  264.   }
  265.  
  266.   public void setX(int x) {
  267.     this.x = x;
  268.   }
  269.  
  270.   public int getX() {
  271.     return x;
  272.   }
  273.  
  274.   public void setY(int y) {
  275.     this.y = y;
  276.   }
  277.  
  278.   public int getY() {
  279.     return y;
  280.   }
  281. }
  282.  
  283. abstract class Figura {
  284.   private Punto puntos;
  285.   private int ancho;
  286.   private int largo;
  287.  
  288.   public Figura(Punto puntos, int ancho, int largo) {
  289.     this.puntos = puntos;
  290.     this.ancho = ancho;
  291.     this.largo = largo;
  292.   }
  293.  
  294.   public void setPutos(Punto puntos) {
  295.     this.puntos = puntos;
  296.   }
  297.  
  298.   public Punto getPuntos() {
  299.     return puntos;
  300.   }
  301.  
  302.   public void setAncho(int ancho) {
  303.     this.ancho = ancho;
  304.   }
  305.  
  306.   public int getAncho() {
  307.     return ancho;
  308.   }
  309.  
  310.   public void setLargo(int largo) {
  311.     this.largo = largo;
  312.   }
  313.  
  314.   public int getLargo() {
  315.     return largo;
  316.   }
  317.  
  318.   abstract public void dibujar();
  319. }
  320.  
  321. class Poligono extends Figura {
  322.  
  323.   public Poligono(Punto puntos, int ancho, int largo) {
  324.     super(puntos, ancho, largo);
  325.   }
  326.  
  327.   public Poligono(int x, int y, int ancho, int largo) {
  328.     super(new Punto(x, y), ancho, largo);
  329.   }
  330.  
  331.   @ Override
  332.     public void dibujar() {
  333.   }
  334. }
  335.  
  336. class Rectangulo extends Poligono {
  337.  
  338.   public Rectangulo(int x, int y, int ancho, int largo) {
  339.     super(x, y, ancho, largo);
  340.   }
  341.  
  342.   @ Override
  343.     public void dibujar() {
  344.     rect(getPuntos().getX(), getPuntos().getY(), getAncho(), getLargo());
  345.   }
  346. }
  347.  
  348. class Elipse extends Figura {
  349.   float radio;
  350.  
  351.   public Elipse(int x, int y, int ancho, int largo) {
  352.     super(new Punto(x, y), ancho, largo);
  353.   }
  354.  
  355.   @Override
  356.     public void dibujar() {    
  357.     fill(150, 100, 249);
  358.     ellipse( getPuntos().getX(), getPuntos().getY(), getAncho(), getLargo());
  359.   }
  360. }
  361.  
  362. class Misil {
  363.  
  364.   Figura figura;  
  365.   boolean estado;
  366.   int direccion;
  367.  
  368.   public Misil(int x, int y, int ancho, int largo) {
  369.     figura = new Elipse(x, y, ancho, largo);
  370.   }
  371.  
  372.   public void moverMisil(int x, int y) {
  373.     figura.getPuntos().setX(x);
  374.     figura.getPuntos().setY(y);
  375.   }
  376.  
  377.   public void setEstado(boolean estado) {
  378.     this.estado = estado;
  379.   }
  380.  
  381.   public boolean getEstado() {
  382.     return estado;
  383.   }
  384.  
  385.   public boolean isEstado() {
  386.     return estado;
  387.   }
  388.  
  389.   public void setDireccion(int direccion) {
  390.     this.direccion = direccion;
  391.   }
  392.  
  393.   public int getDireccion() {
  394.     return direccion;
  395.   }
  396.  
  397.   public void mover(int x, int y) {
  398.     figura.getPuntos().setX(figura.getPuntos().getX()+x);
  399.     figura.getPuntos().setY(figura.getPuntos().getY()+y);
  400.     figura.dibujar();
  401.   }
  402.  
  403.   public boolean activo(int anchoVista, int largoVista) {
  404.     if (figura.getPuntos().getX() > - figura.getAncho() &&
  405.       figura.getPuntos().getX() < anchoVista + figura.getAncho() ||
  406.       figura.getPuntos().getY() > - figura.getLargo() &&
  407.       figura.getPuntos().getY() <  + figura.getLargo()) {
  408.       return false;
  409.     }
  410.     return true;
  411.   }
  412. }
  413.  
  414. //enum Direccio { DERECHA, ARRIBA, ABAJO, IZQUIERDA }