Pyxel(ブラウザ版)でJavaScriptの機能をいろいろ使う
レトロゲームエンジンPyxelで作った作品をWeb版で公開する際、ゲームデータのセーブ・ロードをどうするか?という疑問から、先日「Pyodideがjsモジュールをサポートしているので、ローカルストレージが使えることに気づいた」という記事を投稿しました。
javascriptを使えるということは、他にもいろいろなことができそうです。
たとえば以下は「アラートを出す」「ファイルをダウンロードする」というサンプルです。
このサンプルソースのコードを載せておきます。
わかりやすくするために、単一のHTMLファイルにしてPyxelのコードを直接書き込んでいます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Pyxel x JavaScript Sample</title>
<script src="https://cdn.jsdelivr.net/gh/kitao/pyxel/wasm/pyxel.js"></script>
</head>
<body>
<pyxel-run
script="
import pyxel
from js import window, Blob, URL, document
def update():
if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT):
data = ['Hello, Pyxel!']
blob = Blob.new(data, {'type': 'text/plain'})
blob_url = URL.createObjectURL(blob)
a = document.createElement('a')
a.href = blob_url
a.download = 'hello_pyxel.txt'
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
URL.revokeObjectURL(blob_url)
def draw():
pyxel.text(36,57,'Tap to donwload file',7)
pyxel.init(160, 120)
window.alert('おめでとう!Pyxelが起動しました')
pyxel.run(update, draw)
"
></pyxel-run>
</body>
</html>
ダウンロードはJavaScript的に少しテクニカルな処理をしていますが、「if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT)」以下の10行ほどの部分で実現しています。
そのほかにも、たとえば
location.reload() を使ってリセット機能を実装する
URLパラメータを読み取る
といった小技は使えそうです。
もちろん、あんまりやりすぎるとPyxelで制作する意義自体が薄れそうなので、機能上どうしてもPyxel単体ではできないところを補う、くらいの感覚が良さそうですね。
この記事が気に入ったらサポートをしてみませんか?