【Pythonista3】PythonでiOSゲーム開発#2[ゲーム開発②]

 

上から降ってくる隕石を避けるゲーム

 

▼ゲームというか、ただ横スクロールしているだけなのでゲーム性はありません。一応進んだ分だけ距離を表示するようにしています。

 

衝突判定処理:衝突判定を行うための範囲をRect(left, top, width, height)で指定します。衝突は”item.frame.intersects(player_hitbox)”で判定し、衝突しているスプライトは”isinstance(item, Meteor)”で判別します。

def check_collision(self):
    player_hitbox = Rect(self.man.position.x, self.man.position.y, self.man.size.w -50,            self.man.size.h – 50)
    for item in list(self.items):
        if item.frame.intersects(player_hitbox):
            if isinstance(item, Meteor):
                self.player_hit(self.man.position)
            elif not item.parent:
                self.items.remove(item)

 

アイテムのスポーン:アイテムをランダムスポーンさせるため、スポーンするタイミングやスポーン位置をランダムで追加していきます。

def spawn_item(self):
    if random.random() < 0.3:
        meteor = Meteor(parent = self)
        meteor.position = (random.uniform(-self.size.w, self.size.w * 2), self.size.h + 30)
        rotate = Action.repeat(Action.rotate_by(2 * pi, 2.0, TIMING_LINEAR), 4)
        actions = [rotate, Action.remove()]
        meteor.run_action(Action.sequence(actions))
        self.items.append(meteor)

 

キャラ移動時の反転:キャラ移動に伴う振り向きを”self.man.x_scale = -1″で反転させることができます。今回は画面を横向きで重力センサーを用いているので、左に傾けたときに反転させるようにしています。

g = gravity()
self.man.x_scale = -((g.y > 0) – (g.y < 0))

 

音声処理:効果音は”sound.play_effect()”で呼び出します。パラメータは以下の要素で指定します。

sound.play_effect(‘arcade:Explosion_4’, 1.0, 1.0)

 

パラメータの要素

name音声データ
volumeボリューム
pitch再生スピード
pan音の方向を-1.0~1.0で設定。(左:-1.0, 右:1.0)
looping音声のループ設定。デフォルトではFalse

 

 

▼スクリプト全体です。一応丁寧に書いたつもりですが、見にくい部分あるかもしれません。

 

 

 

飛んでくる星を避けてコインを取るゲーム

 

▼1個目のゲームの内容をほぼ流用していますが、無限ジャンプで星を避けながらコインを取りスコアを稼ぎます。

 

アイテム獲得処理:アイテムの獲得処理は実は衝突処理と全く同じ処理です。アイテムごとに動作を決めればOKです。

def check_collision(self):
    player_hitbox = Rect(self.man.position.x, self.man.position.y, self.man.size.w -100,              self.man.size.h – 100)
        for item in list(self.items):
            if item.frame.intersects(player_hitbox):
                if isinstance(item, Star):
                    self.player_hit(self.man.position)
                elif isinstance(item, Coin):
                    self.get_item(item)
                elif isinstance(item, Food):
                    self.get_item(item)
            elif not item.parent:
                self.items.remove(item)

 

 

▼スクリプト全体です。一応丁寧に書いたつもりですが、見にくい部分あるかもしれません。

 

 

 

まとめ

ゲームといっても単純なものしか作っていません。もう少し凝ったゲームを作ろうと思ったのですが、一人でマップを作ったり背景画像を作ったりするのはモチベ上がらず大変だったのでやめました。

 

時間をかければ結構なゲームを作り出せる可能性を感じましたが、手っ取り早くクオリティの高いゲームを作りたいならUnity使ったほうが良い気がしますね。

 

次回は便利アプリに挑戦したいと思います。

 

 

 

コメント