我是一名新手,我正在try 用它来构建一款游戏.我一直有碰撞不被识别的问题.以下是我try 过的代码

import pygame
pygame.init()

WIDTH, HEIGHT = (900, 500)
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Bong Pong')

FPS = 60
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BORDER = pygame.Rect(WIDTH// 2 -5, 0, 10, HEIGHT)
VEL = 3
PLAYER_HEIGHT = 50
PLAYER_WIDTH = 15
BALL_HEIGHT = 15
BALL_WIDTH = 15


def draw_window(player_1, player_2, game_ball):
    WIN.fill(WHITE)
    pygame.draw.rect(WIN, BLACK, BORDER)
    pygame.draw.rect(WIN, BLACK, player_1)
    pygame.draw.rect(WIN, BLACK, player_2)
    pygame.draw.rect(WIN, RED, game_ball)
    pygame.display.update()


def player_1_movement(keys_pressed, player_1):
    if keys_pressed[pygame.K_w] and player_1.y - VEL > 0:
        player_1.y -= VEL
    if keys_pressed [pygame.K_s] and player_1.y + PLAYER_HEIGHT + VEL < 500:
        player_1.y += VEL
    
def player_2_movement(keys_pressed, player_2):
    if keys_pressed[pygame.K_UP] and player_2.y - VEL > 0:
        player_2.y -= VEL
    if keys_pressed [pygame.K_DOWN] and player_2.y + PLAYER_HEIGHT + VEL < 500:
        player_2.y += VEL


def player_collision(player_1, player_2, game_ball, ball_vel_x): 
    if game_ball.colliderect(player_1) or game_ball.colliderect(player_2):
        ball_vel_x *= -1
        
   
        
    
    

def main(): 
    clock = pygame.time.Clock()
    run = True

    player_1 = pygame.Rect(50, HEIGHT//2 - PLAYER_HEIGHT// 2, PLAYER_WIDTH, PLAYER_HEIGHT)
    player_2 = pygame.Rect(850, HEIGHT//2 - PLAYER_HEIGHT// 2, PLAYER_WIDTH, PLAYER_HEIGHT)
    game_ball = pygame.Rect(50 + PLAYER_WIDTH, HEIGHT//2 - BALL_HEIGHT// 2, BALL_WIDTH, BALL_HEIGHT)
    ball_vel_y = 2
    ball_vel_x = 2
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False 
                pygame.QUIT()
            
        keys_pressed = pygame.key.get_pressed()
        player_1_movement(keys_pressed, player_1)
        player_2_movement(keys_pressed, player_2)
        draw_window(player_1, player_2, game_ball)
        
        if game_ball.y - BALL_HEIGHT - VEL <= 0 or game_ball.y + BALL_HEIGHT + VEL >= 500:
            ball_vel_y *= -1
        
        game_ball.y -= ball_vel_y

      
        player_collision(player_1, player_2, game_ball, ball_vel_x)
         

        game_ball.x += ball_vel_x


    main()

if __name__ == '__main__':
    main()
     

我也试着把

game_ball.x += ball_vel_x

在PlayerColsion函数中,但是它没有正确地反转它.

我已经通过将整个PlayerCollision函数代码放入main函数中解决了这个问题,如下所示


def main(): 
    clock = pygame.time.Clock()
    run = True

    player_1 = pygame.Rect(50, HEIGHT//2 - PLAYER_HEIGHT// 2, PLAYER_WIDTH, PLAYER_HEIGHT)
    player_2 = pygame.Rect(850, HEIGHT//2 - PLAYER_HEIGHT// 2, PLAYER_WIDTH, PLAYER_HEIGHT)
    game_ball = pygame.Rect(50 + PLAYER_WIDTH, HEIGHT//2 - BALL_HEIGHT// 2, BALL_WIDTH, BALL_HEIGHT)
    ball_vel_y = 2
    ball_vel_x = 2
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False 
                pygame.QUIT()
            
        keys_pressed = pygame.key.get_pressed()
        player_1_movement(keys_pressed, player_1)
        player_2_movement(keys_pressed, player_2)
        draw_window(player_1, player_2, game_ball)
        
        if game_ball.y - BALL_HEIGHT - VEL <= 0 or game_ball.y + BALL_HEIGHT + VEL >= 500:
            ball_vel_y *= -1
        
        game_ball.y -= ball_vel_y

        if game_ball.colliderect(player_1) or game_ball.colliderect(player_2):
            ball_vel_x *= -1


        game_ball.x += ball_vel_x


    main()

这就是我想要的工作方式,我只是想弄清楚为什么这个函数不能正常工作,如果只是调用主函数,而不是直接放入它.

推荐答案

Python没有输入-输出参数的概念.参数是通过值传递的.如果在player_collision函数中更改ball_vel_x,则只有参数更改,但参数保持不变.您必须从函数返回新值ball_vel_x:

def player_collision(player_1, player_2, game_ball, ball_vel_x): 
    if game_ball.colliderect(player_1) or game_ball.colliderect(player_2):
        ball_vel_x *= -1
    return ball_vel_x 
def main():
    # [...]

    while run:
        # [...]

        ball_vel_x = player_collision(player_1, player_2, game_ball, ball_vel_x)

        # [...]

另一种可能性是将速度存储在对象中(例如gyame.math.Vector2).变量存储对对象的引用,因此如果变量是函数调用的参数,则可以在函数中更改对象的属性:

def player_collision(player_1, player_2, game_ball, ball_vel): 
    if game_ball.colliderect(player_1) or game_ball.colliderect(player_2):
        ball_vel.x *= -1 


def main(): 
    # [...]

    ball_vel = pygame.math.Vector2(2, 2)
    
    while run:
        # [...]
        
        if game_ball.y - BALL_HEIGHT - VEL <= 0 or game_ball.y + BALL_HEIGHT + VEL >= 500:
            ball_vel.y *= -1
        
        game_ball.y -= ball_vel.y
        player_collision(player_1, player_2, game_ball, ball_vel)
        game_ball.x += ball_vel.x

Python相关问答推荐

配置Sweetviz以分析对象类型列,而无需转换

如何在BeautifulSoup中链接Find()方法并处理无?

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

如何让剧作家等待Python中出现特定cookie(然后返回它)?

Python中的嵌套Ruby哈希

未删除映射表的行

有症状地 destruct 了Python中的regex?

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

django禁止直接分配到多对多集合的前端.使用user.set()

在Python中使用if else或使用regex将二进制数据如111转换为001""

找到相对于列表索引的当前最大值列表""

pandas fill和bfill基于另一列中的条件

mdates定位器在图表中显示不存在的时间间隔

按条件添加小计列

python3中np. divide(x,y)和x/y有什么区别?'

按条件计算将记录拆分成两条记录

如何在python tkinter中绑定键盘上的另一个回车?

如何在Polars中创建条件增量列?