【Python/tkinter】横スクロールアクションゲームを作る(イントロダクション)

横スクロールアクションゲームを作る(イントロダクション)の解説ページアイキャッチ

今回は、Python の tkinter を利用して、簡単な横スクロールアクションゲームを作っていきたいと思います!

出来上がりのゲームは下の動画のようになります!

 

この動画の通り、作成するのは簡単なゲームではありますが、tkinter で作るとなると割と大変なので、このページを含めて9ページの構成で解説させていただきます。

横スクロールアクションゲームを作る(ウィジェットの作成と背景表示)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(ウィジェットの作成および背景の表示) 横スクロールアクションゲームを作る(キャラクターの表示)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(キャラクターの表示) 横スクロールアクションゲームを作る(キャラクターの移動)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(キャラクターの移動) 横スクロールアクションゲームを作る(画面の自動横スクロール)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(画面の自動横スクロール) 横スクロールアクションゲームを作る(ゴールの作成)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(ゴールの作成) 横スクロールアクションゲームを作る(敵キャラクターの作成)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(敵キャラクターの作成) 横スクロールアクションゲームを作る(より詳細な当たり判定)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(より詳細な当たり判定) 横スクロールアクションゲームを作る(カスタマイズ例)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(カスタマイズ例)

このページはこれらの解説ページのイントロダクションであり、作り方の方針であったり、クラス分けについて解説していきたいと思います。

また、上記の最初6つのページがゲーム作成の基本編であり、これらのページでの解説内容に基づいてプログラミングすることでゲームの大枠は完成します。

残りの2つのページは応用編で、1つ目のページでは基本編で作成したゲームに対して詳細な当たり判定を導入し、2つ目のページではゲームのカスタマイズ例の紹介を行なっていきます。

ここで一点補足しておくと、ゲームを単に作るのであれば、tkinter よりもゲームに特化したライブラリ(PyGame とか)を使用する方が手っ取り早く、出来もいいものになると思います。

ただ、今回はゲームを作ることが目的ではなく、アプリを作りながらプログラミングや Python、さらには tkinter(あとは PIL)を用いてどんなことができるのかについて学んでいただくことを目的としています。

で、どうせなら作っていて楽しいものが良いと思って題材としてゲームを選んでいます。ですので、ゲームの作り方を学びたいという方よりかは、楽しくゲームを作りながらプログラミングを体験したいという方向けのページとなっています。

作成するゲーム

今回、横スクロールアクションゲームを作成する上で主に利用するウィジェットは下記の3つとなります。

  • メインウィンドウ
  • キャンバス
  • スクロールバー

スクロールバーに関しては、最初は手動で画面をスクロールするために用意しますが、自動で画面がスクロールになった際には削除します。

ですので、最終的に使用するウィジェットはメインウィンドウとキャンバスのみです。

操作キャラクターや敵キャラクター等のオブジェクトに関しては、キャンバスに画像を描画することで表現していきます。

画像を描画することで各オブジェクトの表示を行うことを説明する図

操作キャラクターに関しては、キーボードのキー入力により横方向の移動およびジャンプができるようにしていきます。

また、敵キャラクターに関しても横方向の移動およびジャンプを行えるようにしますが、キーボードのキー入力ではなく、定期的にこれらの動作を行うようにしていきたいと思います。

各キャラクターの移動方向を示した図

当たり判定を行うことで、操作キャラクターが敵キャラクターを踏みつけて倒したり、操作キャラクターが敵キャラクターにぶつかってゲームオーバーになったり、という処理も実現していきます。

ゲームオーバー時に表示される画面

また、ゴールも用意し、このゴールに触れた際にはゲームクリア画面を表示するようにしていきます(単に文字をキャンバスに描画するだけですが…)。

ゲームクリア時に表示される画面

さらに、今回作成するのは “横スクロール” のアクションゲームですので、操作キャラクターの位置に応じて表示領域を変化させるようにしていきたいと思います。

ゲーム全体の画面としては横長のものになりますが、表示される領域はその一部のみとなります。

ゲーム全体の画面と表示領域の関係を示す図

この表示領域をキャラクターが存在する位置に合わせて移動させていきます。

操作キャラクターの位置に応じて表示領域が変化する様子

本当は、表示される領域内の敵キャラクターのみを動作させ、背景画像も表示される領域内のみ描画するようにした方がメモリ使用量や CPU への負荷も少なくなります。

ただし、今回はできるだけ簡単に作成するため、表示されていない領域も含め、ゲーム内に存在する敵キャラクター全てを動作させ、背景画像も表示されていない領域も含めて描画するようにしていきたいと思います。

使用するモジュール

ゲームの大枠を作成するのには主に tkinter を利用します。

また、キャラクター等は画像で表現していくため、画像を扱うためのモジュールも利用していきます。今回はそのモジュールとして PIL の Image・ImageOps・ImageTk を利用したいと思います。

さらに、ゲームにランダム性を持たせるために random モジュールも利用します。

PIL に関しては事前に別途インストールしておく必要があるので注意してください。

