本記事はPythonista+sceneの2Dアクションゲームを作る方法を紹介するものです。
今回は、画面タッチでキャラクターを移動させる方法について説明します。
具体的には、以下の通り。
・Pythonistaのタッチで移動させる処理の基本
・Pythonistaのタッチで移動させる処理の実装例と実行例
目次
Pythonistaのタッチで移動させる処理の基本
タッチに使うメソッド
タッチには「touch_began()」、「touch_moved()」、「touch_ended()」の3種類のメソッドがあります。
touch_began():画面をタッチした瞬間に実行
touch_moved():画面をスライドした時に処理を実行
touch_ended():画面から指を離した時に実行
メソッドの第1引数「touch」にはタッチした時の情報が格納されています。
touch.locationからはタッチした時の位置情報が取得可能です。
タッチした位置に移動
タッチした位置にキャラクターを移動させる時は「touch_began()」を使用します。
「self.player.position」直接書き換えてしまうと瞬間移動のようになってしまうので、タッチした位置を変数に格納して覚えておき、update()で徐々に移動させます。
コードの記述例は以下の通り。
まずはsetup()メソッドでgame_nodeという変数を定義します。
1 2 3 | def setup(self): self.effect_node = EffectNode(parent=self) self.game_node = Node(parent=self.effect_node) |
touch_began()では位置格納変数である「move_target 」に値を設定します。
この時点ではキャラクターのpositionの値は変更しません。
1 2 3 | def touch_began(self, touch): x, y = touch.location self.move_target = x / self.game_node.scale |
update()メソッドで「move_target」に向けてキャラクターを徐々に移動させます。
1 2 3 4 5 | def update(self): dx = self.move_target - self.player.position.x if abs(dx) > speed: dx = speed * cmp(dx, 0) self.player.position += dx, 0 |
同じ要領で縦方向の移動も実現可能です。
1 2 3 4 5 6 7 8 9 | def touch_began(self, touch): x, y = touch.location self.move_target = y / self.game_node.scale def update(self): dy = self.move_target - self.player.position.y if abs(dy) > speed: dy = speed * cmp(dy, 0) self.player.position += 0, dy |
両方指定すれば縦横に移動可能です。
ただし、move_targetはXとYで用意する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def touch_began(self, touch): x, y = touch.location self.move_target_x = x / self.game_node.scale self.move_target_y = y / self.game_node.scale def update(self): dx = self.move_target_x - self.player.position.x if abs(dx) > speed: dx = speed * cmp(dx, 0) dy = self.move_target_y - self.player.position.y if abs(dy) > speed: dy = speed * cmp(dy, 0) self.player.position += dx, dy |
画面をスライドさせてキャラクターを移動させる
touch_moved()を使うことで画面を指でスライドした方向にキャラクターを移動させることができます。
スライドによる移動もタッチによる移動と同様、目標となる移動位置move_targetを決めて徐々に移動させます。
setup()とupdate()はタッチで移動させる場合と同様です。
touch_moved()で「move_target」を指定します。
1 2 | def touch_moved(self, touch): self.move_target = touch.location.x / self.game_node.scale |
キャラクターの「frame」と「touch.location」を比較することでキャラクターをタッチした場合だけ移動できます。
1 2 3 4 | def touch_moved(self, touch): touch_loc = self.point_from_scene(touch.location) if touch_loc in self.player.frame: self.move_target = touch.location.x / self.game_node.scale |
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 | from scene import * speed=20 def _cmp(a, b): return ((a>b)-(a<b)) if sys.version_info[0] >= 3: cmp = _cmp 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) self.effect_node = EffectNode(parent=self) self.game_node = Node(parent=self.effect_node) self.move_target = self.size.w/2 def update(self): dx = self.move_target - self.player.position.x if abs(dx) > speed: dx = speed * cmp(dx, 0) self.player.position += dx, 0 def touch_began(self, touch): x, y = touch.location self.move_target = x / self.game_node.scale def touch_moved(self, touch): touch_loc = self.point_from_scene(touch.location) if touch_loc in self.player.frame: self.move_target = touch.location.x / self.game_node.scale # Run the game: if __name__ == '__main__': run(MyScene(), PORTRAIT, show_fps=False) |
◆実行例
タッチが見えないのでわかりにくいですが、1つ目が「タッチした位置に移動させる方法」、2つ目が「スライドで移動する方法」の実行結果です。
以上、タッチでキャラクターを移動させる方法についてでした。
Pythonista 2Dアクションまとめ>>【Pythonista+scene】2Dアクションゲーム作成方法まとめ