我使用pygame制作一个简单的自上而下游戏,玩家和墙壁之间的移动和碰撞。
我制作了我的代码,以便keys[pygame.K_LSHIFT]
True
在键盘状态pygame.key.get_pressed
期间block_speed
被调用时,block_speed
更改为5而不是3.所以它工作,当我按住SHIFT并同时使用WASD键移动时,我的速度变为5。
现在,问题是当我在移动时放开SHIFT时,我的速度不会变回3而是保持在5.但是如果我停止移动,那么移动,block_speed
变回来按预期为3。似乎只有在我停止移动然后再次移动时才会发生对block_speed
的任何更改。
我猜测它只会在使用block_speed
的当前副本后收到block_speed
的新值。
如果程序正在使用此变量,如何使用SHIFT更改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)
?
slurp
答案 0 :(得分:1)
您的问题是,当您将块速度添加到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
。这可能是一个更好的解决方案。
答案 1 :(得分:0)
我遇到了同样的问题并尝试使用建议答案中的代码,但发现它对我不起作用。我的精灵仍以基本速度移动,直到钥匙被抬起。
看一下这个帖子,我尝试在事件循环之外移动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
。
这使我能够在按下某个键时获得速度提升效果,并在不按下时恢复到基本速度。
答案 2 :(得分:0)
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