Colision no funciona (processing)

Intento hacer que los objetos que caen de arriba tengan colision con el objeto que controlas con las flechas izquiera y derecha, alguien me puede ayudar o recomendar algo?

aqui esta mi codigo

int radius = 20, direccionX = 0, direccionY = 0;
float x=400, y=20, speed=4;
boolean gameOver = false;
//PImage fondo;

ArrayList <objetos> objeto = new ArrayList<objetos>();

// =========================================================
void setup()
{
  size(800, 700);
  ellipseMode(RADIUS);
  //fondo = loadImage("beanstalk.png");
}
void draw()
{
  background(255);
  // cambiar posicion
  x=x+speed*direccionX;
  // checar orillas
  if ((x>width-radius) || (x<radius))
  {   
    direccionX=-direccionX;
  }
  fill (color(224, 24, 22)); 
  ellipse (x, 610, radius, radius);
  x = constrain(x, 235, 600);

  if(random(1) < 0.01){
    objeto.add (new objetos());
  }
    for(int i =0; i < objeto.size(); i++){
    if(objeto.get(i).y > height){
      objeto.remove(i);
    }
  }
  for (int i = 0; i < objeto.size(); i++) {
    if (objeto.get(i).pega()) {
      fill(255, 0, 0);
      gameOver = true;
    } else {
      fill(255);
    }
    objeto.get(i).dibujar();
    if (!gameOver) {
      objeto.get(i).update();
    }
  }

  // =========================================================
  if (key == CODED)
  {
    if (keyCode == LEFT)
    {
      //if (directionX>0) { 
      direccionX=-1;
      direccionY=0;
      //}
    } else if (keyCode == RIGHT)
    {
      //if (directionX<0) {  
      direccionX=1;
      direccionY=0;
      //}
    }
  }
}
// ===========================================================

class objetos {
  float x;
  float y;
  float ancho = 60;
  float alto = 50;

  objetos() {
    x = random(600);
    y = 1;
    x = constrain(x, 210, 625);
  }


  void dibujar() {
    stroke(0);
    rect(x, y, alto, ancho);
    {
      if (y > height) 
        y = 0;
      y += 5;
      //x = random(600);
      x = constrain(x, 150, 650);
    }
  }
  void update() {
    y += 5;
  }



  boolean pega() {
    if (
      //checar interseccion en X
      ancho + y > radius
      && ancho < radius + radius// && AND
      //checar interseccion en Y
      && alto + y > radius
      && alto < radius + radius
      ) {
      return true;
    } else {
      return false;
    }
  }
}
1 Like

¡Bienvenidos! Lo siento–mi español no es fuerte.

El primer problema con tu codigo es que ArrayList necesita un tipo de datos; es un concepto de Java se llama generics. Por ejemplo,

ArrayList<Objeto> objetos = new ArrayList<Objeto>();

Puedes usar un par de ` cuando compartes piezas pequeñas de codigo o

```java
lineas de codigo…
```

por piezas más largas. Lo siguente es una posibilidad para tu método pega().

int radius = 20, direccionX = 0, direccionY = 0;
float jugadorX = 400, jugadorY = 610, speed = 4;
boolean gameOver = false;

ArrayList<Objeto> objetos = new ArrayList<Objeto>();

// =========================================================
void setup()
{
  size(800, 700);
  ellipseMode(RADIUS);
  rectMode(CENTER);
}

void draw()
{
  background(255);
  // cambiar posicion
  jugadorX = jugadorX + speed * direccionX;
  // checar orillas
  if ((jugadorX > width - radius) || (jugadorX < radius))
  {
    direccionX = -direccionX;
  }

  fill(color(224, 24, 22));
  ellipse(jugadorX, jugadorY, radius, radius);
  jugadorX = constrain(jugadorX, 235, 600);

  if(random(1) < 0.01)
  {
    objetos.add(new Objeto());
  }
  
  for(int i =0; i < objetos.size(); i++)
  {
    if(objetos.get(i).y > height)
    {
      objetos.remove(i);
    }
  }

  for (int i = 0; i < objetos.size(); i++)
  {
    if (objetos.get(i).pega())
    {
      fill(255, 0, 0);
      gameOver = true;
    } else {
      fill(255);
    }
    objetos.get(i).dibujar();
    if (!gameOver)
    {
      objetos.get(i).update();
    }
  }

  if (keyPressed)
  {
    if (key == CODED)
    {
      if (keyCode == LEFT)
      {
        direccionX = -1;
        direccionY = 0;
      } else if (keyCode == RIGHT)
      {
        direccionX = 1;
        direccionY = 0;
      }
    }
  }
}


class Objeto
{
  float x;
  float y;
  float ancho = 60;
  float alto = 50;

  Objeto()
  {
    x = random(600);
    y = 1;
    x = constrain(x, 210, 625);
  }

  void dibujar()
  {
    stroke(0);
    rect(x, y, ancho, alto);
  }

  void update()
  {
    if (y > height) y = 0;
    y += 5;
  }

  boolean pega()
  {
    // el fondo
    if ((jugadorX + radius) > (x - ancho / 2) &&
        (jugadorX - radius) < (x + ancho / 2) &&
        (jugadorY - radius) < (y + alto / 2) &&
        (jugadorY + radius) > (y - alto / 2))
        return true;
    
    // los lados
    if ((jugadorY - radius) < (y - alto / 2) &&
        (jugadorY - radius) > (y + alto / 2) &&
        (jugadorY + radius) < (y - alto / 2) &&
        (jugadorY + radius) > (y + alto / 2))
    {
      if (jugadorX < x && (jugadorX + radius) > (x - ancho / 2)) return true; // la izquierda
      if (jugadorX > x && (jugadorX - radius) < (x + ancho / 2)) return true; // la derecha
    }
    
    return false;
  }
}
3 Likes

Muchas gracias, la verdad eso si me ayuda mucho, ya tengo una mejor idea de como hacer la colision.