Ball on platforms [School project]

Hi !
Sorry if this is a bit random, I’ve never actually asked a question on here and english isn’t my first language but anyway, I have to do this project for school and I did like 85% of it no problem but I still have some issue that I can’t seem to fix.


So this is what it looks like and to give you some context, basically the white rectangles are going up and down and the two rectangles right before the white ones move sideways. The other rectangles don’t move. My goal is to bring the ball on the last rectangle, jumping on the others to get there, kinda like Mario. I got the ball to jump on the first four rectangles and the two moving sideways but I can’t seem to get the ball on the white rectangles, the ball just falls throught everytime I can’t fix the problem…
Help please ?

int x=30, y=520, dy=0, xb1=310, xb2=530, deplacementXB1, deplacementXB2, yb3=460, yb4=300, deplacementYB3, deplacementYB4;
boolean enSaut = false;
boolean go;
boolean right, left, up, down;
int [] t;

void setup() {
  size(1200, 550);
  right = left = up = down = false;
  deplacementXB1 = deplacementXB2 = deplacementYB3 = deplacementYB4 = 1;
  t = new int [width];

  for (int i = 0; i < width; i++) {
    t[i] = 500;
  }

  //facultatif : frameRate est la vitesse du jeu en fps (frames per second), par défaut c'est 60 images par seconde
  frameRate(60);
}

