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”方法创建一个着陆过程,但由于一些未知原因,每当调用该函数时,尽管检测到碰撞并重新分配了玩家的位置,但无论如何都不会改变玩家的速度。奇怪的是,如果我不使用函数,直接在主游戏更新循环中实现条件,它就可以正常工作。所以我想问题在于函数的行为。如果您能帮助解决此问题,我们将不胜感激。提前谢谢
在内部函数中,
vy
是一个局部变量(函数的参数)。更改其值不会更改外部函数中vy
变量的值。您要么需要return
新的速度(并将调用函数的代码更改为vy = collide(player, platform, vy)
),要么改变您的设计,使速度成为其他对象的属性(如果将其更改为自定义类的实例,则可能是player
)如果直接访问外部命名空间中的
vy
(而不是参数),则可以在内部函数中使用nonlocal
语句,让它写入外部函数的局部变量。然而,让这样的东西在其他名称空间上乱涂乱画通常被认为是糟糕的设计。使用对象或返回值通常更容易推理,并且在出现问题时更容易调试相关问题 更多 >
编程相关推荐