Pythonistaのsceneライブラリで追加したオブジェクトはそのままだと他のオブジェクトに接触してもすり抜けます。

よって「プレイヤーがアイテムに接触したら拾う」、「プレイヤーが敵に接触したらダメージを受ける」などの処理を作成したい場合は当たり判定(オブジェクト同士がぶつかったかどうかの処理)の作成が必要です。

本記事では、Pythonista+sceneで当たり判定を作成する方法を紹介します。

Pythonista+sceneで当たり判定の前提情報と知識

当たり判定を作るために必要な前提情報と知識は以下の4つです。

・オブジェクトのサイズ
・オブジェクトの接触の方向
・当たり判定の距離の計算方法
・当たり判定の処理を追加する場所

オブジェクトのサイズ

画面に追加されたオブジェクトは位置情報を保持しているため、これを基準に接触判定を考えます。
しかし、各オブジェクトの持つ位置情報は一点のみです。

Pythonista当たり判定の説明

なので当たり判定を作る場合はオブジェクトのサイズを考慮する必要があります。
オブジェクトのサイズはprint文で調べることができます。

オブジェクトの接触の方向

接触の方向は上下左右の4つです。

接触した方向によって当たり判定の比較方法が変わります。

接触の方向 比較方法
左に接触した場合 x方向距離プラスで比較
右に接触した場合 x方向距離マイナスで比較
上に接触した場合 y方向距離プラスで比較
下に接触した場合 y方向距離マイナスで比較

当たり判定の距離の計算方法

オブジェクトの「x座標」と「y座標」をそれぞれ比較し、「計算した結果の絶対値がxyとも一定値以下」の場合は接触とみなします。

注意しなければならないのは計算結果がマイナスの時は絶対値で見る必要があることです。
絶対値はabs()関数で取得できます。

画像サイズは実際のオブジェクトよりも大きめの枠で取られていることが多いので、判定は30〜50pxくらい小さめに作っておくと良いです。

あとは実際に動かしてみて違和感があったら判定の値を微調整しましょう。

当たり判定の処理を追加する場所

当たり判定はupdate()メソッドの処理内でチェックします。

判定の部分は切り出して関数化しておくと良いです。

Pythonista+scene当たり判定の実装例

上記を踏まえてPythonista+scene当たり判定を作成します。
今回はキャラクターを動かしてアイテムを取る処理を作成です。

当たり判定以外のアクションの説明は割愛するのでご了承ください。

以下はアイテムと接触した時にスコアを加算する処理です。
アイテムはプレイヤーと接触した場合画面から消去します。

上記処理では「プレイヤーとオブジェクトのx方向距離の絶対値が30以下」かつ「プレイヤーとオブジェクトのy方向距離の絶対値が30以下」の場合に接触とみなします。
今回は、だいだい同じ大きさのオブジェクトのため判定はかなり簡略化していますが、大型のオブジェクトを使いたい場合は左右や上下で値を変えるなどかなり複雑な計算が必要です。

上記当たり判定を利用したプログラムの実装例は以下の通り。

大半のゲームでは当たり判定が必要なので、今回の記事やサンプルゲームを参考にしつつ作成してみてください。
以上、Pythonista+sceneで当たり判定を作成する方法でした。

Pythonistaについては「Pythonistaの使い方まとめ」にまとめています。