void draw() {
  //décor : ciel bleu et rectangle vert
  background(#D6D3FF);

  fill(0);//rectangle noir
  rect(0, 530, 300, 20);
  rect(300, 530, 300, 20);
  rect(600, 530, 300, 20);
  rect(900, 530, 300, 20);

  //initialise le tab des platformes
  for (int i = 0; i < width; i++) {
    t[i] = 530;
  }


  // plateformes noires
  fill(#000000); // noir
  rect(100, 500, 40, 10);
  rect(150, 470, 40, 10);
  rect(200, 440, 40, 10);
  rect(250, 410, 40, 10);

  //si la plateforme sort de l'intervalle autorisé alors
  // son mouvement change de sens. Donc concrètement :
  // si deplacementXB1 était +1 alors deplacementXB1 devient -1
  // et si deplacementXB1 était -1 alors deplacementXB1 devient +1
  // ... donc dans les 2 cas deplacementXB1  devient  -deplacementXB1
  if (xb1<310 || xb1+60>445 ) {
    deplacementXB1=-deplacementXB1;
  }  
  if (xb2<455 || xb2+60>590) {
    deplacementXB2=-deplacementXB2;
  }


  if (yb3>460 || yb3<300 ) {
    deplacementYB3=-deplacementYB3;
  }  
  if (yb4<300 || yb4>460) {
    deplacementYB4=-deplacementYB4;
  }



  xb1=xb1+deplacementXB1;
  xb2=xb2+deplacementXB2;
  yb3=yb3+deplacementYB3;
  yb4=yb4+deplacementYB4;


  fill(0);
  rect(xb1, 410, 60, 10);
  rect(xb2, 410, 60, 10);
  fill(255);
  rect(620, yb3, 110, 10);
  rect(760, yb4, 110, 10);
  fill(0);
  rect(910, 300, 290, 10);

  for (int i = 100; i <140; i++) t[i] = 500; // platforme noire 1
  for (int i = 150; i <190; i++) t[i] = 470; // platforme noire 2
  for (int i = 200; i <240; i++) t[i] = 440; // platforme noire 3
  for (int i = 250; i <290; i++) t[i] = 410; // platforme noire 4
  for (int i = xb1; i <xb1+60; i++) t[i] = 410; // platforme blanche 1
  for (int i = xb2; i <xb2+60; i++) t[i] = 410; // platforme blanche 2
  /*
  //pour visualiser le tableau t[]
   stroke(255,0,0); strokeWeight(3);
   for (int i = 0 ; i <width; i++) point(i, t[i]);
   stroke(0); strokeWeight(1);
   
   */
  // si la balle est posée sur une plateforme blanche (qui se déplace)
  // alors la balle doit se déplacer avec la plateforme (ou remplacer 410 par t[x])
  if (!enSaut && x>xb1 && x<=xb1+60 && y < 410) {
    x=x + deplacementXB1;
  }
  if (!enSaut && x>xb2 && x<=xb2+60 && y < 410) {
    x=x + deplacementXB2;
  }





  if (!enSaut && y<=yb3-10 && x>620 && x<732) {
    y=yb3;
  }







  if (enSaut) {
    dy = dy + 1; //on diminue la vitesse

    println("avant test : t =", t[x], "| x =", x, "| y = ", y, "| dy = ", dy);

    // En phase ascendante de saut (ie dy<0) : 
    // si le haut de la balle (y-10) est sous le bas d'une plateforme (t[x]+10) et que sa prochaine position (y+dy-10) est au-dessus du bas de plateforme
    // alors on rend dy positif (pour arrêter la montée et donc passer en phase descendante de saut)   
    if (dy<0 && y-10>=t[x]+10 && y+dy-10<t[x]+10) {
      println("Boom la tête .. Fin d'ascension !");
      //dy = 2; //on lui donne une gravité pour qu'elle redescende
      dy = (t[x]+10) - (y-10) +1;
    }

    // En phase descendante de saut (ie dy>0) : 
    else if (dy > 0) {
      //si le bas de la balle (y+10) est dans la zone noire de la plateforme (ie compris entre t[x] et t[x]+10px)
      if ( y+10>=t[x]  && y+10 <= t[x]+10 ) {
        println("Le saut est fini, on replace la balle sur la plateforme.");
        enSaut=false;
        dy=0;
        y=t[x]-10; //on remet la balle sur la plateforme
      } else {
        // idem avec le sol : si le bas de la balle (y+10) est en-dessous ou sur le sol (530 px)
        if ( y+10>=530 ) {
          println("Le saut est fini, on replace la balle sur le SOL.");
          enSaut=false;
          dy=0;
          y=530-10; //on remet la balle sur le sol
        }
      }
    }
  }

  // si la balle se déplace horizontalement dans l'air (en lévitation)
  if (y+10<t[x] && !enSaut) {
    println("pas de lévitation, on descend.");
    enSaut = true;
    dy = 2; //on lui donne une petite gravité pour qu'elle descende
  }


  y = y + dy;

  if (right) { 
    x = x + 2;
  }
  if (left ) { 
    x  = x - 2;
  }





  //Dessin du personnage en (x,y)
  fill(#D11AEA); //couleur fushia
  ellipse(x, y, 20, 20);


  //println("dessin : enSaut",enSaut," | t =",t[x], "| x =", x, "| y = ",y, "| dy = ",dy);

  /*
  //un point rouge sur le haut de la balle
   stroke(255,0,0); strokeWeight(3);
   point(x, y-10);
   stroke(0); strokeWeight(1);
   */
}

void keyPressed() {
  if (key == CODED) {
    //Les touches 'flèche' déplacent le personnage vers la droite/gauche
    if (keyCode == RIGHT) { 
      right = true;
    }
    if (keyCode == LEFT ) { 
      left = true;
    }
  } else {
    //si on appuie sur la touche 'ESPACE' 
    //et qu'on n'est pas déjà en saut alors on démarre un saut
    if (key == ' ' && !enSaut) {
      enSaut = true;
      dy = -13; //grosse impulsion
    }
  }
}

void keyReleased() {
  if (keyCode == RIGHT) { 
    right = false;
  }
  if (keyCode == LEFT ) { 
    left = false;
  }
}

1 Like

Hello,

Welcome to the community!

Please format your code correctly. You can go back and edit it!

Formatting is discussed here:

:slight_smile:

This is what happens if I “cut and paste” code that is not formatted correctly:

It is easier for us to assist if it is formatted correctly.

:slight_smile:

1 Like

I just edited it, it should be good now :slight_smile:

2 Likes

Uhm… might just be me, but i think it‘s always best to use English for coding (be it variable names or also comments), because if you need help it‘s very unlikely that the people that can help speak your language… but that might just be only my opinion…

As for what probably causes your problem (i‘m not sure, since i can only guess what each variable really means without memorizing the whole Code), you probably didn‘t account for the platform to rise and this should slowly push your player up with it.

Great work so far!

I tried to simplify to just the moving rectangle and so far have this:

int x=30, y=520, dy=0, xb1=310, xb2=530, deplacementXB1, deplacementXB2, yb3=500, yb4=300, deplacementYB3, deplacementYB4;
boolean enSaut = false;
boolean go;
boolean right, left, up, down;
int [] t;

void setup() 
  {
  size(1200, 550);
  right = left = up = down = false;
  deplacementXB1 = deplacementXB2 = deplacementYB3 = deplacementYB4 = 1;
  t = new int [width];

  for (int i = 0; i < width; i++) 
    t[i] = 500;
  frameRate(60);
  }

void draw() 
  {
  background(#D6D3FF);

  //initialise le tab des platformes
  for (int i = 0; i < width; i++) 
    t[i] = 530;

  if (yb3>500 || yb3<300 ) 
    deplacementYB3=-deplacementYB3; 

  yb3=yb3+deplacementYB3;
  
  fill(255);
  rect(620, yb3, 110, 10);

  for (int i = xb1; i <xb1+60; i++) t[i] = 500; // platforme blanche 1

  if (!enSaut && y>=yb3-10 && x>620 && x<732) 
    {
    y = yb3;
    println(yb3);
    }

  if (enSaut) 
    {
    dy = dy + 1;

    //println("avant test : t =", t[x], "| x =", x, "| y = ", y, "| dy = ", dy, "yb3", yb3);

    if (dy<0 && y-10>=t[x]+10 && y+dy-10<t[x]+10) 
      {
      println("Boom la tête .. Fin d'ascension !");
      dy = (t[x]+10) - (y-10) +1;
      }

    else if (dy > 0) 
      {
      if ( y+10>=t[x]  && y+10 <= t[x]+10 ) 
        {
        println("Le saut est fini, on replace la balle sur la plateforme.");
        enSaut=false;
        dy=0;
        y=t[x]-10;
        } 
      else 
        {
        if ( y+10>=530 ) 
          {
          println("Le saut est fini, on replace la balle sur le SOL.");
          enSaut=false;
          dy=0;
          y=530-10;
          }
        }
      }
    }

  //// si la balle se déplace horizontalement dans l'air (en lévitation)
  //if (y+10<t[x] && !enSaut) {
  //  println("pas de lévitation, on descend.");
  //  enSaut = true;
  //  dy = 2; //on lui donne une petite gravité pour qu'elle descende
  //}  

  y = y + dy;

  if (right) 
    { 
    x = x + 2;
    }
  if (left ) 
    { 
    x  = x - 2;
    }

  fill(#D11AEA); //couleur fushia
  ellipse(x, y, 20, 20);
  line(0, height-20, width, height-20);
  }

void keyPressed() {
  if (key == CODED) {
    //Les touches 'flèche' déplacent le personnage vers la droite/gauche
    if (keyCode == RIGHT) { 
      right = true;
    }
    if (keyCode == LEFT ) { 
      left = true;
    }
  } else {
    //si on appuie sur la touche 'ESPACE' 
    //et qu'on n'est pas déjà en saut alors on démarre un saut
    if (key == ' ' && !enSaut) {
      enSaut = true;
      dy = -13; //grosse impulsion
    }
  }
}

void keyReleased() {
  if (keyCode == RIGHT) { 
    right = false;
  }
  if (keyCode == LEFT ) { 
    left = false;
  }
}

I will leave the rest with you!

:slight_smile:

1 Like