こんにちは!
前回こんな記事を書きました↓

本記事は『Pythonでレトロゲームを作ろう!』シリーズの”Day6”です!
【シリーズ構成】
- Day1~Day4:基礎編
- Day5~:応用編
Contents
【Day 6】Pyxelでレトロゲームを作ろう!
Day5の記事でショット攻撃ができるようになりました!
なので…敵キャラに向かって撃ってみましょう!
ノリノリの”くるる”ちゃんが今日も可愛い(*・ω・)ノ♪
敵キャラを倒す
「本記事を読むと、どんなソフトが作れるようになるか?」が気になると思うので、先にデモを見せちゃいますね!
それでは…
……そんなんじゃダメでしょ!!



今日の”くるる”ちゃんは…なんかスゴイぞ!笑
要するに『ショット攻撃でねずみ(敵キャラ)を倒すゲーム』の作り方を本記事で説明していきます。
”くるる”ちゃんが色々と脚色してくれたけど…可愛い猫ちゃんが”ショット攻撃”というのは、少し穏やかじゃないので、以降からは”ボールを投げる”という柔らかい表現を使います!
Game Over!
ふふふ…
ねずみに当たると【Game Over!】だよ

楽しく勉強しよー♪(by くるる)
当たり判定とは
ん?つまり今回は…
いやいや。どちらも『当たり判定』という処理で実現できるよー
一言で説明すると『オブジェクト同士が当たったか(衝突したか)どうかを判定する処理』のことです。
今回の場合は…
【当たり判定の例】
- ボールが”ねずみ”に当たったかを判定
- ”ねずみ”が猫に当たったかを判定
となります。
また、ゲームを面白くするために、当たり判定後のルールを以下のようにします。
【ルール】
- ボールが”ねずみ”に当たった:”ねずみ”を退治
- 猫が”ねずみ”に当たった:Game Over!
「”ねずみ”を退治」というのは「”ねずみ”のインスタンスを破棄する」という意味です。
という人はDay5の記事を読んでほしいなぁ

- 当たり判定:オブジェクト同士が当たったどうかを判定する処理
- 手を動かして楽しくプログラミングを勉強しましょう!
Pyxelと当たり判定
当たり判定…
基礎が大事だよ!
【勉強の順番】
- 「基礎 ⇒ 応用」
- 「応用 ⇒ 基礎」
勉強の順番は①・②どちらでも問題ありません。
(本シリーズは①を採用しています)
ただし、やりたいことが増えてくると『”基礎”が身に付いていない⇒応用できない!』というシーンが必ず出てきます。

無言の敬礼がカッコイイぞ”くるる”ちゃん!
勉強の”順番”や”方法”は好みもあるので、自分に合うスタイルでOKです!ただし、基礎は疎かにしてほしくないなぁ
当たり判定 -ボール
敵キャラ編-
”くるる”ちゃん【画像の基礎】とは?
【画像の基礎】
- 画像は画素(pixel)の集合体
- 画素(pixel)の位置は座標で表現する
- 座標の原点は、基本的に画像の左上
- 画素はRGB成分を持っている(Pyxelの場合は16色)
- 複数の画像を重ねる場合でも各画像が↑の性質をもつ
↑のポイントの内、特に画像における座標の知識が身についていると『当たり判定』を”スッと”理解できます!
敵キャラの座標は以下の通りです↓

『赤枠内の領域(座標)は全て敵キャラ』だと考えれば…
『赤枠にボールが触れた瞬間に当たり!』と判定すれば良いです↓

これを数式の落とし込むと…
【ボール敵キャラの当たり判定】
enemy.pos.x < ボールのx座標 < enemy.pos.x + ENEMY_W
かつ
enemy.pos.y < ボールのy座標 < enemy.pos.y + ENEMY_H
のとき”当たり”と判定する!
正解!
ただし、それだとボール1つ 敵キャラ1匹にしか対応していないので、複数に対応できるようにします↓
【ボール敵キャラの当たり判定フロー】
- ボール数をカウント(1行目)
- 敵キャラ数をカウント(3行目)
- i番目のボールとj番目の敵キャラの当たり判定(5~8行目)
- ”当たり”なら敵キャラのインスタンス破棄(10行目)
- ②~⑤を繰り返す※
※1個目のボールと全ての敵キャラとの『当たり判定』
⇒2個目のボールと全ての敵キャラとの『当たり判定』
⇒…
をボールが最後の1個になるまで繰り返します
大正解!

