HSPの情報サイト「Let's HSP!」はページを移転しました。

this page has moved...

[新] http://lhsp.s206.xrea.com/
[旧] http://www.geocities.co.jp/Playtown-Yoyo/6130/hsp/

Let's HSP! HSP

Last Update : 2005/02/xx


HSP (Hot Soup Processor) のバージョン2.x について、あれやこれや書いてあるページです。 φ(_ _ )


I. スクリプトエディタ

 標準で付属している HSPスクリプトエディタ に関するそれほど役に立たない情報です。

エディタ表示色の変更
 HSPスクリプトエディタの文字色は、メニューの [オプション]→[フォント] のダイアログで [文字飾り] の [色] で変更できます。背景の色は、[背景カラー]で変更できます。背景白に文字色黒や青や灰色というように、自分にとって見やすいエディタ色にしてみましょう。ちなみに、HSPの命令やパラメータごとに様々な文字色を表示したい場合は、他のサポートしたエディタを使用するしかありません。


エディタのサイズ制限
 HSPスクリプトエディタでは、ソースコードはだいたい「48KB」のファイルサイズまでしか扱うことができません(Windows 9x環境での仕様)。制限を越えると、「テキストの容量がオーバーしました」 というエラーが表示されます。巨大なソースコードを扱う場合は、コードを分割して、HSPの「#include」で結合するようにしましょう。


ASファイル の関連づけ
 ASファイルをHSPスクリプトエディタに関連づけすれば、このファイルをクリックしただけで、HSPスクリプトエディタで開けます。HSPのインストーラ版は自動で関連づけをやってくれます。やり方は、<*.as>ファイルを右クリックし、アプリケーションから開くをクリックします。開くためのアプリケーション(HSP)を選択すれば、すべてのASファイルが関連づけられます。


レジストリ
 HSPスクリプトエディタのすべての設定はレジストリに保存されています。レジストリエディタを起動するには、[ファイル名を指定して実行] で「regedit」と入力します。レジストリのデータの削除は自己責任で。
 > "HKEY_CURRENT_USER\Software\OnionSoftware"


II. プログラミング チップ集

 HSPプログラミングのチップ集と言えるほどのものではありませんが、ちょっとした情報いろいろです。

ファイルプロパティの表示
 標準のexec命令で、コンテキストメニュー操作名に 「properties」 を指定するすると可能です。ちなみに、「find」 だとフォルダ名を指定先とした検索ダイアログを開くことができます(環境によってはエラー???)。

exec "ファイル名",0,"properties"
exec "フォルダパス名",0,"find"


マウスポインタの表示オフ
 マウスポインタの非表示にするにはHSP標準の「mouse命令」で可能です。そして、パラメータなしで元に戻ります。

mouse -1 ; ポインタ消よ!
wait 200
mouse ; ポインタ戻れ! (パラメータ0が省略されている)
stop


パックファイルに入れるデータ
 HSPのパックファイル(PACKFILE)機能に入れるデータは、基本的に「start.ax」だけです。それほど大きなソフトには感じられない割に、やたらとサイズが大きいHSP製ソフトのをかつて見かけたことがあり、中身をバイナリエディタで眺めてみると・・・(暗号化機能が付く前の話ですが)。<hsprt>ファイル が入っている・・・。はてまた、ソースコード <*.as> そのものが含まれている・・・・・・。<hsp2.exe> 、 <hsprt> 、 <hsptmp> 、 <obj>、 <***.as.i> 、 <*.as> 、 <*.dpm> はいっさいパックする必要はありません。


起動時のオブジェクトのちらつき防止
 ボタンや入力ダイアログをたくさん置くと、HSP製実行ファイルの起動時にこれらのオブジェクトがどんどん配置されていく様子が丸見え。このときに使うのが、gsel命令 です。HSPの自ウィンドウにすべてのオブジェクトを配置したコードの後に「gsel 0,1」を書き、実行ファイルの作成時に「起動時にメインウィンドウを非表示にする」オプションを有効にします。これにより、ウィンドウが非表示の状態のままオブジェクトが裏で配置され、この命令を受けてウィンドウが表示されます。起動時間も短縮されるので一石二鳥。


