Steven
Steven

Reputation: 25

How to add friction in pong by using python?

I want to add friction in pong. When the ball hits the paddle and paddle is moving, the ball's speed can be changed and the ball's direction can be also changed. This is my idea. However, I don't know how to specifically do this. I hope my explanation is clear. Here is my code snippet:

def moveDot(surface,center, ball_speed,ball_radius,right_paddle,left_paddle):
size = surface.get_size()
for coord in range(0, 2):
    center[coord] = center[coord] + ball_speed[coord]
    # Left edge or the top edge
    if center[coord] < ball_radius:
        ball_speed[coord] = -ball_speed[coord]
    # Right edge or the bottom edge
    if center[coord] + ball_radius > size[coord]:
        ball_speed[coord] = -ball_speed[coord]
    # Left paddle bounce and go through
    if left_paddle.collidepoint(center) and ball_speed[0] < 0:
        ball_speed[0] = -ball_speed[0]
    # Right paddle bounce and go through
    if right_paddle.collidepoint(center) and ball_speed[0] > 0:
        ball_speed[0] = -ball_speed[0]

Upvotes: 2

Views: 561

Answers (2)

Alexis Clarembeau
Alexis Clarembeau

Reputation: 2964

The original pong game use a system of detection of the collision point. If the ball collides the paddle, it will be moved toward 45° and it will be less if the ball hits the side of the paddle. So, the relation between the input and the output incidence is a function of the collision point (you can choose any function you want such as splitting the paddle in two parts or setting a linear factor).

Here, you can see that the green ray hits the center of the paddle, so, the output angle = the input angle. The blue ray shows output angle > input angle.

enter image description here

However that requires some tweaking for the coefficient between input and output angle depending of the game speed, the size of the paddle, the wanted behaviour, ...

Some other version implement a paddle that can change the reflection angle depending on the speed of the paddle.

If you want a real friction system, you can also use a physic engine and tune the different parameters (drag, ...). But, generally, simple implementations are sufficient and more fun.

I suggest you to try different versions and to choose that one which feels the best for your game.

Upvotes: 1

Kal Zekdor
Kal Zekdor

Reputation: 1224

You'll want to convey some portion of the paddle's velocity to the ball's y velocity, the portion being expressed as a coefficient of friction.

Example:

if left_paddle.collidepoint(center) and ball_speed[0] < 0:
    ball_speed[0] = -ball_speed[0]
    ball_speed[1] += 0.5 * left_paddle.speed

When the ball bounces against the left paddle, half of the paddle's velocity is applied to the ball.

(Note that I'm mentioning velocity, not speed, which has a direction, positive or negative along the respective axis, whereas speed is an absolute scalar. I've used speed in the example, as that fits with the naming you have used, but your implementation is really a velocity; you might want to consider renaming the variables for the sake of consistency.)

Upvotes: 1

Related Questions