モジュールPygameでPythonを使用して小さなゲームを作成しています。
私はかなり基本的な(そしてかなり単純だと思います)状態マネージャーを実装しようとしました。
ただし、
現在問題があります
。「再生」状態に切り替えると、「メニュー」に戻ることができません。
これは、ステート マネージャーの設計方法に問題がありますか?
私には2つの方法がありますが、
- この
state_change
メソッドは、1 つの引数 (目的の状態) を取ります。 - この
state_check
メソッドは状態を唯一の引数として取り、それを現在の状態として返します。
以下に 2 つの方法を示します。
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()