font命令で指定するフォント名
 PCにはたくさんのフォントが入っていますが、必ずしも自分の持っているフォントが他人のPCに入っているとは限りません。つまり、自分の環境で表示できた文字形式が、他人の環境では表示されないことがあるのです。
 通常、Windows自体がダイアログなどで使用しているフォントは 「MS UI Gothic」 や 「MS Pゴシック」 です。ちなみに英語圏は 「MS Sans Serif」 です。


HSPウィンドウ表示色
 一般的にウィンドウの表示色は灰色で、「cls 1」 でこれを表示されることができます。ところが、チェックボックスなどを置くと、若干色が薄いというのがわかります。おまけに、Windowsの画面のプロパティで配色を変更しても、灰色のまま変わりません。
 このときに利用するのが、HSPのmesbox命令 の 「スクロールなし、スタティックテキスト」 モードです。「a = "" : mesbox a,サイズX,サイズY,2」を最初に書いて、その後にオブジェクトを置けば、Windows標準の表示色です。しかし、これにも問題があって、input命令 やl istbox命令 の表示がおかしくなります。


gettime命令 と1ケタ
 日付時間を収得するgettime命令は、1ケタ数の 「1月」 や 「4時」 はそれぞれ 「1」 や 「4」 で結果が返ります。0を先頭に付けた2ケタ数を利用するには、HSPのstr命令(10進数2ケタ)で変換しなければなりません。


dialog命令の複数ファイルを表示
 dialog命令 のファイル読み込みで複数の拡張子を表示するには、

dialog "exe;*.as;*.html",16,"ファイル"

というように 「;」(セミコロン) でつなげます。先頭の拡張子には 「*.」 は付けません。なお、複数のファイルを選択したり、ファイルの種類を複数用意できるようにするには、HSPモジュール「llmod.as」を使用した「multiopen命令」があります。


button命令 のオブジェクトID
 button命令 のボタンが押されると、その押されたボタン の「オブジェクトID」 がHSPのシステム変数 stat に返ります。これを利用すれば、ジャンプ先を1箇所にまとめることができます。

button " a ",*jump : ID 0
button " b ",*jump : ID 1
stop

*jump
if stat = 0 : dialog "a ボタンじゃ!"
if stat = 1 : dialog "b ボタンじゃ!"
stop


選択されているオブジェクトID
 objsel命令 で 「objsel -1」 と指定すると、入力フォーカスのように選択されているオブジェクトIDをシステム変数 stat に返ります。


オブジェクトID「-28」
 オブジェクトID の -28 は自ウィンドウを示す数値です。この -28 を指定することで、objprm命令 はタイトル名の変更、clrobj命令 はプログラムの終了(onexit命令未経由) になります。なお、下の 「objsend命令チップ集」 も参照してください。ちなみに、ウィンドウID の 32 は デバッグウィンドウ を示しています。


どちらが高速か
 mes命令 と print命令 は意味が全く同じです。それぞれの命令を10,000回ループさせる形で時間を取得し、スピード差を比較(2回)してみました。mes命令は0.90秒/0.91秒、print命令は0.87秒/0.88秒でした。実際に体感できるほどの差では全くありませんが、スピードは print命令 に軍配が上がります。(※注: HSPのバージョン2.6からはスピードに差なし)
 同じような感じで、「a=a+1」 を意味する 「a++」 と 「a+」 を 1,000,000回 ループで比較してみましょう。「a++」 は1.50秒/1.50秒、 「a+」 は1.75秒/1.84秒で、 「a++」 に軍配です。


GUIメニューバー
 ソフトには上部によく付いているメニューバー。HSPは標準でメニューの表示機能は用意されていません。専用のHSP拡張プラグインを使用するか、HSPモジュール「llmod.as」を利用することになります。検索キーワード「HSP メニューバー」。


ウインドゥの位置座標
 HSPのメインウィンドウをタスクバー上の最小化状態で右クリックによる終了を行うと、 「ginfo 2」 の prmx と prmy には、9x系 は 「3000」 、NT系 は 「-32000」 という特殊な数値が代入されます。次回起動時のためにウィンドウ位置を保存している場合は要注意。このままの数値を利用すると、デスクトップの遙か彼方で起動することになります。


