Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I'm making my first game in, Pong, and I'm trying to make the ball's Y increase or decrease, depending on where it impacts the paddle. After implementing the code below, the ball only goes down, but not up. What could the problem be?

if(paddle.detectCollison(ball)){
    //30px on either side of the actual center of the paddle is considered the center
    if((ball.getY() > ((paddle.getH() / 2) + 30)))
        ball.setY(ball.getY() + 10);
    else if ((ball.getY() < ((paddle.getH() /2) - 30)))
        ball.setY(ball.getY() - 10);
    ball.setDX(-(ball.getDX()));
}
share|improve this question
1  
You have too many magic constants. Start factoring out your numbers (eg. 30, 10) into variables so they make sense. It's hard to tell what exactly is going on. Also, wrap the if statements in brackets, eg. if (...) { ... } –  ashes999 Feb 20 '12 at 17:30
    
I have made pong game with your desired effect, see github.com/matejkramny/Pong/blob/master/src/pong/Ball.java starting on line 22 –  matejkramny Oct 6 '12 at 14:30

2 Answers 2

up vote 3 down vote accepted

I think the center calculation is off as its not taking into account the position of the paddle at all.

Shouldn't it be something like (posY + (height / 2) +/- fudgeFactor) or the like?

Depending on where 0,0 is on the y axis this could cause one of the if's to always return true as it is comparing against a location based off of the paddle always being at the 0 y location.

share|improve this answer

Your ball should have direction vector (i,j). Your pad can have vector field. Let's say your pads are vertical (since you haven't mentioned are they vert or horiz).

Vector field for a pad should be something like:
for the upper corner: (0, 1) 1 is y-up
for middle of pad: (1, 0)
for bottom corner: (0, -1)

everything in between are interpolated values. (these values can be easily calculated when needed using with/height etc).

Next thing you do, is do addition of vector from vector field and ball direction field (but you need to * -1 i value of dir vector because ball changes X direction).

So if input (ball direction) vector is (-1, -1) that is 225 degrees, and ball hits almost to bottom corner on left pad vector from vector field would be (0.1, -0.9). Invert ball dir vect i value and perform addition; that is (1, -1) + (0.1, -0.9) and resulting vector is (1.1, -1.9), and you can convert this to angles and work your way from there. Also good thing would be to normalize this vector before giving it to ball.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.