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”方法创建一个登陆程序但是由于某些未知的原因,只要检测到碰撞并且重新分配了玩家的位置,就会调用该函数,然而,球员的速度并没有改变。奇怪的是,如果我不使用函数并直接在主游戏更新循环中实现条件,它就可以正常工作。所以问题在于我假设的函数的行为。任何帮助解决这个问题将非常感激。提前谢谢。
答案 0 :(得分:1)
在你的内部函数中,vy
是一个局部变量(函数的一个参数)。更改其值不会更改外部函数中vy
变量的值。您需要return
新的速度(并将调用函数的代码更改为vy = collide(player, platform, vy)
),或更改您的设计,以便速度是某个其他对象的属性(可能{{1}如果您将其更改为自定义类的实例)。
如果你直接访问外部命名空间中的player
(没有它是一个参数),你可以在内部函数中使用vy
语句让它写入外部函数的局部变量。但是,让像这样的其他命名空间上的杂文通常被认为是糟糕的设计。使用对象或返回值通常更容易推理,并且在出现问题时更容易调试。