16進数を10進数に変換
 裏技的な方法ですが、以下のような感じでにすると、FF00AA の10進数が binary に代入されます。なお、10進数を16進数に変換するにはHSP標準の「str命令」で可能です。

binary = "$"+"FF00AA"
int binary
mes binary
stop


大文字から小文字
 HSP標準のgetpath命令 は基本的にファイルパスに対する変換処理ですが、単純な英字をすべて小文字に変換することもできます。指定する情報タイプは16です。また、HSPモジュール「llmod.as」には、charupper命令(大文字変換)とcharlower命令(小文字変換)があります。


複数アイコン
 HSPの実行ファイルは基本的に 32x32 サイズの1アイコンスペースしか用意されていません。そのため、16x16 サイズや 64x64 サイズのアイコンや複数のサイズを含めたアイコンで書き換えると、無効な実行ファイルとして起動できなくなってしまいます。
 複数のアイコンを持つファイルを作成するには、これに対応したHSPコンパイラを利用して作成するしかありません。


サイズの最適化
 HSP製実行ファイルのサイズをほんの少しだけでも小さくするには、使用していないラベルの削除 (-4バイト)、初期値が決まっている 0 などの削除 (-2バイト)、「""+abc+""」 を 「""+abc」 に変更 (-5バイト)、「if (a = 1)|(b = 1)」 を 「if a = 1|(b = 1)」に変更 (-4バイト)、といった感じです。
 逆に変わらないのは、「a=1」 と 「a = 1」 のような単なるスペースの違い、「a ! 1」 と 「a != 1」 のような違い、「a=1」 と 「a==1」 のような違い、「*aaaaaa」 と 「*aaa」のようなラベル名の文字数の違い、「data = "abc"」 と 「data = "abc」の違い、といった感じです。
 また、HSPのバージョン2.6でサポートされた拡張マクロを全く使用しない場合は、commonフォルダ の hspdef.asを ちょっとだけ別名にリネームしてコンパイルしてみましょう。-10バイトのサイズ減少です。これは使用する、しないに関わらず基本的にこのファイルを読み込む仕様ようになっているためです。


XPビジュアルスタイル
 Windows XPには新たなウィンドウ表示スタイル 「ルナ」(Luna) が導入され、ボタンや入力ボックスが丸みを帯びて半透明に表示されます。HSPは内部にこのスタイルを標準では持っていません。そのため、XP上でもWindows 9xと同じ旧スタイルで表示されます。
 XPスタイルを持つ実行ファイルを作成するには、これに対応したHSPコンパイラを利用して作成する方法、外部 「manifestファイル」 の導入があります。


コンパクト版拡張ランタイム
 JPEGイメージ画像を読み込む必要がないプログラムには、コンパクト版ランタイム を使用して実行ファイルを作成しましょう。通常よりも 20KB ぐらいサイズが小さくなります。作成にはHSPランタイムマネージャーを使用しますが、詳細な説明はHSPマニュアルに書いてあります。


HSP移植版
 現在、HSPは Windows版 と ベータの Mac版(Classic) が公式リリースされていますが、インタプリタの特性を活かしていくつかのプラットホーム向けの 非公式移植版 が存在します。
 一番有名なのがNeosoftの HIROMI氏 が制作した Javaアプレット版HSP 「HSPLet」 でしょう。HSP2.55用で、命令の制約はありますが、OS関係なしにインターネットブラウザ上で動作するプログラムを制作することが可能です。なお、「HSPLet」の公式サイトはすでに消滅しているので、検索エンジンなどを利用して転載しているサイトへ。(ちなみに、Group Finityの Yuki氏 が製作したHSP2.6用「HSPLet」も存在していたようですが、サイトは閉鎖で入手困難?)
 また、K-K氏が制作したフリーのOSである Linux用のHSP 「xhsp」 も存在します。同制作者さんは FreeBSD用拡張ランタイム(HSP コンソール用ランタイム)というのもリリースしています。


