今回は、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
:ゴールを示す物体
Enemy
は Character
クラスのサブクラスであり、さらに Enemy
のサブクラスとして CatEnemy
と DogEnemy
を作成しています。
ゴールは果たしてキャラクターなのか?という指摘もありそうですが、今回は便宜上キャラクターとしてみなし、Character
クラスのサブクラスとして Goal
を用意していきたいと思います(他に良いクラス名が思いつかなかった…)。
各クラスの連携例
いくつかのユースケースを挙げて各クラスがどのように連携してゲームが動作するのかについて説明しておきます。
キーボードの右キーが押された時
キーボードの右キーが押された時の各クラスの動作は主に下記のようになります。
- tkinter が
Game
クラスに右キーが入力されたことを通知 Game
クラスがCharacter
(Player
)に右に動くことを依頼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
クラスでは bind
や after
メソッドによってキーボード入力の受付や定期的な処理を実現し、さらに Screen
クラスではキャンバスを作成し、そこにゲームの画面を描画していきます。
スポンサーリンク
今後の解説の流れ
今回は、完成後のゲームのスクリプトの解説を行うのではなく、少しずつ機能を増やしながらゲームを作り込んでいくという流れで解説を行なっていきたいと思います。
ですので、解説は長いですし、ちょっとずつ変更を加えたり、一度作成したものを削除したりするので回りくどい解説にもなっていると思います。この辺りについてはご容赦いただければと思います。
また、クラスやリスト等の Python の基礎知識があることを前提とした解説になっています。解説を読んでよく分からない点などありましたら、別途ネット等で情報を補完しながら読んでいっていただけると幸いです。
さて、機能を作っていく順序としては、まずは必要なウィジェットをアプリ上に作成し、さらにゲーム画面の背景を表示するようにしていきたいと思います。この内容については下記のページで解説していきます。
【Python/tkinter】横スクロールアクションゲームを作る(ウィジェットの作成および背景の表示)次に、操作キャラクターを作成し、そのキャラクターの表示を行うようにしていきたいと思います。この内容については下記のページで解説していきます。
【Python/tkinter】横スクロールアクションゲームを作る(キャラクターの表示)続いて、操作キャラクターをキー入力によって移動 or ジャンプできるようにしていきます。この内容については下記のページで解説していきます。
【Python/tkinter】横スクロールアクションゲームを作る(キャラクターの移動)さらには、そのキャラクターの位置に応じて自動的に画面がスクロールするようにしていきます。この内容については下記のページで解説していきます。
【Python/tkinter】横スクロールアクションゲームを作る(画面の自動横スクロール)続いて、ゴールを導入し、操作キャラクターがゴールに当たった時にゲームクリア画面を表示するようにしていきます。この辺りの内容については下記のページで解説していきます。
【Python/tkinter】横スクロールアクションゲームを作る(ゴールの作成)次に、基本編の最後として、敵キャラクターを導入し、敵キャラクターに触れたときにゲームオーバー画面を表示したり、敵キャラクターを踏みつけた際に敵キャラクターを倒すような処理を行っていきます。この辺りの内容については下記のページで解説していきます。
【Python/tkinter】横スクロールアクションゲームを作る(敵キャラクターの作成)ここまでの解説で、今回作成しようとしているゲームとしての大枠は完成します。
あとは、詳細な当たり判定の行い方を下記ページで解説します。
【Python/tkinter】横スクロールアクションゲームを作る(より詳細な当たり判定)さらに、最後の下記ページで、作成したゲームのカスタマイズ例をいくつか紹介していきます。
【Python/tkinter】横スクロールアクションゲームを作る(カスタマイズ例)おそらく、作成したゲームでは物足りない動作や見た目があると思います。また、新たなキャラクターを導入してゲームの幅を広げたいと思ってくださる方もおられるかもしれません。
そういった不満や要望がある場合、ぜひ上記のカスタマイズの例を参考にしてご自身の手で作成したゲームを発展させてみていただきたいと思います。
こういった従来のプログラムを自身の手で発展させることで、プログラミング力を大きく伸ばすことができます。また、作成するのがゲームなので、割と楽しみながらプログラミング力を伸ばせるのではないかとも思います!
また、上記のページを読むだけでも、プログラミング・Python・tkinter 等を使ってどんなことができるのかを学ぶことができると思いますので、是非以降のページも読んでみていただければと思います!
まとめ
このページでは、「横スクロールアクションゲームの作り方」の解説ページのイントロダクションとして、これから作成していくゲームやクラス構成等について解説しました。
大体どのようなゲームを作成していくかがイメージできたでしょうか?
簡単そうなゲームですが、解説ページとしてはかなりボリュームがあります。その分詳しく解説しているつもりですし、学べることも多いと思いますので、作成するゲームに興味が出た方は是非次のページを読んでみていただければと思います!
次のページでは、作成していくゲームの土台となるウィジェットの作成及びゲームの背景の表示を行なっていきます!
【Python/tkinter】横スクロールアクションゲームを作る(ウィジェットの作成および背景の表示)オススメ参考書(PR)
簡単なアプリやゲームを作りながら Python について学びたいという方には、下記の Pythonでつくる ゲーム開発 入門講座 がオススメです!ちなみに私が Python を始めるときに最初に買った書籍です!
下記ようなゲームを作成しながら Python の基本が楽しく学べます!素材もダウンロードして利用できるため、作成したゲームの見た目にも満足できると思います。
- すごろく
- おみくじ
- 迷路ゲーム
- 落ち物パズル
- RPG
また本書籍は下記のような構成になっているため、Python 初心者でも内容を理解しやすいです。
- プログラミング・Python の基礎から解説
- 絵を用いた解説が豊富
- ライブラリの使い方から解説(tkitner と Pygame)
- ソースコードの1行1行に注釈
ゲーム開発は楽しくプログラミングを学べるだけでなく、ゲームで学んだことは他の分野のプログラミングにも活かせるものが多いですし(キーボードの入力受付のイベントや定期的な処理・画像や座標を扱い方等)、逆に他の分野のプログラミングで学んだ知識を活かしやすいことも特徴だと思います(例えばコンピュータの動作に機械学習を取り入れるなど)。
プログラミングを学ぶのにゲーム開発は相性抜群だと思います。
Python の基礎や tkinter・Pygame の使い方をご存知なのであれば、下記の 実践編 をいきなり読むのもアリです。
実践編 では「シューティングゲーム」や「アクションゲーム」「3D カーレース」等のより難易度の高いゲームを作りながらプログラミングの力をつけていくことができます!
また、単にゲームを作るのではなく、対戦相手となるコンピュータの動作のアルゴリズムにも興味のある方は下記の「Pythonで作って学べるゲームのアルゴリズム入門」がオススメです。
この本はゲームのコンピュータ(AI)の動作アルゴリズム(思考ルーチン)に対する入門解説本になります。例えばオセロゲームにおけるコンピュータが、どのような思考によって石を置く場所を決めているか等の基本的な知識を得ることが出来ます。
プログラミングを挫折せずに続けていくためには楽しさを味わいながら学習することが大事ですので、特にゲームに興味のある方は、この辺りの参考書と一緒に Python を学んでいくのがオススメです!