首页 > 解决方案 > Pygame Paddle 与类的碰撞

问题描述

所以我目前正在使用 Pygame 进行 Ping,我只是不知道应该如何与桨发生碰撞。我有一个没有课程的乒乓球比赛,我是这样做的

if paddle.colliderect(ecl):
    bewegungx = abs(bewegungx) 

在这种情况下,ecl 是球,这是我的课程。我目前只有一个桨,因为我想先弄清楚碰撞,然后再做剩下的。

先感谢您 :)

import pygame

white = (255, 255, 255)
black = (0, 0, 0)
WIDTH = 400
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
FPS = 60
clock = pygame.time.Clock()


class Ball():
    def __init__(self):
        self.ball_w = 30
        self.ball_h = 30
        self.ball_x = 100
        self.ball_y = 150

        self.ball_speedx = 3
        self.ball_speedy = 3

        self.ball_draw = pygame.Rect(self.ball_x, self.ball_y, self.ball_w, self.ball_h)

    def draw(self):
        pygame.draw.rect(screen, white, self.ball_draw)

    def move(self):
        self.ball_x += self.ball_speedx
        self.ball_y += self.ball_speedy
        self.ball_draw.topleft = (self.ball_x, self.ball_y)

    def wall_collision(self):
        if self.ball_draw.top <=0:
            self.ball_speedy = self.ball_speedy *-1
        if self.ball_draw.right >= WIDTH:
            self.ball_speedx = self.ball_speedx *-1
        if self.ball_draw.left <=0:
            self.ball_speedx = self.ball_speedx *-1
        if self.ball_draw.bottom >= HEIGHT:
            self.ball_speedy = self.ball_speedy *-1




class Paddle():
    def __init__(self):
        self.paddle_w = 30
        self.paddle_h = 130
        self.paddle_x = 10
        self.paddle_y = 150
        self.paddle_speed = 0
        self.paddle_left = pygame.Rect(self.paddle_x, self.paddle_y, self.paddle_w, self.paddle_h)

    def draw(self):

        pygame.draw.rect(screen, white, self.paddle_left)

    def move(self):
        key = pygame.key.get_pressed()

        if key[pygame.K_w] and self.paddle_left.top > 0:
            self.paddle_left.y -=7

        if key[pygame.K_s] and self.paddle_left.bottom < 600:
            self.paddle_left.y += 7







ball = Ball()
paddle = Paddle()



while True:

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             pygame.quit()

    screen.fill(black)

    #Ball Functionsw
    ball.draw()
    ball.move()
    ball.wall_collision()


    #Paddle Functions
    paddle.draw()
    paddle.move()



    pygame.display.flip()
    clock.tick(FPS)

标签: pythonpygame

解决方案


当球击中桨时,球的方向会改变。paddle_left_collision在类中添加一个方法Ball

class Ball():
    # [...]

    def paddle_left_collision(self, paddle_rect):
        if self.ball_draw.colliderect(paddle_rect):
            self.ball_speedx = abs(self.ball_speedx)

在应用程序循环中调用它

while True:

    # handle events
    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             pygame.quit()

    # move objects and detect collisisons
    ball.move()
    paddle.move()
    ball.wall_collision()
    ball.paddle_left_collision(paddle.paddle_left)

    # draw scene
    screen.fill(black)
    ball.draw()
    paddle.draw()
    pygame.display.flip()

    clock.tick(FPS)

请注意,如果您有两个桨,请按如下方式更改方法:

def paddles_collision(self, paddle_left_rect, paddle_right_rect):
    if self.ball_draw.colliderect(paddle_left_rect):
        self.ball_speedx = abs(self.ball_speedx)
    if self.ball_draw.colliderect(paddle_right_rect):
            self.ball_speedx = -abs(self.ball_speedx)

另请参阅如何在 pygame 中检测碰撞?有时在乒乓球比赛中球不会从球拍上反弹


推荐阅读