import processing.serial.*;
PImage fon;
PImage cuadro;
//Se inicializa el tamaño de la ventana
final int anchoVentana = 700;
final int largoVentana = 500;
//Poscicion de la Nave
int posX = 320;
int posY = 240;
//Direcion del movimiento del misil
int movimientoX[] = {
2, 0, 0, -2
};
int movimientoY[] = {
0, -2, 2, 0
};
ArrayList<Figura> figuras;
ArrayList<Misil> misiles;
//Velocidad de la nave
Punto velocidad;
//variable que indica si se mueve hacia la derecha o izquierda
int intervalo = 5;
//variable que contendra el boton presionado
int butonDisparo;
//distancia inicial del misil con el cañon
int distanciaMisilAlCanon = 5;
//tamaño del misil
int radioMisil = 10;
// definir la variable puerto del tipo Serial
Serial puerto;
void setup() {
fon = loadImage("uni.jpg");
cuadro = loadImage("nasa.jpg");
size(anchoVentana, largoVentana);
smooth();
//se crean la instancia de los objetos
velocidad = new Punto();
misiles = new ArrayList<Misil>();
figuras = new ArrayList<Figura>();
//se carga los datos (x,y,ancho,largo,tipo de figura(rectangulo o circulo) de la nave
int figurasNave[] = cargarDatosNave();
for (int i = 0; i < figurasNave.length; i+=5) {
//selecciona el tipo de figura
if (figurasNave[i+4] == 0) {
//se crea un rectangulo y se adicciona a al arreglo figuras
figuras.add(new Rectangulo(figurasNave[i], figurasNave[i + 1],
figurasNave[i + 2], figurasNave[i + 3]));
}
else {
//se crea un circulo y se adicciona a al arreglo figuras
figuras.add(new Elipse(figurasNave[i], figurasNave[i+1],
figurasNave[i+2], figurasNave[i+3]));
}
}
String COM = Serial.list()[0];
//comunicacion serial a 9600bps
puerto = new Serial(this, COM, 9600);
}
void draw() {
background(255);
//noStroke();
fill(45, 45, 120 );
image(fon, 0, 0, 700, 500);
//image(cuadro,330,280,35,30);
for (Figura figura : figuras) {
//se modifica la posicion de la figura
figura.getPuntos().setX(figura.getPuntos().getX()+velocidad.getX());
figura.getPuntos().setY(figura.getPuntos().getY()+velocidad.getY());
//Metodo que dibuja la figura
figura.dibujar();
}
//Se indica que la figura se detenga si esta en movimiento
velocidad.setX(0);
velocidad.setY(0);
image(cuadro, 330, 250, 35, 30);
serialRead();
}
void serialRead() {
//
if (puerto.available() >= 2) {
//se lee los tados recibidos desde arduino
//variable que contendra el nombre del evento, X, Y o Boton.
int valor = puerto.read();
//variable que contendra el valor de X, Y o Boton presionado
int accion = puerto.read();
seleccionarEvento((char)valor, accion);
}
drawMisil();
}
public int[] cargarDatosNave() {
//numero de figuras que tiene la nave
int numeroFigurasNave = 7;
//los atributos necesarios para crear e indicar el tipo de figura
int numeroAtributosFigura = 5;
//arreglo que contendra los datos de las figuras
int figurasNave[] = new int[numeroFigurasNave*numeroAtributosFigura];
//figura centro
figurasNave[0] = posX; //posicion X
figurasNave[1] = posY; //posicion Y
figurasNave[2] = 50; //ancho
figurasNave[3] = 50; //largo
figurasNave[4] = 0; //tipo de figura rectangulo
//figura cañon derecho
figurasNave[5] = posX+50+5; //posicion X
figurasNave[6] = posY+50/2-10; //posicion Y
figurasNave[7] = 20; //ancho
figurasNave[8] = 20; //largo
figurasNave[9] = 0; //tipo de figura rectangulo
//figura cañon arriba
figurasNave[10] = posX+50/2-10; //posicion X
figurasNave[11] = posY-25; //posicion Y
figurasNave[12] = 20; //ancho
figurasNave[13] = 20; //largo
figurasNave[14] = 0; //tipo de figura rectangulo
//figura cañon abajo
figurasNave[15] = posX+50/2-10; //posicion X
figurasNave[16] = posY+55; //posicion Y
figurasNave[17] = 20; //ancho
figurasNave[18] = 20; //largo
figurasNave[19] = 0; //tipo de figura rectangulo
//figura cañon izquierdo
figurasNave[20] = posX-20-5; //posicion X
figurasNave[21] = posY+50/2-10; //posicion Y
figurasNave[22] = 20; //ancho
figurasNave[23] = 20; //largo
figurasNave[24] = 0; //tipo de figura rectangulo
//figura ojo izquierdo
//figurasNave[25] = posX+40-15; //posicion X
//figurasNave[26] = posY+25; //posicion Y
//figurasNave[27] = 12; //ancho
//figurasNave[28] = 12; //largo
//figurasNave[29] = 1; //tipo de figura circulo
//figura ojo derecho
//figurasNave[30] = posX+40+15; //posicion X
//figurasNave[31] = posY+25; //posicion Y
//figurasNave[32] = 12; //ancho
//figurasNave[33] = 12; //largo
//figurasNave[34] = 1; //tipo de figura circulo
return figurasNave;
}
void seleccionarEvento(char valor, int accion) {
switch(valor) {
case 'x':
int x = accion;
//se valida si el movimiento en x es hacia la derecha o izquierda
//de acuerdo al intervalo
//posX += (x>intervalo)?x-intervalo:((x-intervalo-1));
velocidad.setX((x>intervalo)?x-intervalo:((x-intervalo-1)));
break;
case 'y':
int y = accion;
//posY += (y>intervalo)?(intervalo-y):((intervalo-1-y));
velocidad.setY((y>intervalo)?(intervalo-y):((intervalo-1-y)));
break;
case 'b':
//Hay evento de un boton
butonDisparo = accion;
//metodo para inicializar la posicion del misil de acuerdo
//al boton presionado
Punto posicionMisil = calculcularPosicionMisil(butonDisparo);
//se crea el misil
misiles.add(new Misil(posicionMisil.getX(), posicionMisil.getY(),
radioMisil, radioMisil));
misiles.get(misiles.size()-1).setEstado(true);
//se adicciona el cañon que lo disparo
misiles.get(misiles.size()-1).setDireccion(butonDisparo);
break;
}
}
Punto calculcularPosicionMisil(int butonDisparo) {
Punto posicionDisparo = new Punto();
switch(butonDisparo) {
case 0:
//cañon lado derecho
posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
+ figuras.get(butonDisparo+1).getAncho()+distanciaMisilAlCanon);
posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
+ figuras.get(butonDisparo+1).getLargo()/2);
break;
case 1:
//cañon lado arriba
posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
+ figuras.get(butonDisparo+1).getAncho()/2);
posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
- distanciaMisilAlCanon);
break;
case 2:
//cañon lado abajo
posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
+ figuras.get(butonDisparo+1).getAncho()/2);
posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
+ figuras.get(butonDisparo+1).getLargo()+distanciaMisilAlCanon);
break;
case 3:
//cañon lado izquierdo
posicionDisparo.setX(figuras.get(butonDisparo+1).getPuntos().getX()
- distanciaMisilAlCanon);
posicionDisparo.setY(figuras.get(butonDisparo+1).getPuntos().getY()
+ figuras.get(butonDisparo+1).getLargo()/2);
break;
}
return posicionDisparo;
}
void drawMisil() {
Misil inactivo = null;
for (Misil misil : misiles) {
misil.mover(movimientoX[misil.getDireccion()], movimientoY[misil.getDireccion()]);
//si el misil ya no es visible en la ventana
if (misil.activo(anchoVentana, largoVentana)) {
//variable que contendra el misil para ser removido de la lista
inactivo = misil;
//misil.setEstado(false);
}
}
//se elimina el misil que este fuera de la vista de la ventana
if (inactivo != null) {
misiles.remove(inactivo);
}
}
class Punto {
private int x;
private int y;
public Punto() {
}
public Punto(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
public void setY(int y) {
this.y = y;
}
public int getY() {
return y;
}
}
abstract class Figura {
private Punto puntos;
private int ancho;
private int largo;
public Figura(Punto puntos, int ancho, int largo) {
this.puntos = puntos;
this.ancho = ancho;
this.largo = largo;
}
public void setPutos(Punto puntos) {
this.puntos = puntos;
}
public Punto getPuntos() {
return puntos;
}
public void setAncho(int ancho) {
this.ancho = ancho;
}
public int getAncho() {
return ancho;
}
public void setLargo(int largo) {
this.largo = largo;
}
public int getLargo() {
return largo;
}
abstract public void dibujar();
}
class Poligono extends Figura {
public Poligono(Punto puntos, int ancho, int largo) {
super(puntos, ancho, largo);
}
public Poligono(int x, int y, int ancho, int largo) {
super(new Punto(x, y), ancho, largo);
}
@ Override
public void dibujar() {
}
}
class Rectangulo extends Poligono {
public Rectangulo(int x, int y, int ancho, int largo) {
super(x, y, ancho, largo);
}
@ Override
public void dibujar() {
rect(getPuntos().getX(), getPuntos().getY(), getAncho(), getLargo());
}
}
class Elipse extends Figura {
float radio;
public Elipse(int x, int y, int ancho, int largo) {
super(new Punto(x, y), ancho, largo);
}
@Override
public void dibujar() {
fill(150, 100, 249);
ellipse( getPuntos().getX(), getPuntos().getY(), getAncho(), getLargo());
}
}
class Misil {
Figura figura;
boolean estado;
int direccion;
public Misil(int x, int y, int ancho, int largo) {
figura = new Elipse(x, y, ancho, largo);
}
public void moverMisil(int x, int y) {
figura.getPuntos().setX(x);
figura.getPuntos().setY(y);
}
public void setEstado(boolean estado) {
this.estado = estado;
}
public boolean getEstado() {
return estado;
}
public boolean isEstado() {
return estado;
}
public void setDireccion(int direccion) {
this.direccion = direccion;
}
public int getDireccion() {
return direccion;
}
public void mover(int x, int y) {
figura.getPuntos().setX(figura.getPuntos().getX()+x);
figura.getPuntos().setY(figura.getPuntos().getY()+y);
figura.dibujar();
}
public boolean activo(int anchoVista, int largoVista) {
if (figura.getPuntos().getX() > - figura.getAncho() &&
figura.getPuntos().getX() < anchoVista + figura.getAncho() ||
figura.getPuntos().getY() > - figura.getLargo() &&
figura.getPuntos().getY() < + figura.getLargo()) {
return false;
}
return true;
}
}
//enum Direccio { DERECHA, ARRIBA, ABAJO, IZQUIERDA }