見出し画像

Pythonistaでアクションゲームを作ろうー基本編ー

「プログラミングを始めたいけど、パソコンで始めるのはハードルが高い。スマホでプログラミングを始める方法はないの?」
という疑問に答えます。

スマホでもPythonであればプログラミングを始めることは可能です。iPhoneではPythonista3(以下、Pythonista)、Android版ではPydroid/QPythonでプログラミングが実践できます。

スマホでプログラミングできればパソコンよりもかなり手軽にプログラミングを始められますし、電車での移動や休み時間などの隙間時間を使ってのプログラミングもしやすいですよね。

本格的なプログラミングはパソコンの方が遥かに良いですが、初心者がプログラミングする手段としてはかなり有効。まずはスマホでのプログラミングを始めてみてはいかがでしょうか?

そこで本記事では、上記のうちiPhoneアプリであるPythonistaの使い方について紹介します。

本記事の内容は以下の通り。

・本記事はこんな方におすすめ
・なぜスマホプログラミングでPythonistaが良いのか?
・Pythonistaを使いこなすために重要なこと
・Pythonistaの始め方
・Pythonistaの基礎知識
・Pythonistaを活用したアクションゲーム制作

記事の前半では、Pythonistaの基本的な使い方について紹介します。まずはPythonistaやゲーム知識についてざっくりと学んで知識を深めていきましょう。
記事の後半では簡単なアクションゲーム制作について紹介します。初心者でも理解できるように、ゲーム制作の手順を順序立てて紹介しました。

本記事はこんな方におすすめ

本記事がおすすめな方は以下の通り。

・スマホで手軽にプログラミングをしてみたい
・Pythonistaの使い方を知りたい
・簡単なゲームを作ってみたい

本記事では、Pythonistaの基礎知識とPythonistaでのゲーム制作について、順序立ててわかりやすく解説しています

Pythonistaは比較的わかりやすいアプリですが、それでも初心者の方にはハードルが高い部分も多いです。本記事では、初心者でもわかるように簡潔にPythonistaに使い方やゲーム制作についてまとめました

また、アプリをインストールをしたものの何から始めたらいいかわからない方も多いと思います。本記事では、プログラミングを始めたての初心者のためにPythonistaの使い方と共にプログラミングの作成例をまとめています。

なぜスマホプログラミングでPythonistaが良いのか?

Pythonistaの最大のメリットはライブラリが充実している点です。プログラミングを実践する上では標準のライブラリでは足りない場合がほとんど。なので拡張機能であるライブラリをインストールすることはほぼ必須となります。

しかし、これが初心者にとってはなかなかハードルの高い作業。
必要なライブラリが何かから調べるところから始めなければなりませんし、ライブラリのバージョンによっては動作しない場合や、〇〇ライブラリを動かすためには△△ライブラリも必要…などなど考えなければならないことがたくさんあります。

その点、Pythonistaは簡単なゲーム開発に必要なライブラリが最初から入っているので拡張機能の導入に関して考える必要がありません。

また、Pythonistaにはゲーム開発に使えるsceneという独自のライブラリがあります。このライブラリを使うことで簡単なアクションゲームを開発することが可能です。

Pythonistaを使いこなすために重要なこと

・まずはプログラムの動かし方を理解する
・色々なプログラムを動かす
・自分でも同じコードを書く

まずはプログラムの動かし方を理解する


プログラミングを勉強するためにまずやらなければならないことは、プログラムのコードを書くことではありません。プログラムの動かし方を理解することです。

勉強から始めてしまう方が多いかもしれませんが、勉強は後回しでOK。まずはプログラムの動かし方を覚えましょう。
先にプログラムの動かし方を覚えるメリットは、「勉強する時にコードの理解がより進む」という点です。

動かし方を全く理解していない状態で勉強を始めてしまうとコードの意味を理解するのにかなり苦労すると思います。また、理解できないコードについても「とりあえず動かして試すか」という選択が取れるので、ただドキュメントを読むよりもより理解が進みます。

色々なプログラムを動かす

次に重要なことは色々なコードを動かしてみることです。Pythonistaでは様々なサンプルコードが用意されているので、実際に動かしてみましょう。とりあえずコードの理解はしなくてもOK。

プログラミングでどんなことが実現できるかということを見ていきましょう。

自分でも同じコードを書く

プログラムの動かし方を理解し、様々なプログラムを動かすことができたら、次は実際に自分でもコードを書いてみましょう。最初からコードの意味を理解する必要はありません。

「こういうコードを書けばこんなことができる」ということを大まかに理解できればOK。もちろん書いたら必ず動かしてみましょう。

プログラムを書くと言っても一字ずつ打ち込む必要はありません。コピペでOKです

「コピペで貼り付けるだけなら簡単に動かせるんじゃないか」
と思う方がいるかもしれませんが、そう簡単にはいきません。もちろん全く問題なく動く場合もありますが、逆に全然動かない場合もあります。

