如何在Pygame中为Pong设置碰撞检测

时间:2013-01-25 04:13:17

标签: python pygame collision-detection pong

我正在Pygame中构建一个Pong克隆。我无法弄清楚如何在球和桨上添加碰撞检测,这样球就会从桨叶上反弹。我怎样才能做到这一点?当击中拨片时,我怎么能让球向相反方向移动?

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()

2 个答案:

答案 0 :(得分:3)

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()

答案 1 :(得分:0)

制作一个if语句,检查球的x坐标是否超出了桨的x坐标,以及它的y坐标是否在桨的顶部和底部y坐标之内。如果是这样,将球的x速度乘以-1。