I'm making a simple Pong game with Python and Pygame, you can get it here. So far I've got a ball which moves around and bounces off the walls of the screen and a paddle which stays within the screen. I've also (sort of) made the ball bounce off of the paddle too - if the ball hits the left or right side of the paddle, it will change direction correctly. However, if the ball hits the top or bottom side of the paddle, it "phases" through the paddle and goes somewhere else entirely, which is not what I want. How can I remove this behavior? Thank you in advance for your replies!
import pygame
from math import sin, cos, radians
screen_width = 960
screen_height = 540
fps = 60
white = (255, 255, 255)
black = (0, 0, 0)
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((screen_width, screen_height))
class Ball(pygame.sprite.Sprite):
def __init__(self, speed, angle):
groups = [all_sprites]
pygame.sprite.Sprite.__init__(self, groups)
self.speed = speed
self.angle = angle
self.size = 20
self.colour = white
self.image = pygame.Surface((self.size, self.size))
self.image.fill(self.colour)
self.rect = self.image.get_rect()
self.rect.x = int(screen_width / 2) - int(self.size / 2)
self.rect.y = int(screen_height / 2) - int(self.size / 2)
def update(self):
self.dx = int(self.speed * sin(radians(self.angle)))
self.dy = int(self.speed * cos(radians(self.angle)))
self.rect.x += self.dx
self.rect.y += self.dy
if self.rect.x >= screen_width - self.size or self.rect.x <= 0:
self.angle = 360 - self.angle
if self.rect.y >= screen_height - self.size or self.rect.y <= 0:
self.angle = 180 - self.angle
class Paddle(pygame.sprite.Sprite):
def __init__(self):
groups = [all_sprites, paddles]
pygame.sprite.Sprite.__init__(self, groups)
self.keys = [pygame.K_UP, pygame.K_DOWN]
self.size = (20, 80)
self.colour = white
self.image = pygame.Surface(self.size)
self.image.fill(self.colour)
self.rect = self.image.get_rect()
self.rect.x = 20
self.rect.y = int(screen_height / 2) - int(self.size[1] / 2)
def update(self):
self.dy = 0
keystates = pygame.key.get_pressed()
if keystates[self.keys[0]]:
self.dy = -10
if keystates[self.keys[1]]:
self.dy = 10
self.rect.y += self.dy
if self.rect.y >= screen_height - self.size[1]:
self.rect.y = screen_height - self.size[1]
if self.rect.y <= 0:
self.rect.y = 0
all_sprites = pygame.sprite.Group()
paddles = pygame.sprite.Group()
ball = Ball(10, 45)
paddle = Paddle()
running = True
while running:
clock.tick(fps)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
all_sprites.update()
for paddle in paddles:
if pygame.sprite.collide_rect(paddle, ball):
ball.angle = 360 - ball.angle
screen.fill(black)
all_sprites.draw(screen)
pygame.display.flip()
pygame.quit()