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