丸みのあるウィンドウや画像ウィンドウ
 サウンドプレーヤーなどのスキン機能でよく見られますが、長方形でない丸みを帯びた感じの様々なウィンドウは 「(不定形)リージョン」 と呼ばれる技術です。HSPではプラグインやモジュールでこの機能をサポートしているのがあるので探してみましょう。


exgoto命令
 こんなもの見たことない、という人もいるかと思いますが、マクロ処理用に用意されているHSP標準命令です。


MP3ファイルの再生
 高圧縮高品質サウンドでお馴染みのMP3の再生にはHSP拡張プラグイン(DLL)がよく利用されています。しかし、再生だけであれば標準のmci命令でも可能です。(要Windows Media Player)

mci "open ファイル.mp3 type mpegvideo2 alias abc"
mci "play abc"


MCI命令 で GIFファイル を表示
 日本では2004年6月、GIFの圧縮アルゴリズムに関する特許は失効。と、言うわけでHSP標準の「MCI命令」でGIFファイルを単純に表示する方法です。ただ、あまり使い勝手がいいものではないです。(JPEG&BMPファイルの表示も可能、アニメーションGIFも可)

dialog "gif;*.jpg;*.bmp",16,"画像ファイル" ; 変数 refstr にファイルパス
mref bmscr,67 : hwnd = bmscr.13 ; ウィンドウハンドルを取得
mci "open \""+refstr+"\" alias imagefile type mpegvideo style child parent "+hwnd+""
mci "play imagefile" ; 表示するん
stop

 ちなみに、表示位置を変更するには、「mci "play imagefile"」 の前に

mci "where imagefile source" ; 画像サイズを取得
imagesize = refstr ; 変数 refstr に [x座標 y座標 横サイズ 縦サイズ]
getstr imagesize,imagesize,4 ; [0 0 (横) (縦)] となっているので、サイズ部分だけ取り出す
mci "put imagefile window at 50 100 "+imagesize+"" ; 表示位置が x座標=50、y座標=100

を入れます。表示位置を指定する場合、画像サイズも指定しておかなければならないので、このように少々めんどうな処理になっちゃうわけです。(画像サイズを知るには、GIFファイルの ヘッダー部分 を直接チェックする方法も)
 音楽や動画を扱える MCI命令 の詳細は、HSPのヘルプマニュアル や Mr.Manri's Homepageさん の検証情報を参照してください。(MCIコマンドはいろいろとあってよー分からん


実行ファイルのUPX圧縮
 UPX は実行ファイルなどを実行可能なまま圧縮し、サイズを小さくすることができるDOS用ソフトです。ところが、これをそのまま使用してHSP製実行ファイルを圧縮すると、無効なファイルとして起動できなくなってしまいます。
 しかし、HSPランタイムに対して圧縮することは可能です。これを補助する形でコードから実行ファイルを圧縮作成することができるツール(コンパイラ)がいくつかリリースされています。現在は実行ファイル自体に圧縮を施すツールもあります(拙作HSPツール)。


III. objsend命令 チップ集

 プログラムのチップ集と言えるほどのものではありませんが、HSPの「objsend命令」のちょっとした情報です。HSPのマニュアルから引用すると、「Windowsオブジェクトが使用するメッセージを直接記述することができる」もので、「間違って使うと、Windowsの動作に影響を与えることにもなるので、十分に注意して使ってください」とのことなので、動作の保証はありません。あと、コードの実用性や有用性はあまり考えてません。

ウィンドウに対して送信
 ちなみに下の変数 「a」 はダミーです。


オブジェクトに対して送信
 上記のいくつかの応用として 「-28」 の部分(XX)にオブジェクトIDを指定すると、HSPのオブジェクト(ボタン、チェックボックス、リストボックス、コンボボックス、入力ボックス、メッセージボックス)に対して以下の効果が得られる場合があります。動作の保証はありません。なお、HSPの「onclick命令」や「button命令」で処理を飛ばすような感じにしないと、うまく機能しないものもあります。


IV. エミュレータ関連ソフトを作る際のチップ集

 基本的にはエミュレータランチャーソフトをHSPで作成する場合。今までHSPを利用して「小さいHSP製ソフト」を作ってきたことから知ったことを適当に書き出しています。

