ゲーム状態を導入する

ゲーム状態を導入し、タイトル画面とプレイ画面を切り替えられるようにします。

タイトル画面を作成する

まずは、タイトル画面を作成します。

新しいtitle.pyファイルに、簡単なタイトル画面を記述していきます。

import pygame
from pygame.locals import *
import sys

import cursor

class Title():
    def __init__(self):
        self.frame = 0
        self.select = 0
        self.title_font = pygame.font.Font("data/minamoji04.ttf", 48)
        self.menu_font = pygame.font.Font("data/minamoji04.ttf", 32)
        self.credit_font = pygame.font.SysFont(None, 32)

        self.title = self.title_font.render(u"スペースラビップル", True, (255, 255, 255))
        self.start = self.menu_font.render(u"はじめる", True, (255, 255, 255))
        self.exit = self.menu_font.render(u"やめる", True, (255, 255, 255))
        self.credit = self.credit_font.render(u"- Jizo Games 2021 -", True, (255, 255, 255))

        self.cursor = cursor.Cursor(220, 230, (255, 255, 255))

    def update(self):
        self.frame += 1
        if self.select == 0:
            self.cursor.y = 230
        elif self.select == 1:
            self.cursor.y = 280

    def draw(self, screen):
        screen.fill((0, 0, 0))
        screen.blit(self.title, ((320 - (self.title.get_width() / 2)), 100))
        screen.blit(self.credit, ((320 - (self.credit.get_width() / 2)), 420))
        screen.blit(self.start, ((320 - (self.start.get_width() / 2)), 225))
        screen.blit(self.exit, ((320 - (self.exit.get_width() / 2)), 275))
        self.cursor.draw(screen)

黒い背景に、テキストとカーソルを配置しただけの簡単なタイトル画面です。

ゲーム状態を導入する

ゲーム状態を表すgame_stateという変数を用意します。

game_stateがTITLEのときと、STAGEのときで処理を分岐することで画面を切り替えることができます。

仕組みは簡単ですね。

# タイトル画面をインスタンス化
self.title = title.Title()

global game_state
game_state = TITLE

update()とdraw()内で、処理を分岐していきます。

def update(self):
    global game_state
    if game_state == TITLE:
        self.title.update()
    elif game_state == STAGE:
        self.bgx = (self.bgx - self.scroll_speed) % SCR_RECT.width
        self.all.update()
        self.collision_detection()
        self.hp.update()

def draw(self, screen):
    global game_state
    if game_state == TITLE:
        self.title.draw(screen)
    elif game_state == STAGE:
        screen.blit(self.bg, (self.bgx, 0))
        screen.blit(self.bg, (self.bgx - SCR_RECT.width, 0))
        self.all.draw(screen)
        self.hp.draw(screen)

これまでの処理は、game_stateがSTAGEのときの処理にまとめます。

タイトル画面のキー操作についても、追記します。

def key_handler(self):
    if game_state == TITLE:
        if event.type == KEYUP and event.key == K_SPACE:
            if self.title.select == 0:
                game_state = STAGE
            elif self.title.select == 1:
                pygame.quit()
                sys.exit()
        elif event.type == KEYDOWN and event.key == K_UP:
            if self.title.select > 0:
                self.title.select -= 1
        elif event.type == KEYDOWN and event.key == K_DOWN:
            if self.title.select < 1:
                self.title.select += 1

もちろん画像を使ったり、色を変えたりすることもできるので、凝ったタイトル画面を作ることもできます。

タイトル画面はゲームの顔なので、納得できるものを作りたいですよね。