Pestañas

martes, 4 de mayo de 2021

Proyecto P.C.: frontón con processing

En este proyecto programaremos un simple juego de frontón con arduino-processing y un joystick conectado a arduino.



El programa en Processing es:

import processing.serial.*; //importamos la libreria para trabajar con el puerto serie

Serial mipuerto; //Nombre del puerto serie

float pos_pelotaX=50;
float pos_pelotaY=300;
float incrementoX=5;//incremento de la bola en X
float incrementoY=3;//incremento de la bola en Y
int pos_raqueta=250;
int incrementoR=10;
int valor_serie=0; //En esta vble almacenaremos el valor de la información transmitida por el puerto por parte de Arduino
int puntos=0;
int fallos=0;
boolean derecha=true; //será verdadero si la pelota viene desde la derecha y falso si viene rebotada desde la izquierda

void setup() {
  size(600, 600);
  mipuerto = new Serial(this, "COM11", 9600);  //inicializamos el puerto
}

void draw() {
  if (mipuerto.available() > 0) { //si hay algo que leer...
    valor_serie = mipuerto.read(); //lo almacena en la variable valor_serie
  }
  if (pos_pelotaX<25) {   //Cuando choque con la pared izda, cambia de dirección en X
    incrementoX=-incrementoX;
    derecha=true; //la pelota ira hacia la derecha
  }
  if (pos_pelotaX>575) {//Cuando choque con la pared derecha, cambia de dirección en X
    incrementoX=-incrementoX;
    derecha=false; //la pelota ira hacia la izquierda
  }
  if ((pos_pelotaY<25)||(pos_pelotaY>575)) { //Cuando choque cambia de dirección en Y
    incrementoY=-incrementoY;
  }
  background(255, 255, 0);
  control();
  pelota(pos_pelotaX, pos_pelotaY);
  raqueta(pos_raqueta);
  if (choque() && derecha) {
    puntos=puntos+1;  //Si chocan raqueta y bola sumamos un punto
    incrementoX=-incrementoX;
  }
  if (pos_pelotaX==550) {
    fallos=fallos+1;
  }
  textSize(32);
  fill(0);
  text ("puntos: ", 10, 30);
  text ("fallos: ", 10, 70);
  text (puntos, 150, 30);
  text (fallos/2, 150, 70);

  pos_pelotaX=pos_pelotaX+incrementoX;
  pos_pelotaY=pos_pelotaY+incrementoY;
}

//Procedimiento que dibuja la raqueta
void raqueta (int posR) {
  fill(0, 0, 255);
  noStroke();
  rect(550, posR, 10, 100);
}

//Procedimieinto que dibuja la pelota
void pelota (float posX, float posY) {
  fill(255, 0, 0);
  ellipse(posX, posY, 50, 50);
}

//procedimiento que comprueba si han chocado
boolean choque() {
  if (pos_pelotaY<pos_raqueta) {
    if ((pos_pelotaX==525) && ((pos_raqueta-pos_pelotaY)<5)) {
      return true;
    }
  }
  if (pos_pelotaY>pos_raqueta) {
    if ((pos_pelotaX==525) && ((pos_pelotaY-pos_raqueta)<95)) {
      return true;
    }
  }
  return false;
}

//control de la raqueta con el joystick que envia información a través del puerto serie desde arduino
void control() {
  if (pos_raqueta>500) { //Si se sale de los límites no seguimos sumando nada a la posición
    pos_raqueta = 500;
  }
  if (pos_raqueta<0) {  //Si se sale de los límites no seguimos restando nada a la posición
    pos_raqueta = 0;
  }
  if (valor_serie==2) { //Joystick hacia abajo
    pos_raqueta = pos_raqueta + incrementoR;
  }
  if (valor_serie==1) {  //Joystick hacia arriba
    pos_raqueta = pos_raqueta - incrementoR;
  }
}

El programa de Arduino es:

void setup() {
  Serial.begin(9600);
}

void loop() {
  //Dependiendo de la posición del joystick
  //información al puerto para que la lea processing
  delay(100);
  if (analogRead(A0) > 520) {
    Serial.write(1);
    delay(30); //para no saturar el puerto
  } else if (analogRead(A0) < 490) {
    Serial.write(2);
    delay(30);
  }else Serial.write(0);
}


No hay comentarios:

Publicar un comentario