I made a border in this pong game, but the paddles can cross it. How do I stop that?

I made a border in this pong game, and the paddles on the screen can cross it. I have done this before in another piece of code, but everything’s different now. I have a main idea of how to do it, you probably need an if statement, but I don’t have everything.

You can delete “pygame.load.image()” because you need the image with the code in a folder, so you can delete it. It will be better because you can try it out on your python

#import modules
import pygame 
pygame.init()
#setting the variables for the window
WIDTH = 750
HEIGHT = 500
#making the window
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pong Game")
#setting the most important variables
dest = (0, 0)
dest2 = (200, 200)
dest3 = (200, 50)
white = (255, 255, 255)
black = (0, 0, 0) 
green = (0, 255, 0)
red = (255, 0, 0)
yellow = (255, 255, 222)
#load the images
image = pygame.image.load("birdupbg.png")
image2 = pygame.image.load("birdup.png")
#making the paddle class
class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([10, 75])
        self.image.fill(yellow)
        self.rect = self.image.get_rect()
        self.points = 0
#making the ball class
class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([10, 10])
        self.image.fill(red)
        self.rect = self.image.get_rect()
        self.speed = 15 
        self.dx = 1
        self.dy = 1
        self.dx2 = 1
        self.dy2 = 1
#making the paddles
paddle1 = Paddle()
paddle1.rect.x = 25
paddle1.rect.y = 100

paddle2 = Paddle()
paddle2.rect.x = 715
paddle2.rect.y = 225


paddle3 = Paddle()
paddle3.rect.x = 715
paddle3.rect.y = 100

paddle4 = Paddle()
paddle4.rect.x = 25
paddle4.rect.y = 225
#paddle speed
paddle_speed = 50

pong = Ball()
pong.rect.x = 375
pong.rect.y = 250

ball = Ball()

all_sprites = pygame.sprite.Group()
all_sprites.add(paddle1, paddle2, paddle3, paddle4, pong)

#drawing the score and the word "pong" 
def redraw():
    win.fill(black)
    win.blit(image, dest)
    pygame.draw.line(win, (255, 255, 255), [0, 200], [900, 200], 10)
    font = pygame.font.SysFont("impact", 40)
    text = font.render("PONG", False, white)
    textRect = text.get_rect()
    textRect.center = (750//2, 25)
    win.blit(text, textRect)


    p1_score = font.render(str(paddle1.points), False, white)
    p1Rect = p1_score.get_rect()
    p1Rect.center = (50, 50)
    win.blit(p1_score, p1Rect)

    p2_score = font.render(str(paddle2.points), False, white)
    p2Rect = p2_score.get_rect()
    p1Rect.center = (700, 50)
    win.blit(p2_score, p1Rect)
    
    all_sprites.draw(win)
    pygame.display.update()
#what happens when the window runs
run = True

while run:
    pygame.time.delay(100)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    #if a certain key is pressed, move something
    key = pygame.key.get_pressed()
    if key[pygame.K_w]:
        paddle1.rect.y += -paddle_speed
    if key[pygame.K_s]:
        paddle1.rect.y +=  paddle_speed
    if key[pygame.K_UP]:
        paddle2.rect.y += -paddle_speed
    if key[pygame.K_DOWN]:
        paddle2.rect.y +=  paddle_speed
    if key[pygame.K_i]:
        paddle3.rect.y += -paddle_speed
    if key[pygame.K_j]:
        paddle3.rect.y += paddle_speed
    if key[pygame.K_1]:
        paddle4.rect.y += -paddle_speed
    if key[pygame.K_2]:
        paddle4.rect.y += paddle_speed
    pong.rect.x += pong.speed * pong.dx
    pong.rect.y += pong.speed * pong.dy
    #scoring system
    if pong.rect.y > 480:
        pong.dy = -1
    if pong.rect.x > 735:
        pong.rect.x, pong.rect.y = 375, 250
        pong.dx = -1
        paddle1.points += 1
        if pong.rect.y < -1:
            pong.dy = 1

    if pong.rect.x < 10:
        pong.rect.x, pong.rect.y = 375, 250
        pong.dx = 1
        paddle2.points += 1

    #if the ball and paddle collide, bounce off it
    if paddle1.rect.colliderect(pong.rect):
        pong.dx = 1
    if paddle2.rect.colliderect(pong.rect):
        pong.dx = -1
    if paddle1.rect.colliderect(pong.rect):
        pong.dx = 1
    if paddle3.rect.colliderect(pong.rect):
        pong.dx = -1
    if paddle4.rect.colliderect(pong.rect):
        pong.dx = 1
    #Call the redraw function
    redraw()  
    #update the window and quit it
    pygame.display.flip()
pygame.quit()

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

PyGame has a feature that does exactly what you want it to do. Use pygame.Rect objects and pygame.Rect.clamp() respectively pygame.Rect.clamp_ip():

Returns a new rectangle that is moved to be completely inside the argument Rect.

With this function, an object can be kept completely in the window. Get the window rectangle with get_rect and clamp the object in the window:

while run:
    # [...]

    key = pygame.key.get_pressed()
    if key[pygame.K_w]:
        paddle1.rect.y += -paddle_speed
    
    # [...]
    
    winRect = win.get_rect()
    paddle1.rect.clamp_ip(winRect)
    paddle2.rect.clamp_ip(winRect)
    paddle3.rect.clamp_ip(winRect)
    paddle4.rect.clamp_ip(winRect)

    # [...]

Method 2

To keep the paddles on the field, add a check in the game loop to block paddle movement when the paddle reaches an edge.

.......
if pong.rect.x < 10:
    pong.rect.x, pong.rect.y = 375, 250
    pong.dx = 1
    paddle2.points += 1

# keep paddles in correct range     # add this section
if paddle1.rect.y < 0 : paddle1.rect.y = 0
if paddle3.rect.y < 0 : paddle3.rect.y = 0
if paddle2.rect.y < 200 : paddle2.rect.y = 200
if paddle4.rect.y < 200 : paddle4.rect.y = 200
if paddle1.rect.y > 200 - 75 : paddle1.rect.y = 200 - 75
if paddle3.rect.y > 200 - 75 : paddle3.rect.y = 200 - 75
if paddle2.rect.y > 500 - 75 : paddle2.rect.y = 500 - 75
if paddle4.rect.y > 500 - 75 : paddle4.rect.y = 500 - 75  

#if the ball and paddle collide, bounce off it
if paddle1.rect.colliderect(pong.rect):
    pong.dx = 1
if paddle2.rect.colliderect(pong.rect):
    pong.dx = -1
.....


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x