# Can you help me fix problem in the code

<> please format code with </> button * homework policy * asking questions
When my ball goes to the top of the rect, It will be put in the center rect. However, I want it bouncing. I don’t know how to fix it. Someone can help me fix it. Thank you.

float ballX;
float ballY;
float ballSpeedX = 4;
float ballSpeedY = 4;
float ballDia = 20.0;
float ballR = ballDia/2;

void setup() {
size(800, 600);
ballX= random(10, 370);
ballY= random(10, 570);
}

void draw() {
background(0);

// Draw the wall
fill(255);
noStroke();
rect(390, 300, 20, 300);

// Color of the ball changes gradually and continuously as it moves
fill(ballX,ballY,ballX%ballY);

// Draw the ball
ellipse(ballX, ballY, ballDia, ballDia);

// Update ball location
ballX=ballX+ballSpeedX;
ballY=ballY+ballSpeedY;

// If ball hit the right or left change direction of X
if (ballX> width- ballR || ballX < ballR) {
ballSpeedX=ballSpeedX*-1;
}

// If ball hit top or bottom change direction of Y
if (ballY> height-ballR || ballY < ballR) {
ballSpeedY=ballSpeedY*-1;
}
// Setup variable to true if shapes are over lapping, false if not
boolean collision = hitWall(390, 300, 20, 300, ballX, ballY, ballR);

// Change ball direction when ball hit
//and bump it back
if (collision ==true) {
ballSpeedX=ballSpeedX*-1;
ballX +=ballSpeedX;
}
}
boolean hitWall(int rx, int ry, int rw, int rh,
float cx, float cy, float cr) {

float circleDistanceX= abs(cx - rx - rw/2);
float circleDistanceY= abs(cy - ry - rh/2);

if (circleDistanceX > (rw/2 + cr)) {
return false;
}
if (circleDistanceY > (rh/2 + cr)) {
return false;
}
if (circleDistanceX <= rw/2) {
return true;
}
if (circleDistanceY <= rh/2) {
return true;
}

float cornerDistance = pow(circleDistanceX - rw/2, 2) +
pow(circleDistanceY - rh/2, 2);
if (cornerDistance <=pow(cr, 2)) {
return true;
} else {
return false;
}
}

I got rid of the random and these values show exactly what you mean

``````float ballX=399-24*4;
float ballY=300-24*4;

float ballSpeedX = 4;
float ballSpeedY = 4;

float ballDia = 20.0;
float ballR = ballDia/2;

void setup() {
size(800, 600);
//ballX= random(10, 370);
//ballY= random(10, 570);
}

void draw() {
background(0);

// Draw the wall
fill(255);
noStroke();
rect(390, 300,
20, 300);

// Color of the ball changes gradually and continuously as it moves
fill(ballX, ballY, ballX%ballY);

// Draw the ball
ellipse(ballX, ballY, ballDia, ballDia);

// Update ball location
ballX=ballX+ballSpeedX;
ballY=ballY+ballSpeedY;

// If ball hit the right or left change direction of X
if (ballX> width- ballR || ballX < ballR) {
ballSpeedX=ballSpeedX*-1;
}

// If ball hit top or bottom change direction of Y
if (ballY> height-ballR || ballY < ballR) {
ballSpeedY=ballSpeedY*-1;
}
// Setup variable to true if shapes are over lapping, false if not
boolean collision = hitWall(390, 300, 20, 300,
ballX, ballY, ballR);

// Change ball direction when ball hit
//and bump it back
if (collision ==true) {
ballSpeedX=ballSpeedX*-1;
ballX +=ballSpeedX;
}
}
boolean hitWall(int rx, int ry, int rw, int rh,
float cx, float cy, float cr) {

float circleDistanceX= abs(cx - rx - rw/2);
float circleDistanceY= abs(cy - ry - rh/2);

if (circleDistanceX > (rw/2 + cr)) {
return false;
}
if (circleDistanceY > (rh/2 + cr)) {
return false;
}
if (circleDistanceX <= rw/2) {
return true;
}
if (circleDistanceY <= rh/2) {
return true;
}

float cornerDistance = pow(circleDistanceX - rw/2, 2) +
pow(circleDistanceY - rh/2, 2);
if (cornerDistance <=pow(cr, 2)) {
return true;
} else {
return false;
}
}

``````
1 Like

That is the reason I need your help. I think it had happened in the collision when it was true. I need to add more. However, I don’t know. I am a newbie. My skill is weak in the loop and boolean. I hope you understand

1 Like
1 Like

thank you so much. I get it   ``````if ( ballX + ballSpeedX > 390 - ballR &&
ballX +ballSpeedX < 410+ballR &&
ballY >300-ballR &&
ballY< 300+300) {
ballSpeedX=ballSpeedX*-1-1;
}

// If ball hit the right or left change direction of X
else if (ballX> width- ballR || ballX < ballR) {
ballSpeedX=ballSpeedX*-1;
}
else
ballSpeedX = ballSpeedX +0.01;

if (ballX > 390-ballR &&
ballX < 410+ballR &&
ballY + ballSpeedY > 300 - ballR &&
ballY + ballSpeedY < 300 + 300) {
ballSpeedY=ballSpeedY*-1;
}

// If ball hit top or bottom change direction of Y
else if (ballY> height-ballR || ballY < ballR) {
ballSpeedY=ballSpeedY*-1;
}
else
ballSpeedY = ballSpeedY+0.015;
``````
1 Like