当通过功能触发碰撞时,碰撞检测的速度重新分配不响应

2024-04-19 03:08:36 发布

您现在位置:Python中文网/ 问答频道 /正文

import pygame as pg
import sys





def main():
    pg.init()
    clock = pg.time.Clock()
    fps = 60
    bg = (255, 255, 255)

    size = [400, 400]

    this = pg.display.set_mode(size)

    ay = .5
    vy = 2
    vx = 4


    player = pg.Rect(100, 50, 20, 20)
    platform = pg.Rect(0, size[1]-20, size[0], 20)

    objs = [player, platform]

    colors = [[255, 0, 0], [0, 255, 0]]

    move = [pg.K_LEFT, pg.K_RIGHT]

    def collide(player, platform, vy):
        hit = player.colliderect(platform)

        if hit:
            if player.bottom >= platform.top:
                player.bottom = platform.top
                vy = 0

    while True:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                return False

            if event.type == pg.KEYDOWN:
                if event.key == pg.K_SPACE:
                    vy -= 10

        key = pg.key.get_pressed()

        for i in range(2):
            if key[move[i]]:
                player.x += vx * [-1, 1][i]


        this.fill(bg)

        vy += ay
        player.y += vy


        collide(player, platform, vy)


        for i, obj in enumerate(objs):
            pg.draw.rect(this, colors[i], obj)

        pg.display.update()
        clock.tick(fps)

    pg.quit()
    sys.exit


if __name__ == '__main__':
    main()

从上面的代码中可以看出,我正试图通过“rectcollide”方法创建一个着陆过程,但由于一些未知原因,每当调用该函数时,尽管检测到碰撞并重新分配了玩家的位置,但无论如何都不会改变玩家的速度。奇怪的是,如果我不使用函数,直接在主游戏更新循环中实现条件,它就可以正常工作。所以我想问题在于函数的行为。如果您能帮助解决此问题,我们将不胜感激。提前谢谢


Tags: key函数inimporteventforsizeif
1条回答
网友
1楼 · 发布于 2024-04-19 03:08:36

在内部函数中,vy是一个局部变量(函数的参数)。更改其值不会更改外部函数中vy变量的值。您要么需要return新的速度(并将调用函数的代码更改为vy = collide(player, platform, vy)),要么改变您的设计,使速度成为其他对象的属性(如果将其更改为自定义类的实例,则可能是player

如果直接访问外部命名空间中的vy(而不是参数),则可以在内部函数中使用nonlocal语句,让它写入外部函数的局部变量。然而,让这样的东西在其他名称空间上乱涂乱画通常被认为是糟糕的设计。使用对象或返回值通常更容易推理,并且在出现问题时更容易调试

相关问题 更多 >