我的代码:
def shop_button(self):
click = pygame.mouse.get_pressed()
if click[0] == 1:
self.open_shop() # draws shop
self.inshop = True
while self.inshop:
pygame.time.delay(10)
mousepos = pygame.mouse.get_pos()
if click[0] == 1 and b.mouse_on_button(mousepos[0], mousepos[1], b.escapex, b.escapex2, b.escapey, b.escapey2):
self.inshop = False
然而,每当你点击商店按钮时,这个功能就会运行,而self.instop在if语句中时,游戏会立即停止响应并崩溃。这可能是一个非常简单的解决方案,因为我对pygame和整个python语言还不太熟悉。然而,话虽如此,我似乎在其他任何地方都找不到解决方案。
游戏不会崩溃,也不会响应,因为主应用程序循环中有一个循环。内部循环没有事件处理和显示更新。
def shop_button(self): # [...] while self.inshop: pygame.time.delay(10) mousepos = pygame.mouse.get_pos() # [...]
pygame.mouse.get_pos()
返回的位置从内部缓存中读取。当事件由pygame.event.pump()
或pygame.event.get()
处理时,缓存被更新
这意味着,如果您在循环中检索位置,而不处理事件,则该位置不会反映当前鼠标位置,而是连续相同的位置,即循环之前调用pygame.event.get()
时的位置
此外,在不更新显示的情况下,pygame.display.flip()
或pygame.display.update()
不会更改显示Surface
。
你有一个主应用程序循环,使用它。主应用程序环路必须:
- 通过
pygame.event.pump()
或pygame.event.get()
处理事件 - 根据输入事件和时间(分别为帧(更新游戏状态和对象的位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象( - 通过
pygame.display.update()
或pygame.display.flip()
更新显示
从未实现过嵌套的应用程序循环。你必须改变控制流程和应用程序的设计。