我正在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()
答案 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。