如何解决检测python pygame中的无效碰撞
import pygame
pygame.init()
pygame.display.set_caption('...SHON...PONG...')
icon=pygame.image.load('icon.png')
pygame.display.set_icon(icon)
FPS=50
fpsClock=pygame.time.Clock()
screenh=500
screenw=300
screen=pygame.display.set_mode((screenh,screenw))
black =((0,0))
paddle1=pygame.image.load('paddle1.png')
paddle1_rect=paddle1.get_rect()
paddle1_y=100
paddle1_x=10
paddle2=pygame.image.load('paddle2.png')
paddle2_rect=paddle1.get_rect()
paddle2_y=100
paddle2_x=471
ball=pygame.image.load('player.png')
ball_rect=ball.get_rect()
ball_x=240
ball_y=130
ball_y_speed=2
ball_x_speed=2
speed=15
paddle1_rect.x=paddle1_x
paddle1_rect.y=paddle1_y
paddle2_rect.x=paddle2_x
paddle2_rect.y=paddle2_y
ball_rect.x=ball_x
ball_rect.y=ball_y
def ball_movement():
global ball_x,ball_y,ball_x_speed,ball_y_speed
ball_x -=ball_x_speed
ball_y +=ball_y_speed
def ball_collide_screen():
global ball_x,ball_y_speed
if ball_y + screenw >= 600:
ball_y_speed = -2
if ball_y + screenw <= 300:
ball_y_speed = -2
def ball_collide_paddles():
global ball_rect,paddle1_rect,paddle2_rect
if paddle1_rect.right - ball_rect.left <= 0:
print('ho')
running=True
while running:
screen.fill((0,0))
screen.blit(paddle1,(paddle1_x,paddle1_y))
screen.blit(paddle2,(paddle2_x,paddle2_y))
screen.blit(ball,(ball_x,ball_y))
ball_collide_screen()
ball_movement()
ball_collide_paddles()
pygame.display.update()
fpsClock.tick(FPS)
for event in pygame.event.get():
if event.type==pygame.QUIT:
running=False
pygame.quit()
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_w:
paddle1_y-= speed
if event.key==pygame.K_z:
paddle1_y+=speed
if event.key==pygame.K_UP:
paddle2_y-=speed
if event.key==pygame.K_DOWN:
paddle2_y+=speed
*我在使用 pygame colliderect 函数时遇到问题。每当球与桨碰撞时,我都会使用打印功能,只要程序正在运行,它就会继续打印碰撞......我在某处读到 rect 位置必须与球的初始位置匹配,我试过这样做但一切都是徒劳的.....我已经做了一段时间的pygame,我在尝试制作这个乒乓球游戏时遇到了这个问题*
解决方法
您必须在移动对象之后和碰撞检测之前更新 pygame.Rect
对象的位置:
def ball_movement():
global ball_x,ball_y,ball_x_speed,ball_y_speed
ball_x -=ball_x_speed
ball_y +=ball_y_speed
ball_rect.x=ball_x
ball_rect.y=ball_y
running=True
while running:
# [...]
for event in pygame.event.get():
if event.type==pygame.QUIT:
running=False
pygame.quit()
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_w:
paddle1_y-= speed
if event.key==pygame.K_z:
paddle1_y+=speed
if event.key==pygame.K_UP:
paddle2_y-=speed
if event.key==pygame.K_DOWN:
paddle2_y+=speed
paddle1_rect.x=paddle1_x
paddle1_rect.y=paddle1_y
paddle2_rect.x=paddle2_x
paddle2_rect.y=paddle2_y
注意,您根本不需要变量 ball_x
、ball_y
、paddle1_x
、paddle1_y
、paddle2_x
和 paddle2_y
。
改用 ball_rect.x
、ball_rect.y
、paddle1_rect.x
、paddle1_rect.y
、paddle2_rect.x
和 paddle2_rect.y
。
import pygame
pygame.init()
pygame.display.set_caption('...SHON...PONG...')
#icon = pygame.image.load('icon.png')
#pygame.display.set_icon(icon)
FPS = 50
fpsClock = pygame.time.Clock()
screenh = 500
screenw = 300
screen = pygame.display.set_mode((screenh,screenw))
black = ((0,0))
#paddle1 = pygame.image.load('paddle1.png')
paddle1 = pygame.Surface((5,50))
paddle1.fill((255,255,255))
paddle1_rect = paddle1.get_rect(topleft = (10,100))
#paddle2 = pygame.image.load('paddle2.png')
paddle2 = pygame.Surface((5,50))
paddle2.fill((255,255))
paddle2_rect = paddle1.get_rect(topleft = (471,100))
#ball = pygame.image.load('player.png')
ball = pygame.Surface((5,5))
ball.fill((255,255))
ball_rect = ball.get_rect(topleft = (240,130))
ball_x_speed = 2
ball_y_speed = 2
speed = 15
def ball_movement():
ball_rect.x += ball_x_speed
ball_rect.y += ball_y_speed
def ball_collide_screen():
global ball_x_speed,ball_y_speed
if ball_rect.left <= 0:
ball_x_speed = 2
if ball_rect.right >= screen.get_width():
ball_x_speed = -2
if ball_rect.top <= 0:
ball_y_speed = 2
if ball_rect.bottom >= screen.get_height():
ball_y_speed = -2
def ball_collide_paddles():
if paddle1_rect.right - ball_rect.left <= 0:
print('ho')
running=True
while running:
screen.fill((0,0))
screen.blit(paddle1,paddle1_rect)
screen.blit(paddle2,paddle2_rect)
screen.blit(ball,ball_rect)
pygame.display.update()
fpsClock.tick(FPS)
ball_collide_screen()
ball_movement()
ball_collide_paddles()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running=False
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
paddle1_rect.y -= speed
if event.key == pygame.K_s:
paddle1_rect.y += speed
if event.key == pygame.K_UP:
paddle2_rect.y -= speed
if event.key == pygame.K_DOWN:
paddle2_rect.y += speed
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。