Holding the ball in pong

ok but now i got a bug on it the ball flies back to the paddle and doesnt return

Search for the error and fix it

show your code to get help

here

int size = 20;    
float xpos, ypos;    
float xspeed = random(5, 6);
float yspeed = random(0, 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 move = true;
float easing = 0.05;
boolean attachpaddle = 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;
  hold();
}

void draw()
{
  background(277);
  scores();

  if (hold && attachpaddle)
  {
    // ignore
  } else 
  {
    xspeed *= 1.001;

    xpos += xspeed;
    ypos += yspeed;
  }

  

  if (ypos > height-size/2 || ypos < 0+size/2) {
    yspeed *= -1;
    hold = true;
  }

  if ( xpos <= 30+size/2) {
    if (ypos > playerpos1-50 && ypos < playerpos1+50) {
      xspeed *= -1;
      yspeed += (ypos-playerpos1)/5;
    }
  }
  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 ==100) {
      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 ==100) {
      println("player 1 ganhou 5:"+ str(fehler1));
    }
  }

  if ( xpos <= 30+size/2) {
    if (ypos > playerpos1-50 && ypos < playerpos1+50) {
      if ( ! (hold && attachpaddle)) {
        xspeed *= -1;
        yspeed += (ypos-playerpos1)/5;
      }
      attachpaddle=true;
    }
  } else {
    attachpaddle=false;
  }

  ellipse(xpos, ypos, size, size);
  rect (p1x, playerpos1-50, 20, 100);
  rect (p2x, playerpos2-50, 20, 100);
}

void menu() {
  background(255, 0, 0);
}

void keyPressed() {
  if (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 (keyPressed) {
    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;
    }
  }
}




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*1.5;
    yspeed = yspeed*1.5;
  }
  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) {
      xspeed = 0;
    }
  }
}
int size = 20;    
float xpos, ypos;    
float xspeed = random(5, 6);
float yspeed = random(0, 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()
{
  background(277);

  if (hold && attachedToPaddle)
  {
    // ignore
  } else 
  {
    xspeed *= 1.001;

    xpos += xspeed;
    ypos += yspeed;
  }

  scores();
  hold();

  switch (tela) {
  case "MENU":
    menu();
    break;
  case "TUTORIAL":
    tutorial();
    break;
  }

  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);
}

void menu() {
  background(255, 0, 0);
}

// --------------------------------------------------------------------------

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 (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;
  }
}

void keyReleased() {
  //hold = false;
  //attachedToPaddle=false;
}

// --------------------------------------------------------------------------

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*1.5;
    yspeed = yspeed*1.5;
  }
  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) {
      //      xspeed = 0;
    }
  }
}
//

It works. Thanks man you’re a saint, was having a lot of trouble with that code.

2 Likes

you can still make it so, when the ball is attached to the paddle and the paddle is moved, the ball would move together with the paddle

1 Like

i’ll give it a try, all thats left is make it work to the other paddle.

1 Like

and a way to turn off the game and make a title screen instructions and credits

1 Like

I was commenting on menu already (it’s the tela variable)

in this sketch:

click mouse in menu and click ESC during game

(similar to function menu() put the game stuff from draw into a new function playGame(), so your draw() is nice and lean)


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 ("MENUE", 
    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 (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":
    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*1.5;
    yspeed = yspeed*1.5;
  }
  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) {
      //      xspeed = 0;
    }
  }
}
//
1 Like

thanks, any problem i got i’ll come back to you

2 Likes

oh and quick question how do i make the ball follow the paddle when attached

1 Like

In keypressed when it’s attached just add to the ball like you do with the ball

1 Like

so xpos = player1pos?

1 Like

xpos=xpos-8;

I think

1 Like

i put it in the ’ ’ keycode under the hold = !hold?

1 Like

i think the ball not following the padle is a blessing in disguise

1 Like

our goal here is:

ball is already attached

we move the paddle

ball moves with the paddle

which keys are involved?

1 Like

No. Or as you like it.

when the attached ball is moving with paddle it looks better.

And you can decide where you throw the ball by moving the ball prior to sending it again

1 Like

i had an idea
scrap right paddle holding the ball make it so only the left one holds and and put a breakout like like behind the right paddle making it a mix between pong and breakout.

1 Like

the left paddle is an attacker while the right one is a defender

1 Like