一読で理解できた人は”くるる”ちゃんと一緒に”ドヤ顔”して下さい!笑
理解できなかった人…大丈夫です!【本シリーズの基礎編】をもう一度読み返してみて下さい!
今度は「応用 ⇒ 基礎」の順に学んでみましょう(*・ω・)ノ♪
- オブジェクトの領域(座標)を意識する
- 複数オブジェクトの当たり判定は for文 で書ける
当たり判定 -猫
敵キャラ編-
続いて猫と敵キャラの『当たり判定』について説明します。
…おしい!本当におしい!!
確かに上記コードで以下のシーンの敵キャラが”当たっている”と判定できます。

しかし、以下の①~③の敵キャラは”当たっていない”と判定されます。

その理由は、判定条件が以下の通りだったからです。
『敵キャラの左上座標が猫の領域(座標)に入ったか?』で”当たり判定”
左上座標のみではなく…
『敵キャラの領域(座標)が猫の領域(座標)に入ったか?』で”当たり判定”
が正解です。
なお、実装するときは『”領域内で真っ先に接触する座標”が当たったかどうか?』で判定すれば良いです。
今回の場合、猫より敵キャラの方が小さいので、”敵キャラ領域の四角形の頂点”で当たり判定ができます。
ゲーム次第では「前方からの攻撃をガード」や「ボスキャラの弱点部分(の座標)のみ攻撃が有効」などのルールがあります。しかし、今回は猫と”ねずみ”が当たれば【Game Over!】(接触箇所の制約なし)というルールでしたね。
以上を考慮した『当たり判定』のコードが以下です。
また失敗しちゃった。。

むしろ挑戦した人しか失敗できないからね!失敗から何を学ぶかが重要だよ!!

涙を拭って、無言で敬礼する”くるる”ちゃん…カッコいいぞ!!
- 繰り返す!オブジェクトの領域(座標)を意識する
- 真っ先に触れる座標で当たり判定
- 失敗は”恥”じゃない!失敗から何を学ぶかが重要です!!
最終的に完成したソースコード
”くるる”ちゃんは途中で投げ出さずに『当たり判定』のソフトを完成させました↓
ねずみ画像(ドット絵)は下記サイトの”ミニマム動物アイコン”を使用しました。
おわりに
『Pythonでレトロゲームを作ろう!Day 6-当たり判定-』について説明しました。
ゲーム開発(pyxelの使い方)を題材にして、楽しくプログラミングの勉強ができると良いなーとか考えながら、シリーズ記事を書いています。
今回はアクションゲームやシューティングゲームなどに使われる『当たり判定』について説明しました。
『当たり判定』の正解だけではなく…
- どんな条件?
- どんな数式?
- なぜ上手くいかない?
- どう改善すれば良い?
という『アルゴリズム』や『考え方(マインド)』まで伝わると嬉しいなぁ
どういたしまして!
次回予告
『Day5 -ショット攻撃-』と本記事『Day6 -当たり判定-』のコードを組み合わせたり、カスタムすれば”自分オリジナルのゲーム”を開発できます。
面白いレトロゲームを作って下さいね!

そんなキラキラした瞳で見つめられたら断れない!笑
なるほど!でもそこはオリジナリティ…


自動追従マウス!!
人工知能とは、ちょっと違う気もするけど、プレイヤーが操作せずに自動でキャラが動いたら人工知能かな?
ちょっと正しい定義は分からないけど、本サイトでは”人工知能”と呼ぶことにします。
次回『Day7 -人工知能-』の記事を最後に本シリーズの最終回とさせて頂きます。
(最後に総集編(まとめ記事)も書く予定ですが、チュートリアルとしては次回が最終回です)
本記事楽しかったかな?次回もお楽しみに~