HSP3Dish.jsでJavaScript
目次
対象環境
このページの内容は、HSP3.7β9でHSP3Dish.jsを使用する場合を対象とした内容です。 また、ここで紹介している使い方は、公式に対応がアナウンスされている使用法ではありません。 将来の仕様変更で使えなくなってしまう可能性がある点にご注意ください。
execでJavaScriptを実行する
HSP3Dish.jsでexec
命令を使うと、JavaScriptを実行できます。
Windowsではコマンドプロンプトが動くのと同じように、ウェブブラウザではJavaScriptが動くわけですね。納得できる動作です。
例:ダイアログの表示
; HSP3Dish.jsで実行するとウェブブラウザのダイアログが開きます。
exec "alert('Hello')"
JavaScriptはコマンドプロンプトよりも使いやすく、いろんな作業を簡単に実現できます。
ブラウザが持つほとんどの機能を使えるため、とても強力です。
このexec
命令を使えば、HSP3Dish.jsが持っていない機能もJavaScriptを経由して実現することができます。
ただし、HSP3のマニュアルにはこの機能について詳しい記載がないので、忘れないようにここに書いておこうと思います。
HSP3Dish.jsにおけるスクリプトの最小構成
exec
命令の使い方を説明する前に、HSP3Dish.jsでスクリプトを動かすための基本的な構成について書いておきます。
HSP3Dish.jsはWindows版と違う動作をする部分があります。いくつかありますが、ここでは次の点を挙げておきます。
redraw 0
の後にboxf
で背景を白く塗りつぶす必要がない。- HTML5版では、必ずメインループが必要。
await
命令の待機時間設定が無視され、ブラウザ側で設定されたFPS値が使われる
以上を踏まえてHSP3Dish.jsの最小構成を書くとこのようになります。(蛇足でFPS表示も加えてあります。)
#include "hsp3dish.as"
#include "d3m.hsp"
*main
redraw 1
await 0
redraw 0
pos 0,0
mes "" + d3getfps() + " fps"
; ここにメインの処理を書く
goto *main
実際に開発を行う際はデバッグ作業はWindowsで行うので、await 16
やboxf
といったいつも通りの処理は入れておいたほうがいいと思います。
ここで大事なのはHSP3Dish.jsではどのように動作しているか理解することです。
蛇足ついでにもう一つ。スマホでHSP3Dishを動かすと、mes
がとてつもなく重いという問題があります。
文字数が増えると動作がかなり遅くなるので注意が必要です。
この例では問題ありませんが、mes
命令の安易な利用はなるべく避けた方が良いでしょう。
execの使い方
ここからはHSP3Dish.jsでのexec
命令の使い方について掘り下げてみようと思います。
exec
命令は、await
命令の代わりに使用する形になります。以下のポイントを押さえる必要があります。
これらの制限を守らないと、想定外の動作が発生することがあります。
await
命令を削除し、await
があった位置に1個だけexec
命令を配置。- 1ループで実行できる
exec
命令は1回まで。
exec命令にはいくつかの特性があり、これが制限の理由になっています。
- ループ内で
exec
を実行すると、await
命令と同様にFPS値に合わせて一定時間待機が発生します。
ループ内にawait
とexec
の両方がある場合、FPS値が半分になります(1ループで2回待機が発生している)。 - await同様に画面の消去をする機能が与えられている。
exec
がredraw 0
の後にあると、画面が白く点滅します。
以上を踏まえてexec
を使用した最小構成(にfps表示を加えたもの)は以下のようになります。
#include "hsp3dish.as"
#include "d3m.hsp"
exec_text = ""
*main
redraw 1
exec exec_text ; HSP3Dish.js用
; await 30 ; Windows用
redraw 0
pos 0,0
mes "" + d3getfps() + " fps"
goto *main
- 実行したいJavaScriptがない場合、引数
exec_text
に空文字を渡すことで何も実行されません。 - 実行したい内容がある場合だけ、
exec_text
にJavaScriptを渡します。
Windowsとの互換性
前の章のスクリプトはWindowsでは動作しません。
Windowsでデバッグ作業する際は、exec
をコメントアウトして代わりにawait
命令を有効にする必要があります。
例: Windowsでのデバッグ
#include "hsp3dish.as"
#include "d3m.hsp"
exec_text = ""
*main
redraw 1
; exec exec_text ; HSP3Dish.js用(コメントアウト)
await 30 ; Windows用
redraw 0
pos 0,0
mes "" + d3getfps() + " fps"
goto *main
このようにすると、Windowsでもデバッグ作業を行うことができます。
exec
でJavaScriptを呼びだして得られる機能は使えませんけどね。
sysinfo
Windowsで動かすかブラウザで動かすか、場合によって毎回スクリプトを書き換えるのは面倒です。
いつかきっと修正を忘れて「動かない!」と頭を抱える時がやってきます。
というわけで、解決方法を考えてみました。
sysinfo
命令(システム情報の取得)を使えば、実行環境の違い(HSP3Dish.jsかWindowsか)を取得できるのではないかと思ったので試してみました。
以下は実行結果です。
0 : 文字列 OS名とバージョン番号
HSP3Dish.js:Emscripten 1.39
Windows10:WindowsNT ver10.0
2 : 文字列 ネットワーク上のコンピュータ名
HSP3Dish.js:(空文字)
Windows10:(デバイス名)
3 : 数値 HSPが使用する言語(0=英語/1=日本語)
HSP3Dish.js:0
Windows10:1
1 : 文字列 ログイン中のユーザー名
16 : 数値 使用しているCPUの種類(コード)
17 : 数値 使用しているCPUの数
33 : 数値 物理メモリサイズの使用量(単位%)
34 : 数値 全体の物理メモリサイズ
35 : 数値 空き物理メモリサイズ
36 : 数値 スワップファイルのトータルサイズ
37 : 数値 スワップファイルの空きサイズ
38 : 数値 仮想メモリを含めた全メモリサイズ
39 : 数値 仮想メモリを含めた空きメモリサイズ
HSP3Dish.js:(9桁の数字 …意味不明??)
Windows10:(各取得値)
どうやらsysinfo(0)
を使うと実行環境がわかるようです。例えば、以下のような感じでしょうか。
Windows版とHTML5版以外は何が返ってくるかわからないので、取得値をそのまま返します。
s = sysinfo(0)
type = s
v = instr( s, 0, "Windows")
if v>=0 : type = "Windows"
v = instr( s, 0, "Emscripten")
if v>=0 : type = "Emscripten"
getreq
2025/02/05 追記
プログラムが実行される環境(プラットフォーム)を知る方法は他にもあります。
先日、zakkiさんに教えていただいたgetreq
命令を使った方法です。
sysinfo
命令よりも使いやすいので大変におすすめです。
getreq命令で、設定タイプをSYSREQ_PLATFORM
にするとプラットフォームを確認できます。
PLATFORM_WEBGL
が返ってきたらhsp3dish.jsです。
getreq idPlatform, SYSREQ_PLATFORM
…
*main
redraw 1
if idPlatform = PLATFORM_WEBGL {
; hsp3dish.js(WebGL/JavaScript)版
exec exec_text
} else {
; Windows版など他環境
await 16
}
redraw 0 : color 10,10,10 : boxf : color 255, 255, 255 : pos 0,0
…
次の予定
以上、HSP3Dish.jsでexec
を使ってJavaScriptを実行する方法でした。
これでHSP3からJavaScriptを実行することができるようになりました。
次は、JavaScript側が持っている値をHSP3に返す方法が必要ですね。