【问题标题】:pygame - while loop makes pygame window freeze / how do I shoot the bullets out of the player?pygame - while 循环使 pygame 窗口冻结/我如何将子弹射出播放器?
【发布时间】:2021-12-09 16:17:29
【问题描述】:

所以今天早上我又在编程,我想写我的小游戏中的玩家可以发射子弹。效果很好,但有一个问题:我为“子弹生成器”player.x 和 player.y 的 x 和 y 坐标编写了代码,我认为子弹会从玩家的位置射出。但他们没有。他们从玩家在游戏开始时所在的位置射击,而刷怪笼没有移动。所以我尝试用一​​个while循环和bool isMoving来做到这一点,只有当玩家移动时才为真:

...
isMoving = False
...
bullets = []
position = (player.x, player.y)
while isMoving:
   position = (player.x, player.y)
...
if keys[pygame.K_d] or keys[pygame.K_a] or keys[pygame.K_w] or keys[pygame.K_s] or keys[pygame.K_UP] or keys[pygame.K_DOWN] or keys[pygame.K_LEFT] or keys[pygame.K_RIGHT]:
    isMoving = True
else:
    isMoving = False

但如果我现在运行 pygame,窗口就会冻结。如果我再次删除 while 循环,它会起作用,但它会再次从玩家的第一个位置射击。 哦,我收到错误“而 isMoving: UnboundLocalError:分配前引用的局部变量“isMoving” " 有什么办法可以解决这个问题吗?

【问题讨论】:

标签: python python-3.x while-loop pygame


【解决方案1】:

Pygame 应该在一个包含所有主要操作的主 while 循环中运行。 尝试在开始时设置位置,然后在 while 循环中检查触发 isMoving 更改的 pygame 事件。嵌套的 while 循环会导致 pygame 出现问题。在 while 循环中使用 if 函数而不是另一个 while 循环。例如,

position = (player.x, player.y) # initial position
while isRunning:
    isMoving = False
    # PyGame event interaction
    for event in pygame.event.get():
        # Exits loop
        if event.type == pygame.QUIT:
            isRunning = False
        # Check if key is pressed
        if event.type == pygame.KEYDOWN:
            keys = [pygame.K_a, pygame.K_w, pygame.K_s, pygame.K_d, pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]
            if event.key in keys:
                isMoving = True
        
    if isMoving:
        position = (player.x, player.y)
        # do other stuff

【讨论】:

  • 谢谢你的回答,但不管怎样还是不行,又从玩家的第一个位置射出去了
  • 等一下,我把它改了一点,它现在可以工作了。谢谢!
  • 我可以看到您正在更新位置变量,但是您是否也先更新了 player.x 和 player.y?它们应该在“if isMoving”或类似的地方更新。
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多