スポンサーリンク

クラス構成

今回は大きく分けて下記の3つにクラス分けしてゲームを作成していきたいと思います。

  • Game
  • Screen
  • Character

初めに断っておきますが、この「横スクロールアクションゲームの作り方」の解説ページでは、ゲームとして動作するアプリを作成することを最優先に解説を進めていきますので、クラス構成はイマイチな点が多いです(言い訳ですが….)。

例えば、Character クラスのデータ属性も多いですし、サブクラスとスーパークラスとの依存も大きいです。

もっと変更しやすいようなクラス構成にしたい場合や、クラス構成について学びたい方については、一通りゲームが出来上がった際にでもデザインパターンについて学び、それを適用してみると良いと思います!

また、メソッドによっては行数が非常に多くなるものもありますので、その点もご了承いただければと思います。

では、各クラスの責務について解説していきます。

Game

Game クラスは、作成するゲーム全体を制御することを役割としたクラスとして作成していきたいと思います。

具体的には、Game クラスが Screen クラスや Character クラス(およびそのサブクラス)のオブジェクトの作成と、これらのオブジェクトに対する処理の依頼(メソッドの実行)を行うように作成していきます。

また、ユーザーからのキー入力の受付を行ったり、時間経過した時のイベント受付などもこのクラスの役割としたいと思います。

Screen

Screen クラスは、画面の表示を行うことを役割とするクラスとして作成していきたいと思います。

画面の表示を行うためのウィジェットを作成したり、ゲームの背景や各キャラクターの表示等はこの Screen クラスが行います。

スポンサーリンク

Character

Character クラスは、ゲーム内に登場するキャラクター(操作キャラクター・敵キャラクター・ゴールなど)を実現するためのクラスとして作成していきたいと思います。

各キャラクターがどの位置に存在するのかを管理したり、各キャラクターを表す画像を管理したり、また Game クラスからの依頼によりキャラクターの位置を変更したり当たり判定を行ったり、といったような、キャラクターに関するデータの管理や処理をこのクラスが担当します。

登場するキャラクターはいくつかありますので、このキャラクターの種類ごとに Character クラスのサブクラスを用意していきたいと思います。より具体的には、今回は下記の5つのサブクラスを用意したいと思います。

  • Player:プレイヤーが操作するキャラクター
  • Enemy:敵キャラクター
    • CatEnemy:猫型の敵キャラクター
    • DogEnemy:犬型の敵キャラクター
  • Goal:ゴールを示す物体

EnemyCharacter クラスのサブクラスであり、さらに Enemy のサブクラスとして CatEnemyDogEnemy を作成しています。

ゴールは果たしてキャラクターなのか?という指摘もありそうですが、今回は便宜上キャラクターとしてみなし、Character クラスのサブクラスとして Goal を用意していきたいと思います(他に良いクラス名が思いつかなかった…)。

各クラスの連携例

いくつかのユースケースを挙げて各クラスがどのように連携してゲームが動作するのかについて説明しておきます。

キーボードの右キーが押された時

キーボードの右キーが押された時の各クラスの動作は主に下記のようになります。

  • tkinter が Game クラスに右キーが入力されたことを通知
  • Game クラスが CharacterPlayer)に右に動くことを依頼
  • Game クラスが Character クラスに当たり判定を依頼
  • 必要に応じて Game クラスが Character クラスに “当たった時の処理” を依頼
    • 移動や状態の変更など

この各クラスの動きをシーケンス図で表すと下図のようになります。

キー入力された時のシーケンス図

一定時間が経過した時

今回作成するゲームでは、一定時間毎にゲーム内のキャラクターの位置や状態の更新、キャンバスへの画像の描画を行うようにしていきます。一定時間経過した時の各クラスの動作は主に下記のようになります。

  • tkinter が Game クラスに一定時間経過したことを通知
  • Game クラスが Character クラスに更新処理を依頼
  • Game クラスが Character クラスに当たり判定を依頼
  • 必要に応じて Game クラスが Character クラスに “当たった時の処理” を依頼
    • 移動や状態の変更など
  • Game クラスが Character クラスから画像や座標を取得
  • Game クラスが Screen クラスに画像や座標を渡して画面の更新を依頼
  • 必要に応じてメッセージの表示や画面のスクロールなどを実施

この各クラスの動きをシーケンス図で表すと下図のようになります。

定期更新処理時のシーケンス図

スクリプトの大枠

このページの、特に クラス構成 の章で解説してきたことを踏まえて作成したスクリプトの大枠が下記のようになります(現状では、実行しても真っ白なアプリが起動するだけです)。

スクリプトの大枠
import tkinter
from PIL import Image, ImageTk, ImageOps
import random

class Character:

	def __init__(self):
		pass

class Player(Character):

	def __init__(self):
		pass

class Enemy(Character):

	def __init__(self):
		pass

class CatEnemy(Enemy):

	def __init__(self):
		pass

class DogEnemy(Enemy):

	def __init__(self):
		pass

