Scratch拡張機能の作成 ~Python編~
Scratchの拡張機能を作成したときに実行されるPython側のプログラムを作成します。
この記事ではPython側のプログラムについて記載します。
Scratch側のプログラムについてはこちらの記事を参考にしてください。
環境構築
Pythonがインストールされていることを前提に進めていきます。
コマンドプロンプトを起動し、下記を実行します。
- pip install flask
メモ帳などのテキストエディタで下記コードを記述し、名前を付けてファイルを保存します。
- from flask import Flask
- app = Flask(__name__)
- @app.route('/')
- def index():
- return 'Hello World'
- if __name__ == '__main__':
- app.debug = True
- app.run(host='127.0.0.1', port=80)
コマンドプロンプトでプログラムを保存したディレクトリへ移動します。
下記コマンドを実行します。
- python <保存したファイル名>.py
赤字で「WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.」という警告が表示されますが、今回はlocalhostで個人で使用するだけなのでこのまま続けます。
ブラウザで「http://127.0.0.1:80」へアクセスします。
「Hello World」と表示されれば成功です。
プログラムの準備
Scratchの拡張機能からリクエストを受け取ってMinecraftで実行するプログラムを作成していきます。
まず、Scratch側とPython側で別々のサービスとして異なるポート番号で実行しているため、下記の通りCORSの設定を行います。
今回はすべてのアクセスを許可する設定としています。
- from flask_cors import CORS
- CORS(app)
また、複数の処理を作成したいため、ルーティングの設定もします。
Scratchの拡張機能側の設定に合わせてGETまたはPOSTも指定します。
下記の通り記述した場合は、「http://172.0.0.1:80/getPos」とGET形式でリクエストがあったときに、「getPos()」に記載したプログラムが実行されます。
- @app.route('/getPos', methods=["GET"])
- def getPos():
下記の通り記述した場合は、「http://172.0.0.1:80/setBlock」とPOST形式でリクエストがあったときに、「setBlock()」に記載したプログラムが実行されます。
- @app.route('/setBlock', methods=["POST"])
- def setBlock():
このプログラムからMinecraftへアクセスする必要があるため、作成したプログラムは「mcpipy」フォルダ内に保存しておきます。
現在位置を取得
Scratch拡張機能のget_Posから呼び出され、Minecraft内でのプレイヤーのxyz座標を取得しScratch拡張機能へ返却します。
返却するデータはJSON形式とし、jsonifyを使用しています。
- @app.route('/getPos', methods=["GET"])
- def getPos():
-
- mc = minecraft.Minecraft()
-
- try:
- xPos,yPos,zPos = mc.player.getPos()
- except Exception as e:
- print(e)
- res = {'xPos': str(int(xPos)),'yPos': str(int(yPos)), 'zPos': str(int(zPos))}
- return jsonify(res)
ブロックを1つ置く
今回は「ブロックを1つ置く」について記載しますが、「ブロックを置く」もほぼ同様の処理になります。
Scratch拡張機能のsetBlockから呼び出され、Minecraft内の指定した座標に指定したブロックを設置します。
座標およびブロックの情報はリクエスト情報より取得します。
valueはリクエスト情報に値が設定されていた場合のみ使用します。
- @app.route('/setBlock', methods=["POST"])
- def setBlock():
-
- mc = minecraft.Minecraft()
- try:
- x = int(request.form.get('x'))
- y = int(request.form.get('y'))
- z = int(request.form.get('z'))
- block_id = int(request.form.get('blockid'))
- if str.strip(request.form.get('value')) == '' :
- mc.setBlock(x, y, z, block_id)
- else:
- value = int(request.form.get('value'))
- mc.setBlock(x, y, z, block_id, value)
- except Exception as e:
- print(e)
-
- return ''
以上でPython側のプログラムの作成は完了となります。
- python <保存したファイル名>.py
と実行して、Scratch側からリクエストを受け取ると、それぞれの処理が実行されるようになります。
|
|