本記事はPythonistaのsceneライブラリの使い方について紹介する記事です。
今回は、スマホの傾き処理について説明します。
具体的には以下の2点です。
・Pythonista+sceneスマホの傾き処理の基本
・Pythonista+sceneスマホの傾き処理の実装例
傾きを利用すればスマホならではのアクションが作成できます。
gravity()関数を活用すれば簡単な処理で実装できるので、本記事を参考にしつつ作成してみましょう。
目次
Pythonista+sceneスマホの傾き処理の基本
スマホの傾きに関してはgravity()関数について理解しておけばOKです。
スマホの傾きを取得するgravity()関数
gravity()関数によって現在のスマホの傾き状態を取得することができます。
1 2 3 4 | g = gravity() # g.xには横方向の傾きを格納 # g.yには縦方向の傾きを格納 |
傾きなし:0
下:Yマイナス方向(最小-1)
上:Yプラス方向(最大1)
左:Xマイナス方向(最小-1)
右:Xプラス方向(最大1)
スマホの傾きはどんな用途で使えるか
傾けた方向にオブジェクトを移動させるのが基本となる使い方です。
update()メソッドにgravity()関数を記述して監視し、傾き状態によってイベントを起こします。
傾きの活用例は以下の通り。
・2Dゲームのプレイヤーキャラクターの移動
・ピンボールゲームなどでゲーム盤を傾けてボールを転がす
gravity()関数に関してはチュートリアルが非常に参考になります。チュートリアルを動かしつつコードを熟読しましょう。
Pythonista+sceneスマホの傾き処理の実装例
スマホの傾き処理の実装例を紹介します。
スマホの傾きによる移動処理の基本
update()メソッドで監視し、傾いている場合はその方向にキャラクターを移動させます。
一気に移動させるのではなく、徐々に移動させるとより自然な移動になります。
移動のために必要な情報は以下の3つです。
・スマホの傾き具合
・キャラクターの現在位置
・移動距離
キャラクターの現在位置と移動距離から移動後のキャラクター位置を計算します。
左右上下どっちに傾いているかによって計算方法が異なります。
右:現在位置に移動距離を加算
左:現在位置から移動距離を減算
上:現在位置に移動距離を加算
下:現在位置から移動距離を減算
また、キャラクターが画面の外に出ないよう境界を考慮する必要があります。
よって移動の計算結果が0を下回る場合や画面の幅を超える場合は移動できなくしましょう。
一定の速度で移動させる方法
一定の速度で移動させたい場合は単純に現在位置と移動距離を加減算するだけです。
スマホがプラスかマイナスかだけ考慮すればよく、細かい数値は無視します。
実装例は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def update(self): g = gravity() # 現在位置の取得 x = self.player.position.x y = self.player.position.y # 左右の移動 if abs(g.x) > 0.05: # 傾きから移動距離を決める if g.x > 0: distance = 10 else: distance = -10 x = max(0, min(self.size.w, x + distance)) # キャラクターの位置の更新 self.player.position = (x, y) |
上記は傾きが一定以上ならキャラクターを移動させる処理です。
傾きがプラスならプラス方向へ移動、マイナスならマイナス方向に移動します。
maxは最大値をチェックする関数です。上記例では計算結果が0より小さくなった場合は0となります。
minは最小値を求める関数です。上記例では計算結果が画面の横幅よりも大きくなった場合にスマホの横幅サイズに書き換えます。
傾き具合によって速度を変える方法
チュートリアルでも紹介されている方法です。
傾きの値を参照することで傾き具合によって速度を変えることができます。
実装例は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 | def update(self): g = gravity() x = self.player.position.x y = self.player.position.y # 左右の移動 if abs(g.x) > 0.05: max_speed = 40 # 移動距離の計算 distance = g.x * max_speed x = max(0, min(self.size.w, x + distance)) self.player.position = (x, y) |
移動距離の計算以外は一定の速度と移動する場合と同じです。
傾きが大きいほど1に近くなるため、移動速度も速くなります。
実装例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | from scene import * class MyScene (Scene): def setup(self): # バックグラウンド設定 self.background_color = '#004f82' ground = Node(parent=self) x = 0 # 地面の高さ self.base_height = 30 # 背景の設定 while x <= self.size.w + 64: tile = SpriteNode('plf:Ground_Planet', position=(x, self.base_height)) ground.add_child(tile) x += 64 # プレイヤーの初期設定 self.player_height = self.base_height + 32 self.player = SpriteNode('emj:Ghost') self.player.anchor_point = (0.5 ,0) self.player.position = (self.size.w/2, self.player_height) self.add_child(self.player) def update(self): g = gravity() x = self.player.position.x y = self.player.position.y # 左右の移動 if abs(g.x) > 0.05: max_speed = 40 # 移動距離の計算 distance = g.x * max_speed x = max(0, min(self.size.w, x + distance)) self.player.position = (x, y) if __name__ == '__main__': run(MyScene(), show_fps=False) |
以上、スマホと傾きの処理についてでした。
おすすめ記事>>Pythonista+sceneで歩行アニメーションを作成する方法
Pythonistaについては「Pythonistaの使い方まとめ」にまとめています。