「そのままコピペしたはずなのになぜ動かないんだろう?」
という疑問を持ちその疑問を解決するためにドキュメントを見返したり、ググったりすることがプログラミングの勉強の第一歩です。

Pythonistaの始め方

Pythonistaの始め方は非常に簡単です。Appストアからアプリをインストールするだけで利用できるようになります。有料アプリであり、$9.99(約1,500円)の支払いが必要ですが、月額利用ではなく買い切りであるため一度買ってしまえばずっと利用することが可能です。

対応機種はiOSのみ

Pythonistaが対応しているのはiOS(iPhone/iPad)のみです。Androidには対応していません。また、Windows版やMac版もありません。


ダウンロード方法

Pythonistaは他のアプリと同様App Storeからダウンロードできます。
Pythonista3をダウンロードする

Pythonistaは有料で値段は$9.99(約1,000円)です。しかし、買い切りなので一度購入すればずっと使えます
値段もパソコンの有料エディタは数万円なのでかなりお手頃な価格ですね。

機能もスマホのエディタとしてはかなり充実しています。
ただし、フリック入力が苦手な人は外付けキーボードがあった方が良いです。

Pythonプログラミングの始め方

ダウンロードしたアプリをインストールするだけでPythonの編集と実行の両方ができるようになります。

◆実行方法
アプリケーションを開くとエディタが出てきます。
「Hello World」を実行してみましょう。

1.左下の「+」ボタンをクリックします。


2.「Empty Script」をクリックします


3.ファイル名を入力します


4.print文を入力します


◆実行例
エディタのプレイボタン(三角マーク)を押すことでPythonのコードを実行できます。

次の章ではPythonistaでゲームを作れるsceneライブラリについて紹介します。

Pythonista+sceneで最初に理解しておくべき3つのメソッド

本章からPythonistaのsceneライブラリの基本的な使い方について紹介します。

sceneライブラリはPythonista独自のライブラリであり、ゲーム作りに特化した機能が一通り揃っています。SEや画像も数多く用意されており初心者でも取り組みやすいライブラリです。

Pythonistaで最初で理解すべきメソッドとは?

まずは、sceneライブラリのゲーム作りで最初に理解しておくべき3つのメソッドについて紹介します。

具体的には「setup()」、「update()」、「touch_began()」の3つです。この3つを使えば簡単なゲームは作成できるので、使い方をマスターしておきましょう。

setup()メソッド
setup()メソッドは初期設定を行うためのメソッドです。
背景画像・キャラクター・障害物などを指定した位置に配置します。

update()メソッド
リアルタイムでイベントを開始するメソッドです。
プログラム起動後は無限ループに入りこのメソッドが繰り返し呼び出されます。

以下のように様々な場面で活用できます。

・空中の敵キャラクターやアイテムを徐々に落下させたい場合
・キャラクターを自然なアニメーションで移動させたい場合
・時間経過でイベントを起こしたい場合

など。

touch_began()
「touch_began()」はスマホをタッチした時に処理が実行されるメソッドです。

関連するメソッドに「touch_moved()」(タッチ状態で指を動かした時に処理されるメソッド)と「touch_ended()」(タッチ状態から指を離した時に処理されるメソッド)があります。

処理順は「touch_began()」→「touch_moved()」→「touch_ended()」です。単体でも使えます。

最初は「touch_began()」だけ覚えておけばOKです。

Pythonista+sceneで簡単なアクションを作成する

3つのメソッドを活用した簡単な移動処理の作成方法について紹介します。

・スマホを傾けた時に左右に移動する
・スマホをタッチした時にジャンプする

sceneファイルの簡単作成
sceneのテンプレートを自動作成できます。

+ボタンをクリック


sceneの「Game/Animation」を選択します



適当なファイル名を入力して「Create」をクリックします

今回は「touch_moved()」と「touch_ended()」は使用しないので削除しましょう。(そのままでも特に影響はないですが。)

setup()の処理を実装
最初にキャラクターと背景を追加します。

・背景は「Ground_Planet」
・キャラクターは絵文字「ghost」
を設定。
コードは以下の通りです。

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()メソッドの下に以下のコードを追記します。

 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の処理を実装
簡単なジャンプ処理の作成です。

 def touch_began(self, touch):
        x = self.player.position.x
        y = self.player.position.y
        
        self.player.position = (x, y+200)  

ジャンプの落下処理はupdate()に書いた記述で行われます。
上へは一瞬で移動します。

上に移動する処理も徐々に移動してた方がより自然なジャンプになりますが、処理が複雑になるので今回は上昇は短調な作りにしました。

より複雑なジャンプ処理を作成したい場合は後述の「Pythonistaでキャラクターをジャンプさせる」の章で説明します。

上記をまとめたコードは以下の通りです。
コードの細かい内容については次章以降で説明するのでまずは「setup()」、「update()」、「touch_began()」の3つについてざっくりと役割を理解してください。

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)


ここから先は

44,291字 / 29画像

¥ 500

この記事が気に入ったらサポートをしてみませんか?