如何解决重置并重新启动pygame程序无效
当要求用户重新启动时,我在pygame中重置游戏时遇到问题。该程序的构造如下:
import board as b
class Gui():
def __init__(self):
pygame.init()
self.gamestate = b.GameState()
def run(self):
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
running = False
pygame.quit()
Gui().run
if __name__ == '__main__':
Gui().run()
当用户尝试重新启动时,发生的情况是Gui关闭并且while循环按原样退出。然后,它将打开一个新窗口,但尚未清除游戏状态,因此我之前运行的游戏状态仍然存在。我以为self.gamestate = b.GameState()
行会为我创建一个新的游戏状态,但事实并非如此。这是电路板文件中的一小段代码:
class GameState:
def __init__(self):
self.board = s.start_position
在调用它时,我认为它将板设置为开始位置,并将其所有参数设置为初始值,但是有些不正确,并且我已经有3天没有解决了。希望您能帮助我清除游戏状态并重新开始。
解决方法
您使系统过于复杂。您实际上正在做的是递归地实例化一个新的Gui
对象和新的应用程序循环到一个现有的Gui
对象和应用程序循环中。
如果GameState
的实现正确,则足以创建一个新的GameState
对象并继续现有的应用程序循环,而不必递归地创建一个新的Gui
实例:
import board as b
class Gui():
def __init__(self):
pygame.init()
self.gamestate = b.GameState()
def run(self):
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
self.gamestate = b.GameState()
# [...]
if __name__ == '__main__':
Gui().run()
指令self.board = s.start_position
不会创建新的板对象。 self.board
和s.start_position
引用相同的对象。如果更改一个对象,则另一个对象似乎也以相同的方式更改,因为只有一个对象。
启动游戏时,您需要制作桌面对象的深层副本,或者在游戏重新启动时,需要重置对象。
一个解决方案可能是使用Python copy
模块。 deepcopy
可以创建对象的深层副本:
import copy
self.board = copy.deepcopy(s.start_position)`
注意,并非所有对象都可以深复制。例如,pygame.Surface
不能 deep 复制。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。