【初心者向け】KivyによるWindowsアプリ作成30 難易度調整の画面と画面遷移の実装

今回から数回に分けて、ゲーム難易度の調整を行うための機能を実装していきたいと思います。

初回である今回は、難易度調整用の画面と各画面間の遷移を実装します。コードの量は多いですが、使用するクラスやメソッドなどは過去の記事で紹介済みのものばかりで、特段難しいことはありませんので、復習がてら実装を進めて頂ければと思います。

また、コード全量はGitHubにアップしていますので、必要に応じてご参照下さい。

<スポンサーリンク>

難易度調整に関する要件

実装に取り掛かる前に、どのような難易度調整機能をアプリに持たせるか、以前検討した要件を改めて確認しておきたいと思います。

それでは今回からゲーム画面の実装に入り、ゲーム内容を作り込んでいきたいと思います。 今回はまずゲーム画面の設計を簡単に行った上で、後半...

該当する部分だけピックアップしますと、

  • 表示する文字種類は、設定で以下の3段階から選べるものとする。
    • Easy : アルファベット小文字のみ
    • Normal : アルファベット大文字小文字
    • Hard : アルファベット大文字小文字 + 数字
  • デフォルトはEasy設定とする。

というものが、難易度調整として求められる機能です。

この機能を満たすために、ユーザが難易度を選択するための方法をアプリに持たせる必要がありますが、今回は選択用の専用画面を作成することによって実現したいと思います。

なお、「デフォルトはEasy設定とする」という点については、既にPythonファイル側にある、

difficulty = "easy"

という記述で実装済みですので、今回は考慮する必要はありません。

画面と画面遷移の実装

では、実装に移っていきましょう。

前述の通り、今回記述するコードで使うKivy/Pythonの機能は、過去の記事で紹介したものばかりですので、特に説明は記載しません。コードを見てみて、復習がてら何をやっているのかを考えてみて頂ければと思います。

不明な点があれば、過去の記事も読み返してみて下さい。

まずは、難易度調整画面をKvファイル上に定義します。場所は、GameScreenクラスの後ろぐらいが良いと思います。

<DifficultyScreen>:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            size_hint_y: 0.195
            Label:
                size_hint_x: 0.8
                text: "Difficulty"
                font_size: 48
            Button:
                size_hint_x: 0.2
                text: "to Title"
                font_size: 24
                on_press: root.returnButtonClicked()
        Label:
            size_hint_y: 0.005
            canvas.before:
                Color:
                    rgba: 1, 1, 1, 1
                Rectangle:
                    pos: self.pos
                    size: self.size

        BoxLayout:
            size_hint_y: 0.8
            orientation: "vertical"
            BoxLayout:
                padding: 20, 40
                Button:
                    id: easy
                    text: "Easy"
                    font_size: 48
                Button:
                    id: normal
                    text: "Normal"
                    font_size: 48
                Button:
                    id: hard
                    text: "Hard"
                    font_size: 48
            Label:
                id: difficulty_description
                font_size: 36

追加した画面には、「to Title」という、タイトル画面に戻るためのボタンがあります。そこで、Pythonファイル側にもこのDifficultyScreenクラスを定義し、タイトル画面に戻るメソッドを記述しておきましょう。

class DifficultyScreen(Screen):
    def returnButtonClicked(self):
        sm.transition.direction = "right"
        sm.current = "title"

続いて、ScreenManagerでこの画面を扱えるよう、ScreenManagerインスタンスにこの画面を登録しておきます。

class TypingApp(App):
    def build(self):
        sm.add_widget(TitleScreen(name="title"))
        sm.add_widget(GameScreen(name="game"))
        sm.add_widget(DifficultyScreen(name="difficulty")) #この行を追加
        return sm

なお、現時点では折角新しい画面を作ったにも関わらず、この画面に遷移する手段がありません。ですので、この遷移を実装します。

具体的には、アプリのタイトル画面右下にあるボタンを押すと、この難易度調整画面に遷移するよう、Kvファイル/Pythonファイル側両方に修正を加えます。

まず、Kvファイルには、TitleScreen Widget上の、該当するButton Widgetに、on_pressプロパティを追加します。

<TitleScreen>:
    BoxLayout:
#省略
        BoxLayout:
#省略
            Button:
                text: "Difficulty"
                font_size: 36
                on_press: root.difficultyButtonClicked() #この行を追加

一方、Pythonファイル側では、上記、on_pressプロパティで指定したメソッドを記述します。

class TitleScreen(Screen):
    def startButtonClicked(self):
#省略
    def preStart(self):
#省略
    def difficultyButtonClicked(self): #このメソッドを追加
        sm.transition.direction = "left"
        sm.current = "difficulty"

実装作業は以上です。

テスト実行

では、テストのためにプログラムを実行してみましょう。

タイトル画面の右下にある「Difficulty」ボタンは、これまで押しても何も反応がありませんでしたが、今回の実装を行うことで難易度調整用の画面に遷移するようになります。

中段に、Easy, Normal, Hardという、難易度を表すボタンがありますが、押下時の処理は未実装です。次回から実装していきます。

ここでは、「to Title」ボタンを押してみて、タイトル画面にきちんと戻るかどうかだけ、確認してみて下さい。

終わりに

今回やっていることの内容は過去の記事でカバー済みであったため、特に説明を行いませんでしたが、何をやっているコードなのかイメージはつきましたでしょうか?イメージがつくようであれば、これまで紹介させて頂いた事項は、大体ご理解頂けているのではないかな、と思います。

さて、次回は今回作成した画面を土台として、難易度を実際に調整するための機能を作り込んでいきたいと思います。

<スポンサーリンク>

シェアする

フォローする