python - 如何在 Pygame 中设置 Pong 的碰撞检测

标签 python pygame collision-detection pong

我正在 Pygame 中构建一个 Pong 克隆。我不知道如何为球和桨添加碰撞检测,以便球会从桨上弹开。我怎样才能做到这一点?如何让球击中 Racket 时朝相反方向运动?

bif="bg.jpg"

import pygame, sys
from pygame.locals import *

pygame.init()
pygame.display.set_caption("Griffin West's Python Pong")
pygame.mixer.init()
sounda= pygame.mixer.Sound("Music.wav")

sounda.play()

screen=pygame.display.set_mode((1280,720),0,32)
background=pygame.image.load(bif).convert()

color1=(255,255,255)
color2=(255,255,0)
color3=(0,0,255)
color4=(0,255,0)
pos1=(640,0)
pos2=(640,720)
pos3=(640,360)
pos4=(0,360)
pos5=(1280,360)
radius=(100)
x1,y1=75,0
x2,y2=1175,0
x3,y3=1,1
clock=pygame.time.Clock()
speedx=750
speedy=750
movex1, movey1=0,0
movex2, movey2=0,0
s1=0
s2=0


while True:


    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_w:
                movey1=-2
            elif event.key==K_s:
                movey1=+2
            if event.key==K_UP:
                movey2=-2
            elif event.key==K_DOWN:
                movey2=+2
        if event.type==KEYUP:
            if event.key==K_w:
                movey1=0
            elif event.key==K_s:
                movey1=0
            if event.key==K_UP:
                movey2=0
            elif event.key==K_DOWN:
                movey2=0

    x1+=movex1
    y1+=movey1
    x2+=movex2
    y2+=movey2


    milli=clock.tick()
    seconds=milli/1000.0
    dx=seconds*speedx
    dy=seconds*speedy
    x3+=dx
    y3+=dy

    if x3>1280: 
        x3+=-dx  # get ball out of the wall
        speedx = -speedx  # change direction
        s1=s1+1
    if y3>720:
        y3+=-dy
        speedy = -speedy
    if x3<0:
        x3+dx
        speedx = -speedx
        x3=x3+1
        s2=s2+1
    if y3<0:
        y3=y3+1
        y3+=dy
        speedy = -speedy
    if x3<=y3y3+30:
        speedx = -speedy


    screen.blit(background, (0,0))

    screen.lock()
    pygame.draw.line(screen, color1, pos1, pos2, 1)
    pygame.draw.circle(screen, color1, pos3, radius, 1)
    pygame.draw.circle(screen, color1, pos4, radius, 1)
    pygame.draw.circle(screen, color1, pos5, radius, 1)
    pygame.draw.rect(screen, color3, Rect((x1,y1),(30,100)))
    pygame.draw.rect(screen, color2, Rect((x2,y2),(30,100)))
    pygame.draw.circle(screen, color4, (int(x3),int(y3)), 15)

    screen.unlock()
    myfont = pygame.font.SysFont("Press Start 2P", 50)
    myfont2 = pygame.font.SysFont("Press Start 2P", 25)
    label = myfont.render("Python", 1, (255,0,0))
    screen.blit(label, (494, 115))
    label = myfont.render("Pong", 1, (255,0,0))
    screen.blit(label, (544, 175))
    label = myfont2.render("Player 1: "+str(s1), 1, (255,255,255))
    screen.blit(label, (25, 675))
    label = myfont2.render("Player 2: "+str(s2), 1, (255,255,255))
    screen.blit(label, (950, 675))
    pygame.display.update()

最佳答案

This answer有一个包含碰撞检测的 pong 实现示例。具体来说,您可能对下面列出的代码中的 bounce 方法感兴趣。

在 Pong 课中:

def move_all(self):
    for obj in self.p1, self.p2, self.ball:
        obj.move()
        if obj is not self.ball:
            obj.bounce(self.ball)

在 Paddle 类中:

def bounce(self, ball):
    minimum = self.size.x + ball.radius
    if self.position.x != ball.position.x and self.overlap(ball, minimum):
        if not self.just_bounced:
            self.just_bounced = True
            self.score += abs(ball.velocity.y)
        sign = +1 if self.position.x < ball.position.x else -1
        if self.collision_area == self.PART.center:
            ball.position.x = self.position.x + minimum * sign
        else:
            ball.position.adjust(self.middle_point, minimum)
        ball.velocity.x = copy_sign(ball.velocity.x, sign)
        ball.change_speed()
    else:
        self.just_bounced = False

在 Ball 类中:

def bounce(self):
    if self.position.y - self.radius < 0:
        self.position.y = self.radius
        self.velocity.y = copy_sign(self.velocity.y, +1)
        self.change_speed()
    elif self.position.y + self.radius > self.board.y:
        self.position.y = self.board.y - self.radius
        self.velocity.y = copy_sign(self.velocity.y, -1)
        self.change_speed()

关于python - 如何在 Pygame 中设置 Pong 的碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14515217/

相关文章:

python - 将 block 旋转到某个位置

python - 删除直线中多余的点

ios - 带有碰撞检测的 UIView 永久线性动画

python - 为什么 SSL 包装的套接字需要 `server_hostname`?

Python Pandas 数据帧 : unorderable types: str() > int()

python - 将数据从 MySQL 数据库移植到 PostgreSQL

python - 我怎样才能改变矩形的大小

c# - 大量物体的碰撞检测

python - Pygame圆碰撞?

python - Django : get_or_create Raises duplicate entry with together_unique