当通过函数触发碰撞时,碰撞检测的速度重新分配是无响应的

时间:2016-10-30 21:22:11

标签: python pygame collision

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”方法创建一个登陆程序但是由于某些未知的原因,只要检测到碰撞并且重新分配了玩家的位置,就会调用该函数,然而,球员的速度并没有改变。奇怪的是,如果我不使用函数并直接在主游戏更新循环中实现条件,它就可以正常工作。所以问题在于我假设的函数的行为。任何帮助解决这个问题将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

如果你直接访问外部命名空间中的player(没有它是一个参数),你可以在内部函数中使用vy语句让它写入外部函数的局部变量。但是,让像这样的其他命名空间上的杂文通常被认为是糟糕的设计。使用对象或返回值通常更容易推理,并且在出现问题时更容易调试。