エミュレータの起動
 エミュレータを起動し、ゲームを読み込ませる処理はHSP標準の「exec命令」を利用します。たとえば、エミュレータの実行ファイル名が「abcdemu.exe」でゲームファイルが「ooo.hg」なら、

romfile = "ooo.hg"

exec "abcdemu.exe "+romfile+"",1
あるいは拡張子「.exe」を省略して、
exec "abcdemu "+romfile+"",1

 といった感じ。ただ、このような起動方法は必ずしも可能なわけではなく、エミュレータの対応次第です。エミュレータの実行ファイル(アイコン)上にゲームファイルをドラッグ&ドロップして、ゲームが読み込まれるエミュレータで使えます。
 ちなみに、上の例は前提としてエミュレータやゲームファイルがランチャーと同じフォルダにある場合。別の任意の場所にあるなら、以下のような感じで全パスを渡してやります。文字量があるので、「sdim命令」で容量確保をしておくことをお忘れなく。

sdim emufile,256 ; 適当に容量確保
sdim romfile,256 ; 同じく

emufile = "c:\emulator\aaaemu\abcdemu.exe"
romfile = "c:\emulator\aaaemu\game\ooo.gb"

exec ""+emufile+" "+romfile+"",1


DOS用エミュレータ
 DOS用エミュレータ(最近はSDLライブラリを利用したWindows用エミュレータ)は、DOSプロンプトを利用するので、WindowsのGUIに慣れてしまうと少々扱いにくいです。おまけに今はDOSプロンプトを知らなくてもWindowsが扱えるので、DOSプロンプト自体を知らない、なんてな人もいるわけです。そのような時にランチャーは便利です。
 DOS用エミュレータは一般的にDOSコマンドラインオプションからエミュレータの設定をカスタマイズできる機能を提供しています(エミュレータの Readme などを参照)。それを起動時に利用するには以下のような感じです。例として、フレームスキップやスクリーンサイズ用のオプションが仮に用意されているとすると、

option = "-frameskip 2 -screen 2"

exec ""+emufile+" "+option+" "+romfile+"",1
あるいは、
exec ""+emufile+" "+romfile+" "+option+"",1

 となります。オプション部分はゲームファイルのパスの前後に渡すスタイルがほとんどでしょう。なお、DOS用エミュレータは起動時に「DOSプロンプト画面」と「ゲーム画面」の2つが表示される場合があるので、最初の不要なDOSプロンプト画面は、以下のように「最小化モードで実行」を利用するとすっきりします。(完全な非表示はHSPの標準命令では不可)

exec ""+emufile+" "+option+" "+romfile+"",3


圧縮したゲームファイル
 エミュレータは圧縮(ZIP形式など)したファイルを読み込めるような機能に対応していることが多いです。対応しているならば、圧縮ファイルのままパスを渡すだけでOK。一方、対応してない場合はランチャー自身が解凍してパスを渡してやる、というスタイルが一般的。
 HSPでは解凍用プラグインを使う(ある程度簡単?)、あるいはHSPモジュール「llmod.as」を利用して解凍用ライブラリ(ZIP形式であれば「UNZIP32.dll」)を直で利用する(上級?)、といったところ。ファイルはWindowsのテンポラリフォルダにいったん解凍し、読み込み後に削除する?


エミュレータ関連プラグイン
 GB/GBCエミュレーションを行うHSP拡張プラグイン「Hspboy」を利用したソフトの紹介と、その他のエミュレータに関連するHSP拡張プラグインを適当に紹介しています。


V. テキトー リンク

 有名なHSP関連サイトへのテキトーなリンクです。

Hot Soup Processor Page ... HSPの公式サイト。(onion software)

HSPセンター ... 初心者向けHSP講座。

HSP Help Center ... 各種HSPマニュアルのヘルプ。

HSP-NEXT ... HSPチップ集、各種モジュール。

ちょくとのページ ... HSPからWin32 API関数を利用する情報。

チキチキチキニータ ... HSPサンプル。

HotSoupProcessorBeginner'sClub ... 初心者向けHSP講座。チップ集。

HSPプログラミングの本 ... HSP3用の市販本の紹介。


= Let's Emu! =