Holding the ball in pong

the w and s keys in keypreessed?

1 Like

Yesssssssssssssssssss

why not put it there!!!

Also as I said, not xpos but ypos

for questions post your entire code

it worked

  int size = 20;    
  float xpos, ypos;    
  float xspeed = random(5, 6);
  float yspeed = random(0.6, 4);
  
  float fehler1=0;
  float fehler2=0;
  
  float playerpos1;
  float p1x;
  float playerpos2;
  float p2x;
  
  String tela;
  
  boolean trocou;
  
  int scoreE = 0;
  int scoreD = 0;
  int scoreW = 10;
  
  boolean hold=false;
  boolean attachedToPaddle=false;
  boolean move = true;
  
  float easing = 0.05;
  
  void setup() {
    size(640, 400);
    noStroke();
    tela = "MENU";
    frameRate(30);
    smooth();
    playerpos1 =height/2;
    playerpos2 =height/2;
    xpos = 45;
    ypos = playerpos1;
    p1x = 10;
    p2x = width-30;
  }
  
  void draw() {
  
    switch (tela) {
  
      // ------------------------------------
    case "GAME":
  
      background(277);
  
      if (hold && attachedToPaddle)
      {
        // ignore
      } else 
      {
        xspeed *= 1.001;
  
        xpos += xspeed;
        ypos += yspeed;
      }
  
      scores();
      hold();
  
      if (ypos > height-size/2 || ypos < 0+size/2) {
        yspeed *= -1;
      }
  
      if ( xpos <= 30+size/2) {
        if (ypos > playerpos1-50 && ypos < playerpos1+50) {
          if ( ! (hold && attachedToPaddle)) {
            xspeed *= -1;
            yspeed += (ypos-playerpos1)/5;
          }
          attachedToPaddle=true;
        }
      } else {
        attachedToPaddle=false;
      }
  
  
      if (xpos <= 0) {
        fehler1 += 1;
        if (fehler1 <= 4) {
          xpos = 50;
          ypos = playerpos1;
          xspeed = random(5, 6);
          xspeed *= -1;
          yspeed = 0; 
          println("player 2: "+ str(fehler2)+":"+str(fehler1) );
        }
        if (fehler1 ==5) {
          println("player 2 win 5:"+ str(fehler2));
        }
      }
  
      if ( xpos >= width-30-size/2) {
        if (ypos > playerpos2-50 && ypos < playerpos2+50) {
          xspeed *= -1;
          yspeed += (ypos-playerpos2)/5;
        }
      }
      if (xpos >= width) {
        fehler2 +=1 ;
        if (fehler2 <= 4) {
          xpos = width-50;
          ypos = playerpos2;
          xspeed = -random(5, 6);
          xspeed *= -1;
          yspeed = 0; 
          println("ponto: "+ str(fehler2)+":"+str(fehler1) );
        }
        if (fehler2 ==5) {
          println("player 1 ganhou 5:"+ str(fehler1));
        }
      }
  
      ellipse(xpos, ypos, size, size);
      rect (p1x, playerpos1-50, 20, 100);
      rect (p2x, playerpos2-50, 20, 100);
  
      text(str(hold), 333, 33);
  
      break; 
  
      // ------------------------------------
    case "MENU":
      menu();
      break;
  
      // ------------------------------------
    case "TUTORIAL":
      tutorial();
      break;
  
    }
  }
  
  void menu() {
    background(255, 0, 0);
    fill(0, 0, 0); 
    text ("MENU", 
      111, 111);
  }
  
  // --------------------------------------------------------------------------
  
  void keyPressed() {
  
  
    if (key == 'w') {
      if (playerpos1 >=50)
        playerpos1 = playerpos1 - 8;
    }
    if (key == 's') {
      if (playerpos1 <=height-50)
        playerpos1 = playerpos1 + 8;
    }
    if (key =='a') { 
      p1x = -8;
    }
    if (key == 'd') {
      p1x = +8;
    }
    if (hold && attachedToPaddle){
     ypos = playerpos1+8; 
    }
  
    // -------------------
  
    if (key == '7')
    {
      if (playerpos2 >=50)
        playerpos2 = playerpos2 - 8;
    }
    if (key == '1') {
      if (playerpos2 <=height-50)
        playerpos2 = playerpos2 + 8;
    }
    /*if (key == '3') {
     xspeed = 0;
     yspeed = 0;
     move = false;
     }
     */
    if (key == ' ') {
      hold = ! hold;
    }
  
    if (key == ESC) {
      tela="MENU";
      key=0;
    }
  }
  
  void keyReleased() {
    //hold = false;
    //attachedToPaddle=false;
  }
  
  void mousePressed() {
  
    switch (tela) {
  
      // ------------------------------------
    case "GAME":
      break; 
  
      // ------------------------------------
    case "MENU":
      tela="GAME"; 
      break;
  
      // ------------------------------------
    case "TUTORIAL":
      tela="tutorial";
      break;
    }
  }
  
  // --------------------------------------------------------------------------
  
  void tutorial() {
    background(277);
    xspeed *= 1.001;
    xpos += xspeed;
    ypos += yspeed;
    scores();
    tela = "menu";  
    background(0, 255, 0);
    trocou = true;
  }
  
  
  void scores() {
    fill(255);
    text(scoreE, 100, 50);
    text(scoreD, width-100, 50);
    if (xpos >640) {
      scoreE += 1;
      xspeed = xspeed*2;
      yspeed = yspeed*2;
    }
    if (xpos < 0 ) {
      scoreD += 1;
      xspeed = xspeed*1.5;
      yspeed = yspeed*1.5;
    }
  }
  
  void AI() {
    playerpos2 = xpos * easing;
  }
  
  void hold() {
    if (hold) {
      if (xpos == playerpos1) {
        xpos=xpos-8;
        //      xspeed = 0;
      }
    }
  }
  //