class Goal(Character):

	def __init__(self):
		pass

class Screen:

	def __init__(self, master):
		self.master = master

class Game:

	def __init__(self, master):
		self.master = master

def main():
	app = tkinter.Tk()
	game = Game(app)
	app.mainloop()

if __name__ == "__main__":
	main()

上記ではほぼ、クラスの定義と main 関数の作成しか行なっていませんが、このスクリプトを作り込んでいくことで、最初に紹介した動画のようなゲームに仕立てていきます。

Game クラスと Screen クラスに用意した self.master は、メインウィンドウとなるウィジェットを参照するためのデータ属性になります。

これを利用して、Game クラスでは bindafter メソッドによってキーボード入力の受付や定期的な処理を実現し、さらに Screen クラスではキャンバスを作成し、そこにゲームの画面を描画していきます。

スポンサーリンク

今後の解説の流れ

今回は、完成後のゲームのスクリプトの解説を行うのではなく、少しずつ機能を増やしながらゲームを作り込んでいくという流れで解説を行なっていきたいと思います。

ですので、解説は長いですし、ちょっとずつ変更を加えたり、一度作成したものを削除したりするので回りくどい解説にもなっていると思います。この辺りについてはご容赦いただければと思います。

また、クラスやリスト等の Python の基礎知識があることを前提とした解説になっています。解説を読んでよく分からない点などありましたら、別途ネット等で情報を補完しながら読んでいっていただけると幸いです。

さて、機能を作っていく順序としては、まずは必要なウィジェットをアプリ上に作成し、さらにゲーム画面の背景を表示するようにしていきたいと思います。この内容については下記のページで解説していきます。

横スクロールアクションゲームを作る(ウィジェットの作成と背景表示)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(ウィジェットの作成および背景の表示)

次に、操作キャラクターを作成し、そのキャラクターの表示を行うようにしていきたいと思います。この内容については下記のページで解説していきます。

横スクロールアクションゲームを作る(キャラクターの表示)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(キャラクターの表示)

続いて、操作キャラクターをキー入力によって移動 or ジャンプできるようにしていきます。この内容については下記のページで解説していきます。

横スクロールアクションゲームを作る(キャラクターの移動)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(キャラクターの移動)

さらには、そのキャラクターの位置に応じて自動的に画面がスクロールするようにしていきます。この内容については下記のページで解説していきます。

横スクロールアクションゲームを作る(画面の自動横スクロール)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(画面の自動横スクロール)

続いて、ゴールを導入し、操作キャラクターがゴールに当たった時にゲームクリア画面を表示するようにしていきます。この辺りの内容については下記のページで解説していきます。

横スクロールアクションゲームを作る(ゴールの作成)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(ゴールの作成)

次に、基本編の最後として、敵キャラクターを導入し、敵キャラクターに触れたときにゲームオーバー画面を表示したり、敵キャラクターを踏みつけた際に敵キャラクターを倒すような処理を行っていきます。この辺りの内容については下記のページで解説していきます。

横スクロールアクションゲームを作る(敵キャラクターの作成)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(敵キャラクターの作成)

ここまでの解説で、今回作成しようとしているゲームとしての大枠は完成します。

あとは、詳細な当たり判定の行い方を下記ページで解説します。

横スクロールアクションゲームを作る(より詳細な当たり判定)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(より詳細な当たり判定)

さらに、最後の下記ページで、作成したゲームのカスタマイズ例をいくつか紹介していきます。

横スクロールアクションゲームを作る(カスタマイズ例)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(カスタマイズ例)

おそらく、作成したゲームでは物足りない動作や見た目があると思います。また、新たなキャラクターを導入してゲームの幅を広げたいと思ってくださる方もおられるかもしれません。

そういった不満や要望がある場合、ぜひ上記のカスタマイズの例を参考にしてご自身の手で作成したゲームを発展させてみていただきたいと思います。

こういった従来のプログラムを自身の手で発展させることで、プログラミング力を大きく伸ばすことができます。また、作成するのがゲームなので、割と楽しみながらプログラミング力を伸ばせるのではないかとも思います!

また、上記のページを読むだけでも、プログラミング・Python・tkinter 等を使ってどんなことができるのかを学ぶことができると思いますので、是非以降のページも読んでみていただければと思います!

まとめ

このページでは、「横スクロールアクションゲームの作り方」の解説ページのイントロダクションとして、これから作成していくゲームやクラス構成等について解説しました。

大体どのようなゲームを作成していくかがイメージできたでしょうか?

簡単そうなゲームですが、解説ページとしてはかなりボリュームがあります。その分詳しく解説しているつもりですし、学べることも多いと思いますので、作成するゲームに興味が出た方は是非次のページを読んでみていただければと思います!

次のページでは、作成していくゲームの土台となるウィジェットの作成及びゲームの背景の表示を行なっていきます!

横スクロールアクションゲームを作る(ウィジェットの作成と背景表示)の解説ページアイキャッチ【Python/tkinter】横スクロールアクションゲームを作る(ウィジェットの作成および背景の表示)