我正在使用 Python 和模块 Pygame 创建一个小游戏。
我尝试实现一个非常基本的(我猜是一个非常幼稚的)状态管理器。
但是,
我目前有一个问题:
一旦切换“播放”状态,我就无法切换回“菜单”。
这是我设计状态管理器的缺陷吗?
我有两种方法,
- 该
state_change
方法采用一个参数,即所需的状态。 - 该
state_check
方法将状态作为唯一参数并将其作为当前状态返回。
以下是两种方法:
def state_check(self, state):
self.current_state = state
print self.current_state
return self.current_state
def state_change(self, state):
self.state = state
在主循环之前,
第一个state
被初始化为“菜单”。
在主循环内部,
state_check
位于 if 语句之前,用于指示从哪个状态开始。
def game_loop(self):
running = True
self.test_car = car()
self.state = "menu"
while running:
pygame.display.set_caption("Project G")
self.state_check(self.state)
if self.current_state == "menu":
self.state_check(self.state)
self.screen.blit(self.background, (0,0))
#Blits the current state on the screen for testing purposes.
self.screen.blit(self.menu_text, (700, 580))
self.event_handler()
pygame.display.flip()
if self.current_state == "play":
self.state_check(self.state)
self.screen.blit(self.background, (0,0))
#Blits the current state on the screen.
self.screen.blit(self.play_text, (700, 580))
self.test_car.event_handler()
self.test_car.update(self.test_car.x_speed, self.test_car.y_speed)
pygame.display.flip()
在 if 语句中,
是事件处理程序方法,我目前使用键盘输入在状态之间切换(通过调用state_change
方法)并退出程序。
使用一些打印方法,我已经排除了键未注册的可能性。
#Event handler for the menu
def event_handler(self):
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_p:
self.state_change("play")
print "Key Pressed: p"
if event.key == K_q:
print "Key Pressed: q"
pygame.quit()
sys.exit()
#Sample of the Event handler for "play"
def event_handler(self):
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_m:
self.state_change("menu")
print "Key Pressed: m"
if event.key == K_q:
print "Key Pressed: q"
pygame.quit()
sys.exit()