now the last thing i need help on is switching on an ai that i made for the game

that’s how would do it

  if (key == 'w') {
    if (playerpos1 >=50) {
      playerpos1 = playerpos1 - 8;
      if (hold && attachedToPaddle) {
        ypos = ypos-8;
      }
    }
  }

same for s of course

ALSO

in draw()

use this

    if (xpos <= 0) {
      attachedToPaddle=false;
      fehler1 += 1;
      if (fehler1 <= 4) {

otherwise you hold when ball passes the paddly by

just call AI() from draw() in the right section of switch()

ok i’ll give it a try

how can i turn the AI() on and off?

In the screen menu You could have a text() hit space bar to switch AI on / off (and have a global boolean AIisOn and display its value here)

And then evaluate space bar in keyPressed
and change AIisOn accordingly

In draw() call AI() only when AIisOn: if(AIisOn) {AI();}

1 Like

actually im gonna put a image over it

please don’t write so short…

where do you put which image over what please?

over the switch case like in tutorial() , a credits funcion im writing and a menu(), all inside a data folder inside the program file

1 Like

You can have a button like a checkbox or 2 radio buttons that you can click with the mouse to set AIisOn

2 radio buttons

  • [ ] Game of two players
  • [X] Game of one player against the computer

using keys sounds easier to program rather then drawing boxes and progaming their collision.

good luck!

Seriously, the switch in draw() is your friend.

When you use images, show them in tutorial and in menu but not in draw

ok thanks so much for the help in the code man.

1 Like

You are welcome!

Come back when you have more questions!

1 Like

hey i got a bug, when the player wins when the ai is on the score keeps increasing

  int size = 20;    
  float xpos, ypos;    
  float xspeed = random(5, 6);
  float yspeed = random(0.6, 4);
  
  float fehler1=0;
  float fehler2=0;
  
  float playerpos1;
  float p1x;
  float playerpos2;
  float p2x;
  
  String tela;
  
  boolean trocou;
  
  int scoreE = 0;
  int scoreD = 0;
  int scoreW = 10;
  
  boolean hold=false;
  boolean attachedToPaddle=false;
  boolean move = true;
  
  float easing = 0.50;
  
  boolean AIon = false;

  
  void setup() {
    size(640, 400);
    noStroke();
    tela = "MENU";
    frameRate(30);
    smooth();
    playerpos1 =height/2;
    playerpos2 =height/2;
    xpos = 45;
    ypos = playerpos1;
    p1x = 10;
    p2x = width-30;
  }
  
  void draw() {
  
    switch (tela) {
      // ------------------------------------
    case "GAME":
  
      background(277);
  
      if (hold && attachedToPaddle)
      {
        // ignore
      } else 
      {
        xspeed *= 1.001;
  
        xpos += xspeed;
        ypos += yspeed;
      }
  
      scores();
      hold();
      if(AIon == true){
       AI(); 
      }
  
      if (ypos > height-size/2 || ypos < 0+size/2) {
        yspeed *= -1;
      }
  
      if ( xpos <= 30+size/2) {
        if (ypos > playerpos1-50 && ypos < playerpos1+50) {
          if ( ! (hold && attachedToPaddle)) {
            xspeed *= -1;
            yspeed += (ypos-playerpos1)/5;
          }
          attachedToPaddle=true;
        }
      } else {
        attachedToPaddle=false;
      }
  
  
      if (xpos <= 0) {
        fehler1 += 1;
        if (fehler1 <= 4) {
          xpos = 50;
          ypos = playerpos1;
          xspeed = random(5, 6);
          xspeed *= -1;
          yspeed = 0; 
          println("player 2: "+ str(fehler2)+":"+str(fehler1) );
        }
        if (fehler1 ==5) {
          println("player 2 win 5:"+ str(fehler2));
        }
      }
  
      if ( xpos >= width-30-size/2) {
        if (ypos > playerpos2-50 && ypos < playerpos2+50) {
          xspeed *= -1;
          yspeed += (ypos-playerpos2)/5;
        }
      }
      if (xpos >= width) {
        fehler2 +=1 ;
        if (fehler2 <= 4) {
          xpos = width-50;
          ypos = playerpos2;
          xspeed = -random(5, 6);
          xspeed *= -1;
          yspeed = 0; 
          println("ponto: "+ str(fehler2)+":"+str(fehler1) );
          text(height/2, width/2, 50, 50);
        }
        if (fehler2 ==5) {
          println("player 1 ganhou 5:"+ str(fehler1));
        }
      }
  
      ellipse(xpos, ypos, size, size);
      rect (p1x, playerpos1-50, 20, 100);
      rect (p2x, playerpos2-50, 20, 100);
  
      break; 
  
      // ------------------------------------
    case "MENU":
      menu();
      break;
  
      // ------------------------------------
    case "TUTORIAL":
      tutorial();
      break;
      
      case"cred":
      cred();
      break;
  
    }
    if (xpos <= 0) {
      attachedToPaddle=false;
      fehler1 += 1;
      if (fehler1 <= 4) {
      }
    }
  }
  
  void menu() {
    background(255, 0, 0);
    fill(0, 0, 0); 
    text ("MENU", 
      111, 111);
  }
  
  // --------------------------------------------------------------------------
  
  void keyPressed() {
  
  
    if (key == 'e') {
      if (playerpos1 >=50)
        playerpos1 = playerpos1 - 8;
    }
    if (key == 'd') {
      if (playerpos1 <=height-50)
        playerpos1 = playerpos1 + 8;
    }
    if (hold && attachedToPaddle){
     ypos = playerpos1+8; 
    }
  
    // -------------------
  
    if (key == '9')
    {
      if (playerpos2 >=50)
        playerpos2 = playerpos2 - 8;
    }
    if (key == '3') {
      if (playerpos2 <=height-50)
        playerpos2 = playerpos2 + 8;
    }
    /*if (key == '3') {
     xspeed = 0;
     yspeed = 0;
     move = false;
     }
     */
    if (key == ' ') {
      hold = ! hold;
    }
  
    if (key == ESC) {
      tela="MENU";
      key=0;
    }
    
    if (key == 'a'){
     AIon = true; 
    }
    
    if (key == 67){
     tela="cred";
    }
  }
  
  void keyReleased() {
    //hold = false;
    //attachedToPaddle=false;
  }
  
  void mousePressed() {
  
    switch (tela) {
  
      // ------------------------------------
    case "GAME":
      break; 
  
      // ------------------------------------
    case "MENU":
      tela="GAME"; 
      break;
  
      // ------------------------------------
    case "TUTORIAL":
      tela="tutorial";
      break;
    }
  }
  
  // --------------------------------------------------------------------------
  
  void tutorial() {
    background(277);
    xspeed *= 1.001;
    xpos += xspeed;
    ypos += yspeed;
    scores();
    tela = "menu";  
    background(0, 255, 0);
    trocou = true;
  }
  
  
  void scores() {
    fill(255);
    text(scoreE, 100, 50);
    text(scoreD, width-100, 50);
    if (xpos >640) {
      scoreE += 1;
      xspeed = xspeed*2;
      yspeed = yspeed*2;
    }
    if (xpos < 0 ) {
      scoreD += 1;
      xspeed = xspeed+1.5;
      yspeed = yspeed+1.5;
    }
  }
  
  void AI() {
    playerpos2 = xpos * easing+10;
    
    if(fehler1==5){
      AIon = false;
    }
    
    if(fehler2 == 5){
     AIon = false; 
    }
  }
  
  void hold() {
    if (hold) {
      if (xpos == playerpos1) {
        xpos=xpos-8;
        //      xspeed = 0;
      }
    }
  }
  
  void cred(){
   background(150,150,0); 
  }
  //

Which function is responsible for the score?