こんにちは、みやびのです。
今回は、Pythonista+sceneで複数画面を作る方法を紹介します。
複数画面を作る方法は以下の2種類あります。
・1つの画面で複数の画面を表現する方法
・複数の画面を作成して切り替える方法
今回は上記2つの方法の考え方と実装方法について紹介します。
目次
1つの画面(scene)で複数の画面を表現する方法
画面内のオブジェクトを再配置することで全く別の画面を表現することができます。
1つの画面で表現する場合の画面切り替え手順
画面の切り替えの手順は以下の通り。
1.共通の部品は残す
2.次の画面に不要な処理やオブジェクトは削除
3.次の画面に必要なオブジェクトを新たに追加
1つの画面で表現する方法のメリットは共通の処理や部品を使いまわすことができる点です。
例えばアクションゲームで複数のステージを作る場合に1つの画面で表現する方法は活用できます。
アクションゲームの各ステージは背景やキャラクターなどが違うだけで基本的な処理は同じです。
なのでステージが変わってもオブジェクトを入れ替えれば全く違うステージを作ることができます。
逆に全く共通処理のない画面の場合にこの方法は向きません。
全く共通処理がない画面が必要な場合は複数の画面を作りましょう。
1つの画面で表現する場合の実装例
トランプゲームのタイトル画面を作成する場合を例に説明します。
画面の概要:画面をタッチした時にゲーム画面に遷移する
まずはsetup()でタイトル用のオブジェクトを追加しましょう。
1 2 3 4 5 6 7 | def setup(self): self.title_items = [] self.background_color = '#05982f' ground = Node(parent=self) # タイトルの表示 font = ('Chalkboard SE', 50) self.title_label = LabelNode('Pythonポーカー', font, parent=self, color='yellow') |
次は画面をタッチした時の処理の作成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def touch_began(self, touch): self.title_label.remove_from_parent() base_w = 90 base_h = 350 cards = [ 'card:BackRed1', 'card:DiamondsA', 'card:HeartsA', 'card:ClubsA', 'card:SpadesA', ] for card in cards: card = SpriteNode(card, position=( base_w, base_h)) self.add_child(card) base_w += 50 |
画面をタッチするとタイトル画面からトランプの画面に切り替わります。
上記をまとめたコードは以下の通り。
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 | from scene import * class MyScene (Scene): def setup(self): self.title_items = [] self.background_color = '#05982f' ground = Node(parent=self) # タイトルの表示 font = ('Chalkboard SE', 50) self.title_label = LabelNode('Pythonポーカー', font, parent=self, color='yellow') self.title_label.position = (self.size.w/2, self.size.h - 200) self.title_label.z_position = 1 def touch_began(self, touch): self.title_label.remove_from_parent() base_w = 90 base_h = 350 cards = [ 'card:BackRed1', 'card:DiamondsA', 'card:HeartsA', 'card:ClubsA', 'card:SpadesA', ] for card in cards: card = SpriteNode(card, position=( base_w, base_h)) self.add_child(card) base_w += 50 if __name__ == '__main__': run(MyScene(), show_fps=False) |
◆実行例
複数の画面(scene)を作成して切り替える方法
画面の数だけsceneを定義して、特定のイベントが起きた時に画面を切り替える方法です。
複数の画面で表現する場合の画面切り替え手順
画面の切り替えの手順は以下の通り。
1.複数の画面(scene)を定義する
2.イベントが起きた段階で画面を切り替える
複数の画面を使う方法は「RPGのフィールド画面とバトル画面」のように全く操作の異なる2つの画面が必要な場合に便利です。
全く操作の異なる画面を1つの画面として表現しようとすると、タッチした場合に「フィールド時はジャンプ」、「バトル時は攻撃」など状況によって処理の切り分けが必要です。
判定が多くなり、構文も複雑になりやすいのでコードが読みにくくミスの原因にもなります。
2つの画面を用意しておけば各画面に必要な処理だけを作ればいいので処理がシンプルになるのでミスも減らせます。
しかし、なんでもかんでも新しい画面を作ればいいというわけではありません。
画面を多くし過ぎると同じような画面がいくつもできてしまうので作成の手間も増えますし、修正が必要となった場合に変更箇所が多くなります。
処理やオブジェクトに共通点がある場合は1つの画面で表現することも検討しましょう。
複数の画面で表現する場合の実装例
「1つの画面で表現する場合」と同様の処理、トランプゲームのタイトル画面を作成する場合を例に説明します。
まずはゲーム画面の作成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class MyScene (Scene): def setup(self): self.background_color = '#0d6298' ground = Node(parent=self) base_w = 90 base_h = 350 cards = [ 'card:BackRed1', 'card:DiamondsA', 'card:HeartsA', 'card:ClubsA', 'card:SpadesA', ] for card in cards: card = SpriteNode(card, position=( base_w, base_h)) self.add_child(card) base_w += 50 |
続いてタイトル画面を定義します。
1 2 3 4 5 6 7 8 9 10 11 | from scene import * class Title (Scene): def setup(self): self.background_color = '#05982f' ground = Node(parent=self) # タイトルの表示 font = ('Chalkboard SE', 50) label = LabelNode('Pythonポーカー', font, parent=self, color='yellow') label.position = (self.size.w/2, self.size.h - 200) label.z_position = 1 |
ゲームを起動する時はタイトル画面を呼び出します。
1 2 | if __name__ == '__main__': run(Title(), show_fps=False) |
続いてタイトル画面をタッチした時の処理の作成です。
画面の作成にはSceneViwe()を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Title (Scene): # (略) def touch_began(self, touch): # ゲーム画面に切り替える処理 sv = SceneView() # パラメータ設定 ui_orientations = None sv.anti_alias = False sv.frame_interval = 1 sv.multi_touch_enabled = True sv.shows_fps = False # MySceneを読み込む sv.scene = MyScene() sv.present(orientations=ui_orientations) |
上記をまとめたコードは以下の通りです。
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 | from scene import * class MyScene (Scene): def setup(self): self.background_color = '#0d6298' ground = Node(parent=self) base_w = 90 base_h = 350 cards = [ 'card:BackRed1', 'card:DiamondsA', 'card:HeartsA', 'card:ClubsA', 'card:SpadesA', ] for card in cards: card = SpriteNode(card, position=( base_w, base_h)) self.add_child(card) base_w += 50 class Title (Scene): def setup(self): self.background_color = '#05982f' ground = Node(parent=self) # タイトルの表示 font = ('Chalkboard SE', 50) label = LabelNode('Pythonポーカー', font, parent=self, color='yellow') label.position = (self.size.w/2, self.size.h - 200) label.z_position = 1 def touch_began(self, touch): # ゲーム画面に切り替える処理 sv = SceneView() # パラメータ設定 ui_orientations = None sv.anti_alias = False sv.frame_interval = 1 sv.multi_touch_enabled = True sv.shows_fps = False # MySceneを読み込む sv.scene = MyScene() sv.present(orientations=ui_orientations) if __name__ == '__main__': run(Title(), show_fps=False) |
◆実行例
関連記事>>Pythonistaポーカーにタイトルを追加する
以上、Pythonistaで複数の画面を使う方法でした。
Pythonistaまとめ>>Pythonistaの使い方まとめ