ゲーム開発

【Pyxel】Pythonでレトロゲームを作ろう! Day 3 -クラス化-

Pyxelでレトロゲームを作る3

こんにちは!

くるる
くるる
人気フクロウの”くるる”@kururu_owl だよー
はやぶさ
はやぶさ
現役エンジニアの”はやぶさ”@Cpp_Learningです

前回こんな記事を書きました↓

Pyxelでレトロゲームを作る2
【Pyxel】Pythonでレトロゲームを作ろう! Day 2 -マウス操作-こんにちは! 前回こんな記事を書きました↓ https://cpp-learning.com/pyxel_d...

本記事は『Pythonでレトロゲームを作ろう!』シリーズの”Day3”です!

くるる
くるる
楽しみー!
はやぶさ
はやぶさ
今日も楽しく勉強しましょう!

【Day 3】Pyxelでレトロゲームを作ろう!

”Day2”ではマウス操作で猫を動かしました。

くるる
くるる
意外と簡単にできた!pyxel最高!

ただ、Appクラスがcat関数を持つという、ちょっとスマートじゃない作りでした。

なので本記事では、catをクラス化して”柔軟なソースコード”にする方法を説明します。

くるる
くるる
正直なんで”Day2”のソースコードがスマートじゃないか分かってない…本記事でしっかりクラスについて学びたいな♪

くるるちゃんは今日もモチベーション高めです(ง •̀ω•́)ง✧

クラス化のメリット

クラス化のメリット…答えられますか?

くるる
くるる
以下の記事に”クラス”というか”理想のソフトウェア”について”はやぶさ先生”が教えてたな…
python(pygame)でゲームを作る
【Python】ゲームソフト開発を題材にしたオブジェクト指向入門ゲームソフト作成を題材にした「オブジェクト指向」の入門記事を書きました。オブジェクト図/クラス図の書き方や考え方のポイントも説明した実践的な内容になっています!ソフトウェア設計やソフトウェア開発を学びたい人にオススメの記事です!...
くるる
くるる
確か大事なのは…

『レゴブロックのような柔軟なソフトウェア』だよね!

理想的なソフトウェア設計

(※上図のブロックは”クラス””インスタンス”のイメージです!)

はい!私の理想は『レゴブロックのような柔軟な開発ができるソフトウェア』です!

あと、もっと大事なのは…

『読み手のことを想ってソフトウェア設計図およびコードを書くのが正解』

という考え方です(*・ω・)ノ♪

ソフトウェア(設計)については、様々な考え方があります。上記は、私の”思想”なので「正しい/正しくない」という意見はナンセンスです!ただし「私の思想は○○だ!」という熱い意見は持っていて良いと思います(*・ω・)ノ♪

ソフトウェア設計図を作成するモチベーション

うーん。。

くるる
くるる
クラスを作るってことは、先にソフトウェア設計図を作るって意味だよね?
くるる
くるる
オブジェクト図やクラス図を作るの大変なんだよな…

かっちりした現場だと「ソフトウェア設計図の作成」⇒「実装」というフローでソフトウェア開発を進めます。

チームで開発する場合、以下の理由でソフトウェア設計図を作成するモチベーションがあります。

【ソフトウェア設計図を作成するモチベーション】

  • メンバーがどのクラスを担当するか?
  • どのくらいの規模のソフトウェアになるか見積もる
  • 抽象化/部品化/メンテナンス性/責務の事前検討

など

ただ、”くるる”ちゃんの言う通り、ソフトウェア設計図って作るの大変です…

特に趣味で個人がソフトウェアを作る場合、ソフトウェア設計図を作るモチベーションは、あまり高くないような気がしています…

本記事(本シリーズ)は「ソフトウェアの実装」をメインに説明するため「ソフトウェア設計」の説明を割愛しますが…本当は作った方が良いです。

クラスを作成するモチベーション

ん?

くるる
くるる
ソフトウェア設計図(クラス図など)を作らないってことは、クラスも作らないってこと??
はやぶさ
はやぶさ
いやいや
  • ソフトウェア設計図を作らない
  • 個人でのソフトウェア開発

だったとしても…

『読み手のことを想ってソフトウェア設計図およびコードを書くのが正解』というコンセプトは変わらないよ!

この読み手には”未来の自分”も含まれています!

1か月前に作ったコードを見直したとき「何してるか分からない…」では困ります!

”未来の自分”のためにも丁寧にソースコードを作りましょう!

くるる
くるる
はーい!それでクラス化が必要なんだね!

