微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检测python pygame中的无效碰撞

如何解决检测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_xball_ypaddle1_xpaddle1_ypaddle2_xpaddle2_y
改用 ball_rect.xball_rect.ypaddle1_rect.xpaddle1_rect.ypaddle2_rect.xpaddle2_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 举报,一经查实,本站将立刻删除。