pygame - 如何在使用变量时更改它?
pygame - How do I change a variable while it is being used?
我正在使用 pygame.
制作一个简单的自上而下游戏,其中包含玩家与墙壁之间的移动和碰撞
我编写了我的代码,以便当 keys[pygame.K_LSHIFT]
在 pygame.key.get_pressed
期间处于 True
时在键盘状态下被调用时, block_speed
变为 5 而不是3. 所以它起作用了,当我按住 SHIFT 键并同时使用 WASD 键移动时,我的速度变为 5.
现在,问题是当我在移动时松开 SHIFT,我的速度没有变回 3,而是保持在 5。但是如果我停止移动,然后移动,block_speed
变回达到预期的 3。似乎 block_speed
的任何更改只发生在我停止移动然后再次移动时。
我猜它只会在 block_speed
的当前副本被使用后才会收到 block_speed
的新值。
程序正在使用此变量时,如何使用 SHIFT 更改 block_speed
?
def run(self):
pygame.init()
pygame.display.set_caption("Platformer v1")
block_speed = 3
sprite_list = pygame.sprite.Group()
wall_list = pygame.sprite.Group()
left_wall = Wall(0,0,10,resolution[1])
wall_list.add(left_wall)
sprite_list.add(left_wall)
top_wall = Wall(10,0,resolution[0]-10,10)
wall_list.add(top_wall)
sprite_list.add(top_wall)
test_wall = Wall(10,150,200,10)
wall_list.add(test_wall)
sprite_list.add(test_wall)
player = Player(50,50)
player.walls = wall_list
sprite_list.add(player)
while True:
self.screen.fill(black)
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if keys[pygame.K_LSHIFT]:
block_speed = 5
else:
block_speed = 3
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
player.change_x += block_speed
elif event.key == pygame.K_a:
player.change_x += -block_speed
elif event.key == pygame.K_w:
player.change_y += -block_speed
elif event.key == pygame.K_s:
player.change_y += block_speed
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
elif event.key == pygame.K_w or event.key == pygame.K_s:
player.change_y = 0
sprite_list.update()
sprite_list.draw(self.screen)
pygame.display.update()
self.clock.tick(FPS)
您的问题是,当您将块速度添加到 player.change_x
/change_y
时,它会在那时执行该计算。之后更改变量不会有什么不同。
针对您的情况的一个简单解决方案是在使用之前简单地对 block_speed
进行更改。如果这样做,block_speed
在更改其他变量时具有您想要的值,从而为您提供所需的结果。
编辑:我意识到还有另一个问题 - 也就是说,如果新按下键(事件被触发),你只会改变移动速度,所以改变方块速度仍然不会改变速度,除非一个方向键被按下。解决办法是每次都计算,不管。
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if keys[pygame.K_LSHIFT]:
block_speed = 5
else:
block_speed = 3
if keys[pygame.K_d]:
player.change_x += block_speed
if keys[pygame.K_a]:
player.change_x += -block_speed
if keys[pygame.K_w]:
player.change_y += -block_speed
if keys[pygame.K_s]:
player.change_y += block_speed
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
elif event.key == pygame.K_w or event.key == pygame.K_s:
player.change_y = 0
另一种方法是在按下某个键时存储方向,然后将其乘以每帧移动时的速度:
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if keys[pygame.K_LSHIFT]:
player.block_speed = 5
else:
player.block_speed = 3
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
player.change_x += 1
elif event.key == pygame.K_a:
player.change_x -= 1
elif event.key == pygame.K_w:
player.change_y -= 1
elif event.key == pygame.K_s:
player.change_y += 1
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
elif event.key == pygame.K_w or event.key == pygame.K_s:
player.change_y = 0
然后在您的位置代码中执行 self.rect.x += self.change_x * self.block_speed
。这可能是一个更好的解决方案。
我遇到了同样的问题并尝试使用建议答案中的代码,但发现它对我不起作用。在按下一个键之前,我的精灵仍然以基本速度移动。
查看此线程,我尝试将 get_pressed()
键检测移到事件循环之外,这解决了问题。
keys = pygame.key.get_pressed()
if keys[pygame.K_LSHIFT]:
player.block_speed = 5
else:
player.block_speed = 3
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
player.change_x += 1
#etc.
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
#etc.
如上述答案,在您的位置代码中有 self.rect.x += self.change_x * self.block_speed
.
这让我在按住某个键时获得速度提升效果,而在未按下时恢复到基本速度。
import pygame
running = True
while running:
for event in pygame.event.get():
#K_UP mean releasing the key
if event.type == pygame.K_UP:
if event.key == pygame.K_LSHIFT:
block_speed = 3
我正在使用 pygame.
制作一个简单的自上而下游戏,其中包含玩家与墙壁之间的移动和碰撞我编写了我的代码,以便当 keys[pygame.K_LSHIFT]
在 pygame.key.get_pressed
期间处于 True
时在键盘状态下被调用时, block_speed
变为 5 而不是3. 所以它起作用了,当我按住 SHIFT 键并同时使用 WASD 键移动时,我的速度变为 5.
现在,问题是当我在移动时松开 SHIFT,我的速度没有变回 3,而是保持在 5。但是如果我停止移动,然后移动,block_speed
变回达到预期的 3。似乎 block_speed
的任何更改只发生在我停止移动然后再次移动时。
我猜它只会在 block_speed
的当前副本被使用后才会收到 block_speed
的新值。
程序正在使用此变量时,如何使用 SHIFT 更改 block_speed
?
def run(self):
pygame.init()
pygame.display.set_caption("Platformer v1")
block_speed = 3
sprite_list = pygame.sprite.Group()
wall_list = pygame.sprite.Group()
left_wall = Wall(0,0,10,resolution[1])
wall_list.add(left_wall)
sprite_list.add(left_wall)
top_wall = Wall(10,0,resolution[0]-10,10)
wall_list.add(top_wall)
sprite_list.add(top_wall)
test_wall = Wall(10,150,200,10)
wall_list.add(test_wall)
sprite_list.add(test_wall)
player = Player(50,50)
player.walls = wall_list
sprite_list.add(player)
while True:
self.screen.fill(black)
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if keys[pygame.K_LSHIFT]:
block_speed = 5
else:
block_speed = 3
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
player.change_x += block_speed
elif event.key == pygame.K_a:
player.change_x += -block_speed
elif event.key == pygame.K_w:
player.change_y += -block_speed
elif event.key == pygame.K_s:
player.change_y += block_speed
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
elif event.key == pygame.K_w or event.key == pygame.K_s:
player.change_y = 0
sprite_list.update()
sprite_list.draw(self.screen)
pygame.display.update()
self.clock.tick(FPS)
您的问题是,当您将块速度添加到 player.change_x
/change_y
时,它会在那时执行该计算。之后更改变量不会有什么不同。
针对您的情况的一个简单解决方案是在使用之前简单地对 block_speed
进行更改。如果这样做,block_speed
在更改其他变量时具有您想要的值,从而为您提供所需的结果。
编辑:我意识到还有另一个问题 - 也就是说,如果新按下键(事件被触发),你只会改变移动速度,所以改变方块速度仍然不会改变速度,除非一个方向键被按下。解决办法是每次都计算,不管。
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if keys[pygame.K_LSHIFT]:
block_speed = 5
else:
block_speed = 3
if keys[pygame.K_d]:
player.change_x += block_speed
if keys[pygame.K_a]:
player.change_x += -block_speed
if keys[pygame.K_w]:
player.change_y += -block_speed
if keys[pygame.K_s]:
player.change_y += block_speed
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
elif event.key == pygame.K_w or event.key == pygame.K_s:
player.change_y = 0
另一种方法是在按下某个键时存储方向,然后将其乘以每帧移动时的速度:
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if keys[pygame.K_LSHIFT]:
player.block_speed = 5
else:
player.block_speed = 3
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
player.change_x += 1
elif event.key == pygame.K_a:
player.change_x -= 1
elif event.key == pygame.K_w:
player.change_y -= 1
elif event.key == pygame.K_s:
player.change_y += 1
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
elif event.key == pygame.K_w or event.key == pygame.K_s:
player.change_y = 0
然后在您的位置代码中执行 self.rect.x += self.change_x * self.block_speed
。这可能是一个更好的解决方案。
我遇到了同样的问题并尝试使用建议答案中的代码,但发现它对我不起作用。在按下一个键之前,我的精灵仍然以基本速度移动。
查看此线程,我尝试将 get_pressed()
键检测移到事件循环之外,这解决了问题。
keys = pygame.key.get_pressed()
if keys[pygame.K_LSHIFT]:
player.block_speed = 5
else:
player.block_speed = 3
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d:
player.change_x += 1
#etc.
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d or event.key == pygame.K_a:
player.change_x = 0
#etc.
如上述答案,在您的位置代码中有 self.rect.x += self.change_x * self.block_speed
.
这让我在按住某个键时获得速度提升效果,而在未按下时恢复到基本速度。
import pygame
running = True
while running:
for event in pygame.event.get():
#K_UP mean releasing the key
if event.type == pygame.K_UP:
if event.key == pygame.K_LSHIFT:
block_speed = 3