正解!

はやぶさ
はやぶさ
人は”忘れる生き物”だからね!理解できないものは、どんどん忘れてしまう!

クラスは”責務”を考えて作成する”レゴブロック”なのでソースコードの「使い勝手」や「管理」がしやすくなります!

くるる
くるる
クラス化でソースコードの整理整頓~♪

”くるる”ちゃん良いこと言うなぁ

  • 相手を想って何かを作成するということは”未来の自分”のためにもなります!
  • クラス化することで、ソースコードと頭を整理でき、かつソースコードの可読性が向上します!
スポンサーリンク

クラス化のメリット -具体例-

クラス化のメリットを具体例で見てみましょう!

Day2のソースコードは以下の通りでしたね↓

このコードだとAppクラスがcatの情報(操作)を持っていることになります。

今は、cat関連の属性(プロパティ)を持っていないけど…

catの情報…例えば、座標(位置)の情報を属性として持ちたいときは、どんな風にコードを変更すれば良いかな?

くるる
くるる
えーっと。こんな感じかな↓

くるる
くるる
”self.cat_x”と”self.cat_y”を追記したよ!
はやぶさ
はやぶさ
じゃあ猫をもう一匹増やしてみようか!
くるる
くるる
!!!えーっと。じゃあ…

くるる
くるる
さらに”self.cat_x2”と”self.cat_y2”を追記したよ!
はやぶさ
はやぶさ
このコードを1か月後に見直したとき、”cat_x”と”cat_x2”で混乱しないかな?
くるる
くるる
うぅ…混乱しない自信がないよー(´;ω;`)

泣きそうな”くるる”ちゃんが愛おしい!

はやぶさ
はやぶさ
ごめんよー”くるる”ちゃん!大丈夫だから!!この問題をクラス化で解決しよう!

クラスの責務を明確化

Appもクラスなので責務があります。

どんな責務を持たせるかは開発者次第ですが…私なら、こんな感じ↓

【Appの責務】

ゲーム画面の管理

【具体的な処理】

  • ゲーム画面の初期設定
  • ゲーム画面の更新
  • ゲーム画面の描画処理
  • (インターフェース処理)

さっき”くるる”ちゃんが書いたコードだと、Appの責務に『猫の管理』も追加した感じだね!

まぁ猫が2匹だけなら良いけど、猫の数が増えたり、猫以外のキャラまでAppが管理すると…間違いなく『ファット(太った)クラス』になります。

くるる
くるる
おデブちゃん!笑

さっきまで泣きそうだったのに、もうケロッとしてる…可愛い(*・ω・)ノ♪

『ファット(太った)クラス』は管理が難しいし、Appの責務を考えれば『猫情報』まで持たせるのは少し不自然です。

くるる
くるる
さっき、あまり考えずに”cat_x”を追記しちゃったけど、Appの責務を考えると確かに不自然だね!納得!!

「クラスの責務」と「追記コード」のマッチングを考えてみて下さい。不自然だと感じたら『ファット(太った)クラス』になっている可能性があります。ダイエットさせましょう!

猫クラス設計

おぉ~

くるる
くるる
少し頭がスッキリした!!
くるる
くるる
猫クラス作らないと!って気分になってる♪ワクワク
はやぶさ
はやぶさ
じゃあ一緒に作っていこうねー

クラス作成のポイントは以下の通りです。

『抽象化/部品化/メンテナンス性/責務』を考えてクラス化する

今回は、こんな感じで猫クラスを設計してみました↓

現時点では、猫が動くだけなので属性としては、「座標の情報」と「猫画像のID情報」だけあれば十分です。

操作(関数)は「座標情報の更新」のみです。

くるる
くるる
想像していたよりシンプル!
くるる
くるる
ん?Vec2クラスってのは何?
はやぶさ
はやぶさ
今後キャラが増えると仮定したとき、各キャラが共通して持ってる属性(情報)って何だと思う?
くるる
くるる
猫も犬も鳥も座標の情報を持ってると思う!!

正解!

はやぶさ
はやぶさ
なので、共有部品として”ベクトル”クラスも設計しました

猫のクラス化によるメリット

猫をクラス化したことで「本当にソースコードが扱いやすくなったのか?」を確認してみます。

クラスは設計図なので、実体化(インスタンス生成)して初めてゲーム画面に登場します。

クラス図の説明用

※フクロウの絵になってるけど、猫に置き換えて考えて下さい…

実体化(インスタンス生成)のコードは、こんな感じです↓

猫の名前は”イチロー”・”ジロー”・”サブロー”にしました。

”イチロー”・”ジロー”は見た目が同じ…つまり同じ画像を使って実体化させます!

”サブロー”は兄とは違う画像から実体化させます!

くるる
くるる
1つのクラスから複数のインスタンスを生成できるの便利!

また、”イチロー”・”ジロー”・”サブロー”の座標は以下のように表現できます。

どの猫の座標なのか明確なので可読性(メンテナンス性)が高いです!

くるる
くるる
”cat_x”・”cat_y”より分かりやすいし、”cat_x2”・”cat_y2”みたいに猫の数だけ変数が増えなくて良いね!

クラス化のメリットが分かってくれて嬉しいです!

【クラス化するメリット】

  • 各インスタンスの情報はクラス(設計図)を見るだけで把握できる
  • クラスは共通部品(レゴブロック)なので、コピペで簡単に移植できる
  • クラスを設計するとき、責務を考えるため、コードと頭を整理できる

おぉ!!!

くるる
くるる
「catクラスをコピペ」⇒「クラス名変更」で簡単に「dogクラス」も作れちゃうね!
はやぶさ
はやぶさ
このcatクラスの抽象度が高いからね!割と何にでも使えるよ!!
くるる
くるる
まさに「クラス」=「レゴブロック」って感じ♪
くるる
くるる
はやぶさ先生よりクラスすげー

(そこは素直に”はやぶさ先生”すげーでも良かったと思うなぁ…)

最終的に完成したソースコード

以上を踏まえて、最終的に完成したソースコードは以下の通りです。

ざっくりとしたフローは以下の通り

  1. 画像(IMG_ID1)の猫を実体化(インスタンス生成):34行目
  2. 猫の座標をマウスの座標に更新:44行目
  3. 猫を描画:51行目

①は最初の一回だけ、②と③はアプリを終了するまで繰り返します。

クラス化のメリットで”イチロー”・”ジロー”・”サブロー”の3匹の猫を例に説明したけど、このコードでは1匹の猫しか生成していません…

今回は、Day2のcatをクラス化するのが目的だったので↓

Pyxelで猫を操作

Day2と↑のデモで見た目に違いはないけど、それでもクラス化するメリットは伝わったかな?

くるる
くるる
クラス化することでコードは増えてるけど…
くるる
くるる
なんか読みやすいよー!!
くるる
くるる
それに今回は1匹”にゃーん”だけど、簡単に2匹”にゃーん”にできるって分かると…なんかスマート!!
はやぶさ
はやぶさ
このコード1か月後に見直しても問題なさそうかな?

うん!うん!うん!うん!と何度も頷く”くるる”ちゃんが今日も可愛い(*・ω・)ノ♪

「1か月後に見直しても問題ないと思えるソースコード」「他人がスッと理解できるソースコード」は、品質の高いソースコードです。『クラスを使えば品質が高くなる!』というわけではありませんが、クラスを上手に使うことで品質は向上できますよ(*・ω・)ノ♪

おわりに

『Pythonでレトロゲームを作ろう!Day 3-クラス化-』について説明しました。

ゲーム開発(pyxelの使い方)を題材にして、楽しくプログラミングの勉強ができると良いなーとか考えながら、シリーズ記事を書いています。

そして、今回は説明が難しい”クラス”の話でした。

くるる
くるる
クラスってなんか難しそう!使いどころが分からない!!

という人やフクロウが本記事を読んで、少しでも”頭がスッキリした”となっていると、大変嬉しいです!

クラスの説明って難しいね!笑

あまり小難しくなり過ぎずに最後まで楽しく読めるように配慮したつもりだけど…

楽しんでくれたかな?次回もお楽し…

くるる
くるる
ちょっと待って!!
くるる
くるる
今回、最終的に完成したソースコード…Day2であった”猫の向きを変えるマウス左クリック操作”が無くなってるよ!
くるる
くるる
これじゃ後ろを振り返らない猫になっちゃう!(あれ?ちょっとカッコイイかも?)
はやぶさ
はやぶさ
あぁそれなら…

マウスの移動方向に応じて猫の向きが変化するように修正したよ↓

Pyxelで猫を操作
くるる
くるる
すげーー!どうやるの?教えて!!

じゃあ、Day4では”ベクトル”について勉強しようねー

くるる
くるる
はーい!めっちゃ楽しみ♪

では改めて…次回もお楽しみに~

Python+ゲーム関連の本(Pyxelの本は2018/12/19時点では存在しません)
LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です