本記事はPythonistaのsceneライブラリの基本的な使い方について紹介する記事です。
今回はsceneライブラリのゲーム作りで「最初に理解しておくべき3つのメソッド」について紹介します。
本記事の内容は以下の通り。
・Pythonista+sceneで最初に理解しておくべき3つのメソッド
・Pythonista+sceneで簡単なアクションを作成する
「setup()」、「update()」、「touch_began()」の3つを使えば簡単なゲームは作成できます。
まずは上記3つの使い方をマスターしましょう。
Pythonista+sceneで最初に理解しておくべき3つのメソッド
アクションのために必要なメソッドはいくつかありますが、ひとまず以下の3つを覚えておけば最低限のアクションを作成できます。
・setup()
・update()
・touch_began()
setup()メソッド
setup()メソッドは初期設定を行うためのメソッドです。
背景画像・キャラクター・障害物などを指定した位置に配置します。
Pythonでクラスを定義する時の「__init__()」と役割が近いですね。
update()メソッド
リアルタイムでイベントを開始するメソッドです。
プログラム起動後は無限ループに入りこのメソッドが繰り返し呼び出されます。
以下のように様々な場面で活用できます。
・空中の敵キャラクターやアイテムを徐々に落下させたい場合
・キャラクターを自然なアニメーションで移動させたい場合
・時間経過でイベントを起こしたい場合
など。
touch_began()
「touch_began()」はスマホをタッチした時に処理が実行されるメソッドです。
関連するメソッドに「touch_moved()」(タッチ状態で指を動かした時に処理されるメソッド)と「touch_ended()」(タッチ状態から指を離した時に処理されるメソッド)があります。
処理順は「touch_began()」→「touch_moved()」→「touch_ended()」です。単体でも使えます。
最初は「touch_began()」だけ覚えておけばOKです。
関連記事>>Pythonista+sceneタッチ(タップ)処理まとめ
Pythonista+sceneで簡単なアクションを作成する
3つのメソッドを活用した簡単な移動処理の作成方法について紹介します。
・スマホを傾けた時に左右に移動する
・スマホをタッチした時にジャンプする
sceneファイルの簡単作成
sceneのテンプレートを自動作成できます。
+ボタンをクリック
sceneの「Game/Animation」を選択します
適当なファイル名を入力して「Create」をクリックします
今回は「touch_moved()」と「touch_ended()」は使用しないので削除しましょう。(そのままでも特に影響はないですが。)
setup()の処理を実装
最初にキャラクターと背景を追加します。
・背景は「Ground_Planet」
・キャラクターは絵文字「ghost」
を設定。
コードは以下の通りです。
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 | from scene import * import sound 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') # アンカーポイントの設定(positionが指す画像中の位置) self.player.anchor_point = (0.5 ,0) # ポジションの設定 self.player.position = (self.size.w/2, self.player_height) # オブジェクトを追加 self.add_child(self.player) |
プレイヤーの位置はposition、画像はplayerに設定。
add_child()メソッドで画面にオブジェクトを追加できます。
anchor_pointはpositionが画像中のどこを指すか定義するものです。
0,0(左下)から1,1(右上)の間で指定できます。デフォルトは0.5,0.5(画像の中心)です。
画像の追加方法については「Pythonistaのsceneライブラリ画像の使い方」をお読みください。
update()の処理を実装
update()では移動の処理とジャンプの落下処理を実装します。
◆キャラクターの移動について
キャラクターの位置はオブジェクトのpositionにx,yの座標で管理されています。
positionの座標を変更することでキャラクターの位置を変更できます。
数字をただ変えるだけだと瞬間移動みたいになってしまうので、update()メソッドを使って徐々に移動させましょう。
◆gravity()関数
gravity()はスマホの傾き状態を取得できる関数です。
左右上下の傾きの状態を取得できます。
傾きによって速度を変えることも可能です。
update()メソッドの下に以下のコードを追記します。
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: max_speed = 40 # 徐々に移動。傾きによって速度が変化 x = max(0, min(self.size.w, x + g.x * max_speed)) self.player.position = (x, y) # ジャンプした時の落下処理 if y > self.base_height: # 徐々に移動。一定間隔で落下 y = max(self.player_height, min(self.size.h, y - 20)) self.player.position = (x, y) |
max()は引数内で一番高い数値を取得する関数です。
「max(0, min(self.size.w, x + g.x * max_speed))」の処理は、キャラクターのサイズか「x + g.x * max_speed」の計算結果のどちら高い方を取得する処理です。
この処理がないとキャラクターは画面外に吹っ飛んでいきます。
min()はmax()の逆で引数内から最小値を取得する関数です。
touch_beganの処理を実装
簡単なジャンプ処理の作成です。
1 2 3 4 5 | def touch_began(self, touch): x = self.player.position.x y = self.player.position.y self.player.position = (x, y+200) |
ジャンプの落下処理はupdate()に書いた記述で行われます。
上へは一瞬で移動します。
上に移動する処理も徐々に移動してた方がより自然なジャンプになりますが、処理が複雑になるので今回は上昇は短調な作りにしました。
より複雑なジャンプ処理を作成したい場合は「Pythonistaでキャラクターをジャンプさせる」をお読みください。
上記をまとめたコードは以下の通りです。
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 39 40 41 42 43 44 45 46 47 48 49 | from scene import * import sound 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 x = max(0, min(self.size.w, x + g.x * max_speed)) self.player.position = (x, y) if y > self.base_height: max_speed = 40 y = max(self.player_height, min(self.size.h, y - max_speed)) self.player.position = (x, y) def touch_began(self, touch): x = self.player.position.x y = self.player.position.y self.player.position = (x, y+200) if __name__ == '__main__': run(MyScene(), show_fps=False) |
終わりに
今回は以下の3つのメソッドの使い方を紹介しました。
・setup()
・update()
・touch_began()
上記3つでも最低限のアクションはできます。まずはこの3つの使い方をマスターしましょう。
アクションゲームに関してはPythonistaインストール時に同梱されているサンプルゲームのコードが非常に参考になります。
サンプルゲームのコードも流用しつつ、いろいろ試してみてください。
Pythonistaについては「Pythonistaの使い方まとめ」にまとめています。