Как установить обнаружение столкновений для Pong в Pygame

Я создаю клон Pong в Pygame. Я не могу понять, как добавить обнаружение столкновения к мячу и ракеткам, чтобы мяч отскакивал от ракеток. Как я могу это сделать? Как я могу заставить мяч лететь в противоположном направлении, когда он ударяется о лопасти?

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

person user2005813    schedule 25.01.2013    source источник


Ответы (2)


В этом ответе есть образец реализации pong, который включает обнаружение столкновений. В частности, вас могут заинтересовать методы bounce в коде, перечисленные ниже.

В классе понг:

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()
person Noctis Skytower    schedule 25.01.2013

Сделайте оператор if, который проверяет, вышла ли x-координата мяча за x-координату ракетки и находится ли ее y-координата в пределах верхней и нижней y-координаты ракетки. Если это так, умножьте x скорость мяча на -1.

person schlow    schedule 25.01.2013