このマニュアルでは、HSPによるプログラミング方法と言語仕様全般を解説したものになっています。 もし初めてプログラミングに挑戦するという人は、最初に「初心者のためのHSP入門」を読むことをお勧めします。
もし、ある程度プログラミングの経験があり、HSPが初めてという方はこのクイックスタートをお読みいただいて実際に使ってみることをお勧めします。 使っている過程でわからないことが出てきたら、このマニュアルで検索をして調べてみてください。
- HSPで実行されるプログラムリストを「スクリプト」と呼んでいます。これを編集するエディタが、HSPスクリプトエディタ(hsed2.exe)です。これを起動して、スクリプトを記述したら[F5]キーを押して実行させることができます。付属のサンプルプログラムなどを実行して試してみてください。
- HSPでは、「rnd a,10」のように「命令」+「パラメータ(「,」で区切って複数指定することもできる)」という形式で スクリプトを書いていきます。命令は1行目から順番に実行されていきます。 HSPスクリプトエディタでキーワード(命令)にカーソルを合わせて[F1]を押すと手軽にリファレンスを 参照することができます。
- 命令の基本はBASICに近いものになっています。「変数=数値」で変数代入をしたり、「screen 0,x*64,y」のように数値、変数を混ぜた式をパラメータとして指定することができます。 ただし、式の評価は多くの言語とは違い優先順位がありません。常に左から順番に演算が行なわれます。 優先順位をつける場合は明示的に括弧「(…)」を入れる必要があります。
- 変数には数値と文字どちらでも代入が可能です。変数や型のの宣言は必要ありません。 文字列は「a="string"」のように「"」で囲んだ形で記述します。 文字列の演算は結合(「+」)のみ可能です。
- 変数の配列は、「変数.要素」の形で「.」を使って区切ります。配列を使用するためには、あらかじめdim、sdim命令で領域を確保する必要があります。
- プログラムの流れを制御するためのgoto、gosub命令が用意されています。そこで指定するラベルは、行の先頭に「*ラベル名」の形で定義します。繰り返しの記述は通常、repeat〜loop命令で行ないます。これは、C言語のfor、while、doを簡略化したものと捉えることができます。 この他にも、while〜wend、do〜until、for〜next、switch〜caseなどC言語ライクなマクロ命令が用意されています。 詳しくは、「標準マクロについて」を参照してください。
- 作成したスクリプトは[ctrl]+[F9]で実行ファイルに変換することができます。 詳しくは、「EXE,SCRファイルの作成方法」を参照してください。
HSPはプログラム(命令と実行の順序を記したもの)によって動作します。 そのもとになるのがスクリプト(ソースファイル)です。これはテキスト ファイルの形式で、拡張子は .AS になります。 スクリプトはHSPに付属しているHSPスクリプトエディタ(HSED2.EXE)や、 テキストエディタなどのアプリケーションで作成することができます。
HSPスクリプトエディタ(HSED2.EXE)を使用すると、非常に簡単にHSPの スクリプトを作成、編集、実行することが可能です。HSPスクリプト エディタを使用した場合は、
1.テキストのスクリプトを書く(xxx.AS) |
↓ |
2.「コンパイル+実行」のメニューを選ぶか、 |
という手順だけで、簡単にHSPのスクリプトを実行して動作を確かめることができます。
HSPスクリプトエディタ(HSED2.EXE)は、HSPのスクリプト編集用のエデ ィタです。コンパイルや実行なども自動的に行なうことができます。 HSPスクリプトエディタを使用する場合には、HSED2.EXEと同じディレクトリに 以下のファイルが存在している必要があります。
HSED2.EXE | : HSPスクリプトエディタ本体 |
HSP2.EXE | : HSP実行ファイル本体 |
HSPRT | : HSPランタイムモジュール |
HSPCMP.DLL | : HSPコードコンパイラDLL |
HSPスクリプトエディタは、本体(HSED2.EXE)とHSP実行ファイル(HSP2.EXE) が必ず同じディレクトリに存在していなければなりません。 また、実行ファイル(EXEファイル)を作成するためには、ランタイム ファイル(HSPRT)も、同じディレクトリに必要です。
HSPスクリプトエディタを起動すると、新規のテキスト編集ウインドゥ が表示されます。あとは普通のテキストエディタと同じように、ファイルをロードしたり、 セーブしたりしながらHSPのスクリプトを記述していきます。 基本的な操作は、Windowsに付属している「メモ帳」とほぼ同じです。 文字列のカット&ペースト、検索などもメニューから選ぶことができます。
編集しているHSPスクリプトを実行させてみるには、メニューから 「コンパイル+実行」を選ぶか、またはファンクションキーのF5を押します。 「実行」またはCTRL+F5を押すと、最後にコンパイルされたスクリプトを実行します。
コンパイル中にエラーが発生した場合は、コンパイル後にエラーの内容と エラーの出た行番号を知らせるダイアログが表示されます。
上の例では、「ラベルが重複している」エラーが行番号15で発生したと いうことを示しています。エラーが発生した場合は、「カーソル」メニューの 「指定行に移動」(またはCTRL+J)を選んで、エラーが発生した行へ移動して その内容をチェックしてみてください。
一般的な使い方としては、HSPスクリプトエディタで編集、 実行を繰り返しながらスクリプトを作成して、完成したらメニューから 「実行ファイル自動作成」([Ctrl]+[F9])を使って完成したスクリプトを EXEファイルやSCRファイル(スクリーンセーバー)に変換して1本のソフトができあがります。
HSPのスクリプトエディタでは、以下のファイルを実行時に作成します。 これらのファイルは、コンパイル時にのみ必要なファイルなのでスクリ プトができあがった時には削除してかまいません。
HSPTMP | : ソーススクリプトのテンポラリファイル |
HSPTMP.I | : ソーススクリプトのテンポラリファイル |
OBJ | : 実行オブジェクトのテンポラリファイル |
ソーススクリプトのアイコンを、HSED2.EXEのアイコン上かまたは、ウインドゥ内にドロップするだけで編集をすることができるようになっています。また、インストーラーからHSPをインストールした場合は、ソーススクリプトのアイコン(「.as」の拡張子を持つファイル)をダブルクリックするだけで、ソースを開くことができます。
ソーススクリプトが編集状態になった後は、そのソースファイルが格納されているディレクトリがカレントディレクトリとなります。
外部のテキストエディタでHSPのソースファイルを編集したものを手軽に コンパイル+実行させるために、スクリプトエディタでは「外部ファイル実行」の ボタンがツールバーの一番右端に用意されています。 これにより、使い慣れた他のテキストエディタを使いHSPのスクリプトを記述 することが比較的容易になります。主な作業手順は以下のようになります。
このような手順で、外部のエディタでスクリプトを編集することができます。この場合、 HSPスクリプトエディタは、コンパイル+実行をするためのランチャーのような状態だと 考えるといいでしょう。ウインドゥのサイズを小さくして、編集部分をなくしてしまえば 画面上にコンパクトに配置することが可能です。
ver2.55よりスクリプトエディタの「カーソル」メニューに 「ラベル一覧」([F11])が追加されました。 [F11]を押すと、現在編集中のスクリプトに含まれるラベルの一覧がリストボックス に表示され、任意のラベルを選ぶことでダイレクトに該当する行にジャンプすることができます。 スクリプトが大きくなって移動が不便な場合や、どのあたりにラベルを振ったか 忘れてしまった時などに便利です。
スクリプトエディタで編集している文字列から、HSP命令のヘルプをボタン1つで呼び出す機能が 「ワンキーヘルプ機能」です。
使用方法は、調べたいキーワードにキャレット(エディタ内のカーソル位置)を合わせて、 [F1]キーを押すだけです。
該当する命令の説明、パラメータの意味などが表示されます。 もしキーワードに該当するヘルプがなかった場合は、アルファベット順のキーワード検索ヘルプが表示されます。
サンプルスクリプトが何をしているのかを調べる時、命令の詳細が思い出せない時などに便利な機能です。
ワンキーヘルプは、いくつかの表示方法を選ぶことができます。 標準では、HSPヘルプマネージャによるヘルプ閲覧に設定されています。
HSPスクリプトエディタでは、この他にもhtmlによる表示、Windows HLP形式による表示や、HSPヘルプマネージャによる表示など、4つの形式をサポートしています。 (HSPヘルプマネージャ形式以外は、対応するヘルプデータを別途用意して頂く必要があります)
1. HTML形式 (オプション)
これらは、HSPスクリプトエディタの「ヘルプ」→「HSPヘルプ設定」メニューを選択して、 設定することが可能です。ver2.5までの標準であるHTML形式ヘルプ表示を行ないます。 指定されたディレクトリに拡張子htmのヘルプファイルが必要になります。
2. Windows HELP形式 (オプション)Windows標準のWinHelpによるヘルプ表示を行ないます。 HSP標準ではサポートされていませんが、ユーザーなどによって作られた ヘルプデータの表示が可能です。キーワードによる検索に対応しています。 指定されたディレクトリにHSP.HLPというファイルが必要になります。
3. HSPヘルプマネージャ形式 (標準)ヘルプマネージャを呼び出してヘルプの表示を行ないます。 指定されたディレクトリにHELPMAN.EXEというファイルと、インデックス データ(idxファイル)およびヘルプデータ(hsファイル)が必要です。 ヘルプマネージャの詳しい説明は、「helpman.txt」のドキュメントをお読みください。
4. Windows HTML HELP形式 (オプション)Windows98標準のHtmlHelpによるヘルプ表示を行ないます。 HSP標準ではサポートされていませんが、ユーザーなどによって作られた ヘルプデータの表示が可能です。キーワードによる検索に対応しています。 指定されたディレクトリにHSP.CHMというファイルが必要になります。
ヘルプのデータは、通常はスクリプトエディタ(HSED2.EXE)の下にある、hsphelpという ディレクトリに格納されています。もし、他のディレクトリに移したい場合や、 ヘルプ表示をしようとした際にエラーが出る場合は、「ヘルプ」→「HSPヘルプ設定」メニューを選択して、 ヘルプデータのディレクトリを再設定してください。(たとえば、「c:\hsp261\hsphelp」など)
入力が空白の場合は、HSED2.EXEの下にあるHSPHELPというディレクトリを参照します。
ver2.61よりスクリプトエディタの「オプション」メニューに「起動時ディレクトリ」が追加されました。 「起動時ディレクトリ」を選択すると、設定ダイアログが表示され起動時のディレクトリに関するオプションを変更することができます。設定は、以下の中から選択することができます。
1. マイドキュメント (標準)
起動ディレクトリの設定は、次回スクリプトエディタを起動した時から有効になります。スクリプトエディタ起動時のカレントディレクトリをマイドキュメントに設定します。 (ただし、Windows95(初期状態)では、マイドキュメントが存在しないため無効になります。)
2. ユーザーが指定したディレクトリ (オプション)スクリプトエディタ起動時のカレントディレクトリを、ユーザー指定ディレクトリに書かれた場所に設定します。 「参照」ボタンを押すことで、ユーザー指定ディレクトリをブラウズすることが可能です。
3. 指定なし (オプション)スクリプトエディタ起動時のカレントディレクトリは、システム標準の場所になります。以前のスクリプトエディタ(ver2.6まで)と同様の動作になります。 (Windows2000以降では、以前のディレクトリ位置を記憶します。)
ver2.61から、ワンキーヘルプの標準ビューアーとしてS.Programsさん作成の「HSP HELP Browser」を起動するように変更されています。
全文検索、グループ別、プラグイン別検索など多機能なヘルプ閲覧が可能になっています。 また、以前のバージョンではヘルプファイル(.hsファイル)を追加した場合に、インデックス構築が必要でしたが、 新しい「HSP HELP Browser」では自動的にヘルプキーワードが更新されるようになっています。 「HSP HELP Browser」およびヘルプファイル、サポートツールについての詳細は、「helpman.txt」「hsphelp.txt」を参照してください。
HSP Help Toolsは、これ以外にも命令ごとの説明データの追加、更新、削除などを簡単に行なうことができる関連ユーティリティーなども含まれています。
また、html形式だけではなくテキスト形式での出力などの機能も用意されています。
HSP Help Tools本体は、HSPで作成されており、ソースも提供されているので、 ツール自体のカスタマイズはもとより、作成されるhtmlの内容に手を加えたり、 別な形式での出力に対応させることも可能です。
ヘルプのためのデータ入力ツールや、ヘルプデータにアクセスするためのモジュールなども 同梱されているので、ユーザーによるヘルプの構築も容易です。
HSP Help Toolsソース本体は、「HSPHELP/SOURCE」ディレクトリに収録されています。
スクリプトの書き間違いや、指定のミスなどでHSPの実行中にエラーを 発見した時には、エラーコードとエラー行番号が表示されるようになって います。ダイアログが出て、
HSP | : error code nn |
in line xxx | |
--> エラーメッセージ |
のような表示が出た時は、スクリプトのxxx行がコードnnのエラーだと いうことを示しています。 エラーコードとメッセージの関係は次のようになっています。
コンパイルされたHSPの中間コードが間違っています。 通常は表示されないエラーです。ファイルが破損している場合や、 予期しない事態が起こった時に表示されます。2 "文法が間違っています"
命令や、変数名、ラベル名の書き方が間違っている時に表示されます。3 "パラメータの数値が異常です"
パラメータの数値が許容範囲を越えている場合に表示されます。4 "計算式でエラーが発生しました"
計算式の書き方が間違っていたり、使用できない記号や演算をしようと した時に表示されます。5 "パラメータの省略はできません"
パラメータの省略ができない部分が省略されている時に表示されます。6 "パラメータの型が違います"
パラメータに指定された型(文字列型、数値型)が、規定のものではない 時に表示されます。変数が指定されている場合は、変数の型が間違っています。7 "配列の要素が大きすぎます"
配列の要素として指定した値が、dim、sdim命令などで設定した数を 越えている時に表示されます。8 "有効なラベルが指定されていません"
ラベルとして指定すべきパラメータが間違っている場合や、 ラベルを示す「*」の後に何もない時に表示されます。9 "gosub,repeatのネストが深すぎます"
gosub命令、repeat命令を多重に実行しすぎた時に表示されます。10 "サブルーチン外のreturnは無効です"
gosub命令で呼ばれていないのに、return命令が実行された時に表示されます。11 "repeat外でのloopは無効です"
repeat命令がないのに、loop命令が実行された時に表示されます。12 "ファイルが見つからないか無効な名前です"
ファイル操作をする時に、指定されたファイルが見つからなかったか、 またはアクセスできないファイルである時に表示されます。13 "画像ファイルがありません"
picload命令で読み込むための画像ファイルが見つからない時に表示されます。14 "外部ファイル呼び出し中のエラーです"
exec命令で外部ファイルを呼び出す際に、何らかの問題が発生した時に 表示されます。15 "計算式でカッコの記述が違います"
計算式で使われている括弧「(、)」の書式が正しくない、または対応が おかしい時に表示されます。16 "パラメータの数が多すぎます"
命令に指定されたパラメータの数が多すぎる時に表示されます。17 "扱える文字列の上限を越えています"
文字列を扱う上での許容量を越えた時に表示されます。18 "代入できない変数名を指定しています"
システム変数や予約キーワードに対して代入しようとした時に表示されます。19 "0で除算しました"
0で割り算をしようとした場合に表示されます。20 "バッファオーバーフローが発生しました"
文字列変数のためにsdim命令や、dim命令で確保したサイズをオーバーした場合や、 変数バッファを超えてアクセスを行なおうとした場合に表示されます。21 "サポートされない機能を選択しました"
gcopy命令でパレットモード時に半透明コピーを実行しようとした場合など、 機能としてサポートされない設定が行なわれている場合に表示されます。
HSPは、以下のような流れでスクリプトを実行しています。
1.コンパイルソーススクリプト(テキストファイル)を解析し、HSP用のオブジェクトファイル(AXファイル) を作成します。(ここまでの作業はスクリプトエディタ(HSED2.EXE)が行なっています)
2.実行オブジェクトファイル(AXファイル)を読み込み、それを実行します。 (この部分は、HSP本体(HSP2.EXE)が行なっています)
ソーススクリプトのコンパイルは、瞬時に行なわれオブジェクトファイルを作成します。 オブジェクトファイルは、ソーススクリプトの余計な部分、コメントなどを排除して コンパクトに、そして高速に実行できる形式になっています。
HSP本体は指定された オブジェクトファイルを読み込み実行するための核となる部分です。 これはHSP2.EXEですべて行われますので、それ以外に余計なDLLやモジュールは必要としません。 もちろん、HSP2.EXE本体には、サンプルデモのデータやスクリプトは入っていません。 スクリプトを最低限動作させるだけの部分なのです。
もし、あなたがHSPで作ったソフトを配布したいと思ったら、単体で実行できるEXE(実行) ファイルを作成することができます。EXEファイルを作成すると、 そのファイルをダブルクリックするだけでスクリプトが動作するようになります。 オンラインソフトや同人ソフトとして配布する際には便利な機能です。
EXEファイルやスクリーンセーバーモジュールを作成する時には、オブジェクトファイルが 必要になります。その際には、スクリプトエディタの「オブジェクトファイル作成」や、 「START.AXファイル作成」のメニューを使います。詳細は、次の項を参照してください。
バッチファイルやコマンドプロンプトから直接HSP2.EXEをファイル名指定 付きで実行させることもできます。hsp2 demo.axのように入力すると、"demo.ax"というオブジェクトファイルが実行されます。
HSPでは、ユーザーが作成したスクリプトや、そこで使用されるデータ ファイルなどを、ひとまとめにしてEXEファイルを作成することができる ようになっています。また、EXEファイルの一種であるSCRファイル( スクリーンセーバーモジュール)も同じ手順で作成できます。
ver2.6からは、実行ファイルの作成をより手軽に行なうことが可能になっています。 スクリプトエディタから現在編集中のファイルをEXEファイルに変換する場合には、メニューから「HSP」→「実行ファイル自動作成」を選択するか、 「CTRL」+「F9」を押すだけでカレントディレクトリに実行ファイルが作成されます。 実行ファイル自動作成のオプションを指定することも可能です。詳しくは、「実行ファイル自動作成について」の項を参照してください。 なお、ver2.55まで行なっていた手作業での実行ファイル作成も可能です。こちらの方法は、以下の通りです。
1. | スクリプトのオブジェクトファイルを作成しておくこと。 この時、最初に実行されるオブジェクトファイル名は、 必ず「start.ax」にしておくこと。これがないと、スクリプトが起動されません。 |
2. | 「PACKFILE編集...」のダイアログで、EXEファイルに含めるための ファイル一覧(PACKFILE)を作成します。ここでは、start.axなど EXEファイルに埋め込むためのファイル名をすべて選択しておく 必要があります。 |
3. | スクリプトエディタのツールメニューから「EXEファイル作成」を選択します。 スクリーンセーバーの場合は、「スクリーンセーバー作成」を選択します。 これで、EXEまたはSCRファイルがカレントディレクトリにできあがります。 |
EXEファイルやSCRファイルを作成するには、必ずPACKFILEが必要に なります。PACKFILEとは、複数のファイルをひとまとめにして、EXE, SCRファイルの中に埋め込むための定義ファイルです。PACKFILEで指定 されたファイルは、スクリプトからは使用できますが、外部からは見え なくなります。これには次のような効果があります。
・ゲームで使用する画像ファイルなどを取り出せないように保護する |
・各ファイルの無駄なクラスタをなくしディスク容量を軽減する |
・大量のデータファイルがディレクトリにちらばるのを防ぐ |
この機能を使えば、EXEの中に埋め込まれた画像ファイルやデータファ イルなどを使うことができ、1ファイルだけの画像や音声を使った ソフトを作ることができます。(ただしMIDIファイルやDLLなど一部のデータ ファイルは埋め込むことができません。また、埋め込んだファイルの 内容を変更して上からセーブすることはできません)
もちろん、スクリプトで使用されているすべてのデータファイルを EXEの中に埋め込む必要はありません。必要だと思ったものだけを、 埋め込み、それ以外は通常の外部ファイルとして置いておいても問題 ありません。ただし、最初に実行されるスクリプト「start.ax」だけは 必ず埋め込んでおく必要がありますので注意してください。 「start.ax」というオブジェクトファイルは、スクリプトエディタのツールメニューで 「START.AXファイル作成」のメニューで作成することができます。
PACKFILEは、スクリプトエディタの「PACKFILE編集...」で簡単にファイルを 選択して編集することができます。ただし、ここで指定するファイル名は スペースを含まない半角で11文字以内のMS-DOSファイルネームでなければなりません。
1. | EXEに埋め込まれたファイルがある場合には、その中からまずロードするファイルを探す。 |
2. | なかった場合には、カレントディレクトリから探す。 |
3. | それでもなかった場合には、pathで指定されているディレクトリから探す。Windows、Systemディレトクリなど。 |
4. | それも見つからない場合は、エラーになります。 |
EXEファイルを作成し終わったら、まず必要最低限と思われるファイル だけを、新しく作ったディレクトリに移して実行できるかどうかを 確認しておくといいでしょう。通常作業を行なっているディレクトリ には、EXEに埋め込む前のファイルがカレントディレクトリに置かれて いるので、PACKFILEで指定を忘れてファイルが埋め込まれていない 場合でも、正常に動作してしまうためです。
「外部ファイル実行」を使用している場合は、「オブジェクトファイルのみ作成」の チェックボックスをONにしてから、外部ファイル実行をすることで、 オブジェクトファイルの作成が可能です。
ver2.6から、EXEファイルに埋め込まれたファイルが正規のものかをチェックする 機構が導入されています。これにより、ウィルス感染されたファイル実行を防止したり、 ファイルを不正に書き換えることが困難になっています。ただし、これによりUPXなどの ソフトを使ってEXEファイルそのものを圧縮した場合にエラーが発生してしまいます。 HSPからUPXなどを使用する場合には、ファイル正規チェックを外したランタイム バージョンを使用するか、オンラインで公開されているHSP用のUPX対応ソフトを ご利用下さい。詳しい情報は、HSPのオフィシャルページを参照してください。
「PACKFILE一覧」ダイアログでは、EXEファイルやSCRファイルを作成する際に必要な データファイル群を選択、管理することができます。ここで選択されたファイルの データは、PACKFILEというファイル名でカレントディレクトリに保存されます。 まず、メニューから「ツール」→「PACKFILE編集...」を選んでください。 「PACKFILE一覧」のダイアログが出ます。これは、おおまかに次のように分かれて います。
ver2.6からは、PACKFILEの指定をスクリプトに記述することが可能になっています。 詳しくは、「実行ファイル自動作成について」の項を参照してください。
右側の大きなウインドゥが、PACKFILEに含まれるファイル名の一覧になります。 |
左側にはファイル選択ウインドゥがあります。上下2つに分けられていて、上がカレントディレクトリのファイル名一覧。下がディレクトリの一覧になります。 |
中央には、各種機能を持つボタンと、ワイルドカード指定をするためのファイルマスク指定ウインドゥがあります。 |
ファイル選択ウインドゥには、中央のファイルマスクウインドゥ(通常は"*.*")で指定 されたファイルだけが表示されます。たとえば、ファイルマスクを"*.AX"とすると、 拡張子が"AX"のファイルだけが表示されるようになります。 表示されるディレクトリを変更したい場合は、左下のディレクトリ選択ウインドゥを ダブルクリックしてください。[..]は、ディレクトリを1つ戻ることを、[-a-]や[-c-] は、ドライブを意味しています。
1. | 左側のファイル選択ウインドゥで、追加したいファイルをクリックして選びます。 ([CTRL]キーを押しながらクリックすることで複数を選択することも可能です) |
2. | 「追加>>」ボタンを押します。 |
3. | 選択したファイルが、右側のPACKFILE一覧に追加されます。 |
1. | 右側のPACKFILE一覧ウインドゥで、除外したいファイルをクリックして選択します。(複数選択はできません) |
2. | 「削除->」ボタンを押します。 |
3. | 選択したファイルが、右側のPACKFILE一覧から除外されます。 |
「全追加>>」ボタンは、ファイル選択ウインドゥに表示されているすべてのファイル をPACKFILE一覧に追加します。 「全削除->」ボタンは、PACKFILE一覧のファイルをすべてクリアします。
PACKFILEの編集が終了したら、「閉じる」ボタンを押してください。選択された 情報ファイルとして、PACKFILEというファイルがセーブされます。 PACKFILE編集によって、実際のファイルが削除されたりコピーされることはありません。 「キャンセル」ボタンを押すと、ウインドゥが閉じ、いままでの選択はすべて 無効になります。
現在のバージョンでは、PACKFILEは、スペースを含むディレクトリをサポートして いません。「Program Files」などのスペースを含むディレクトリ下にあるファイルを 指定すると、うまく動作しないことがありますので注意してください。
ver2.55から実行ファイルに含まれるデータに暗号化を施し、外部からの解析や抜き出しに対処できるようになりました。
暗号化を行なう場合には、スクリプトエディタの「PACKFILE編集」ダイアログ において、PACKFILEに含めるファイルを追加する際に「暗号化」のチェック をONにしておいてください。PACKFILEに含めるファイル一覧の中で先頭に「+」 がつけられファイルは暗号化の対象になります。
ファイルの暗号化は、「start.ax」などのオブジェクトファイルを始めとして 画像ファイルや、テキストファイルなどHSPから読み込まれるファイルすべてに 適用することができます。PACKFILEに含めることのできないファイル、MIDIや 動画ファイルなどは対象にはなりません。
暗号化されたファイルは、bloadなどの命令で読み込んだ場合には、正常な 内容に復号されます。これをbsaveで保存した場合には暗号化されません。
HSPでは、Windows9x/NT/2000/XPで動作するスクリーンセーバーモジュールの 作成が可能です。これは、特殊な命令を使いフルスクリーン画面を 作成してそこに描画された内容がそのままセーバーとなるもので、 通常のスクリプトにちょっと手直しをするだけで作成できます。 スクリーンセーバーの詳細については、サンプルファイルのあるディレクトリ 「ssaver」にある、「start.as」ファイルを開いてみてください。 スクリプトの書き方と実際の作成手順、そしてサンプルスクリプト本体が 書かれていますので参考にしてみてください。
標準の機能では、パスワード保護のないシンプルなスクリーンセーバーが作成可能です。 拡張機能となる、llmod、scrsvrモジュールによりWindows9xのみパスワード保護ダイアログのサポートを 行なうことができますが、 Windows2000、XPなどNT系マシンでのパスワード保護は、外部プラグインが必要になりますのでご了承下さい。
スクリーンセーバーモジュール(SCRファイル)の作成は、色々な約束事があります。 サンプルのスクリプトなどを参考にしながら、覚えていってください。 スクリーンセーバーの設定画面(ID0)のウインドゥサイズは、通常のHSP実行時とは異なり、 スクリーンセーバー作成時に設定されたウインドゥサイズに固定されます。 必ず、作成時に設定するか、#packopt命令などのオプション指定で正しいサイズにしておいてください。
HSPでは、起動オプションを取り込みスクリプトでそれに応じた 処理をすることができます。これにより、色々な機能を持たせた EXEをバッチファイルから呼び出したり、EXEファイルのアイコン上 にファイルをドロップするような処理することが可能になります。
この機能をスクリプトエディタ上から試すために、HSPメニューに 「起動オプション...」があります。これを選択すると、スクリプト エディタ上から起動した時にも、擬似的に起動オプションをつける ことができます。 実際にスクリプトで起動オプションの内容を調べる場合には、 cmdlineというシステム変数を使用します。詳しくは、システム変数 一覧を参照してください。
システム変数cmdlineには、最大2048文字までの起動オプション文字列が取り込まれます。
HSPでは大きくノーマルウインドゥモードと、フルスクリーンモード を選ぶことができます。ノーマルウインドゥモードは、通常の Windowsアプリケーションと同じくデスクトップ上に任意の大きさの ウインドゥが開いて、それ以外の領域にはデスクトップ画面が見えて います。フルスクリーンモードでは、デスクトップのかわりにユー ザーが任意に指定した壁紙をバックにした画面になり、ディスプレイ 全体がHSPの画面となります。HSPのスクリプトが終了しない限り 別のウインドゥアプリケーションには移ることができません。 この2つのモードは、スクリプトエディタのHSPメニューにある、 「フルスクリーンモード」を選択することで切り替えることができ ます。
配布用の実行ファイルは自由にアイコンを書き換えていただいて構いません。 通常、EXEファイルやSCRファイルを作成すると、Windowsから見た アイコンはHSP2.EXEと同じものになっています。
現在のHSPには、アイコンの編集機能はありませんがアイコンを直接 書き換えるソフトを使用していただくことができます。
また、tomさん作「ICONREWR.DLL」などユーザー作成によるアイコン書き換え ツールを使うことでも可能です。詳しくは、以下のURLにある画像処理DLLを参照してください。 配布用の実行ファイルは、アイコンを自由に書き換えて頂いて構いません。
HSPがインストールされたディレクトリ(C:\Program Files\hsp26\など)にある、 「sample」フォルダ以下には、HSPスクリプトエディタから実行可能なサンプルが 多数収録されています。エディタから開くメニューを選択するか、ファイルを ドラッグ&ドロップするなどして読み込み実行させることができます。
basicフォルダ HSPの基本機能を使用したサンプル demoフォルダ サンプルデモのソースとデータ hgimgフォルダ HGIMGプラグインサンプル hspdaフォルダ HSPDAプラグインサンプル hspdBフォルダ HSPDBプラグインサンプル hspdxフォルダ HSPDXプラグインサンプル hspextフォルダ HSPEXTプラグインサンプル hspsockフォルダ HSPSOCKプラグインサンプル loadlibフォルダ LOADLIB/LLMOD関連命令サンプル newフォルダ 2.6新機能サンプル ssaverフォルダ スクリーンセーバーサンプル
ファイル"samples.as"には、HSPで使うことのできる簡単な 例が集められています。この中には、多数のサンプルスクリプトが収録されて います。この一部を切り出してスクリプトの一部として使用することができます。 HSPの機能を活用するための参考にしてみてください。 "samples.as"に含まれているサンプルスクリプトは以下の通りです。
HSP ver2.5より、「#include」命令でサーチされるファイルのディレクトリに コモンディレクトリが追加されています。 これは、「#include」命令で挿入されるファイルが、通常はソースファイルと 同じ(カレント)ディレクトリにあるものが使われますが、そこにない場合は、 コモンディレクトリにあるものを使うというものです。 hspext.dllなどの拡張プラグインを使うためのファイル、(hspext.asなど)を コモンディレクトリに置いておけば、それを使うソースファイルと同じ ディレクトリでhspext.asを用意する必要がなくなります。
コモンディレクトリは、HSED2.EXEやHSP2.EXEと同じディレクトリにある 「common」という名前になります。 たとえば、「c:\hsp」というディレクトリにHSED2.EXEがあり、 「c:\script」というディレクトリで「test.as」というスクリプトを編集して いるとすると、「#include」命令でファイルをサーチする順番は、1. 「c:\script」にあるファイルをサーチ
のようになります。
2. なければ「c:\hsp\common」にあるファイルをサーチ
3. それでもなければエラー
EXEファイル作成時に、メインウインドゥを非表示にして起動させることが可能です。 EXEファイル作成のダイアログで、「メインウインドゥを非表示にする」のチェック をONにしてEXEファイルを作成すると、そのEXEファイルは起動時にメインウインドゥ (ウインドゥID0)が最初に表示されなくなります。これは、起動時にウインドゥ サイズを変更したり、表示位置を変更しても一瞬だけウインドゥがデフォルトの位置に 見えてしまうのを防ぎたいという人のためのオプションです。 このオプションをONにした場合は、「gsel 0,1」などの命令でウインドゥをアクティブ にしない限りメインウインドゥは表示されません。 メインウインドゥの位置やサイズをちらつきなく変更したい場合や、メインウインドゥ を表示する必要のないアプリケーションを作りたい時に活用してみてください。 また、メインウインドゥが非表示になっている場合でも、ウインドゥは存在している ので、メインウインドゥに対して行なった描画やオブジェクト配置は正常に実行され 保存されています。
EXEファイル作成時に、ディレクトリ移動を無効にした状態で起動させるスイッチを選択可能です。 EXEファイル作成のダイアログで、「起動時のディレクトリ移動を無効にする」のチェック をONにしてEXEファイルを作成すると、そのEXEファイルは起動時にカレントディレクリ (作業ディレクトリ)をEXEファイルのあるディレクトリに移動しなくなります。 このスイッチは、通常ONにする必要はありません。 通常の実行ファイル起動時の動作は、起動されたEXEファイルのあるディレクトリに カレントディレクリ(作業ディレクトリ)が合わせられます。つまり、システム変数 curdirとexedirは同一の場所になっています。 ショートカット起動で指定された作業フォルダを反映したいなどの特殊な事情で、 起動時のカレントディレクリを変更したくない場合にのみ、このスイッチをONにして下さい。 ディレクトリ移動を無効にした状態では、起動時のシステム変数curdirとexedirが 同一でなくなることを前提にスクリプトを作成しておく必要がありますのでご注意下さい。
HSPでは、拡張プラグインという形で機能を追加していくことが可能です。 これにより、HSP本体だけでは実現できない処理が可能になります。 HSP拡張プラグインは、標準でDLLまたはHPIの拡張子を持つファイルとなっています。 このファイルは、必ずHSP本体(HSP2.EXE)と同じディレクトリに存在していなければ なりません。 また、EXEファイル作成の際にPACKFILEに入れて、1つのEXEファイルにすることは できません。拡張プラグインを使用するEXEファイルを作成した場合は、EXEファイルと 同じディレクトリに拡張プラグインを置いてください。
拡張プラグインは、標準で以下の7種類が同梱されています。 それぞれのプラグインについての使い方詳細は、別途テキストを参照してください。
DLL HSPEXT.DLL Ver2.61 作者:おにたま 作者のページ
HSP ver2.4dから標準で同梱されている、機能拡張プラグインです。
この拡張DLLを使用することにより、40種類以上の新規命令が追加され、 レジストリ操作、簡易数学関数、シリアル通信、拡張画像操作、 拡張ファイルアクセスなど多くの機能がHSPからコントロールできるようになります。 さらにアプリケーションキャプチャー命令の搭載により、HSP以外のアプリケーションを コントロールすることが可能になります。 これらの命令は、HSP単体では実現できないようなツール、ユーティリティの 作成に役立つものが多く、さらに高度なアプリケーション開発が可能になります。
Windows95/Windows98/WindowsNT/2000/XPで動作を確認しています。
DLL HSPSOCK.DLL Ver2.61 作者:おにたま 作者のページ
HSP ver2.4hから標準で同梱されている、TCP/IPソケット通信用プラグインです。
この拡張DLLを使用することにより、LANやインターネットを通じてデータの送受信を行なうことが可能になり、 簡単なクライアント・サーバーソフトを作成することもできます。 他のマシンとのコミュニケーションに、インターネットのクライアントに、ネット対応のゲームなど多くの場面で活用することができるでしょう。
Windows95/Windows98/WindowsNT/2000/XPで動作を確認しています。
DLL HSPDA.DLL Ver2.61 作者:おにたま 作者のページ
HSP ver2.5から標準で同梱されている、データアクセスのためのプラグインです。
大量の文字列や数値をまとめてデータ管理する場合に威力を発揮します。 特に数値や文字列のソート機能は、大量のデータでも短時間で並び替えが可能です。 また、CSV形式のファイルを配列に変換したり検索する機能などが用意されています。
Windows95/Windows98/WindowsNT/2000/XPで動作を確認しています。
DLL HSPDX.DLL Ver2.61 作者:おにたま 作者のページ
HSP ver2.4gから標準で同梱されている、DirectX対応プラグインです。
この拡張DLLを使用することにより、新規命令が多数追加され、DirectXを使用した ハイレベルなソフトを開発することが可能になります。 HSPDX.DLLを使用するためには、Microsoft DirectX3以降(DirectX5以降を推奨)が インストールされている必要があります(Windows98には標準搭載されています)。 また、WindowsNT4.0以降に搭載されているDirectDrawでも動作します。
豊富なスプライト制御命令を持っているので、 面倒な角度ごとの移動、自由落下、衝突判定などを1つの命令で実行できます。 これにより、2Dキャラクタを使ったゲーム、デモなどの作成が従来よりも楽に、そして高速にできます。
Windows95/Windows98/WindowsNT/2000/XPで動作を確認しています。
DLL HSPCMP.DLL Ver2.61 作者:おにたま 作者のページ
HSPシステム機能を持つプラグインです。
スクリプトエディタが持つHSP関連機能(コンパイル、実行、オブジェクト作成、実行ファイル作成) をコントロール可能です。HSPのシステム機能を、HSPのスクリプトから制御することで、 それぞれのユーザーに合った独自のカスタマイズやバッチ処理が可能になります。
Windows95/Windows98/WindowsNT/2000/XPで動作を確認しています。
DLL HGIMG.DLL/HGIMGX.DLL Ver2.61 作者:おにたま 作者のページ
HSP ver2.55から標準で同梱されている、高速画像処理プラグインです。
フルカラー、パレットモードでの2D・3Dグラフィック表示をサポートします。 スプライトを使用した2Dゲームから、3Dモデルを使った本格的なソフトまで幅広く 利用することができます。HGIMG.DLLで追加される主な機能は以下の通りです。
- フルカラー、パレットモード、DirectXの有無などを切り替え可能なアーキテクチャ
- 2Dスプライト、3Dポリゴンなどを共通の命令で設定可能な描画エンジン
- 回転拡大縮小、α合成、透明色抜き処理、タイリング(BG表示)などの特殊効果サポート
- 3D座標上の2Dスプライトと3Dポリゴンを混在可能なワールド管理
- 3Dの階層構造を持ったポリゴンモデル表示、およびアニメーション管理
- 文字フォントテクスチャをもとにメッセージを合成表示
- スプライトの表示、移動の管理および衝突判定機能
- await命令より細かい単位でのウェイトと処理の負荷検出機能
- CPU処理や描画の負荷が変わってもアニメーションの速度を一定に保つ(フォールオフレンダリング)
- 32bit float精度によるジオメトリ演算
- MX形式、DXF形式による3Dモデル表示、MA形式によるアニメーションデータの読み込み
Windows95/Windows98/WindowsNT/2000/XPで動作を確認しています。
DLL HSPDB.DLL Ver2.61 作者:おにたま 作者のページ
HSP ver2.61から標準で同梱されている、データベースアクセスのためのプラグインです。
ODBCを経由して各種データベースへアクセスすることが可能になります。 対応するODBCドライバがあれば、Oracle、MS-SQL Server、dBase、Paradoxなどの データベースにアクセスして、SQLによるコントロール、データの受け渡しを行なうことができます。
HSPDBを使用するためには、WindowsにODBCおよび対応ドライバがインストールされている必要があります。
WindowsNT/2000/XPで動作を確認しています。
HSP拡張プラグインは、仕様が公開されていて、ユーザーの方たちが制作した 多くのプラグインが存在します。
HSPの可能性を大きく広げるプラグインが、以下のURLで多数紹介されています。HSP機能拡張ソフト紹介のページ
http://www.onionsoft.net/hsp/hsp2ex.html
「HSP拡張ランタイム」は、「HSP拡張プラグイン」の機能を DLLファイルなしで実行できるようにするためのシステムです。 簡単に言えば、拡張プラグインを使用したプログラムであっても、 EXEファイルと一緒にDLLファイルを同梱する必要がなくなります。 ただし、どんなDLLでも可能なわけではありません。仕様にもとづいて作られた 「HSP拡張ランタイムモジュール(HRTファイル)」がサポートするDLLのみ、 実現が可能です。 「HSP拡張ランタイム」により、HSPで作られたプログラムを 実行ファイルに変換する際の選択に、幅が広がります。 たとえば、JPEGファイルを使用していないプログラムで実行ファイルを 作成する場合、「コンパクト版HSPランタイム」を使ってEXEファイルを作成すれば、 通常よりもサイズが小さく抑えられます。 公開するEXEファイルのサイズが少しでも小さい方がいい人にもお勧めします。
「HSP拡張ランタイム」についての詳細は、「拡張ランタイムマネージャマニュアル 」(hsperun.htm)をお読みください。
モジュール機能は、HSPをより深く高度に使いたいという方のための 拡張機能です。しかし、この機能はすべての人に必要なものではありません。 初心者の方や、これからHSPを使う方は、まだモジュールについての習得は しなくても大丈夫です。
HSPモジュール機能は、複数のスクリプトをラベル名や変数名の衝突を 気にせず結合するためのものです。
この機能は、いままでのHSPではボトルネックになっていた問題、大きなサイズ のスクリプトを作る時に変数名などの管理がしにくくなるという点、他の人が 作成したスクリプトの再利用が難しかったという点を改善し、より汎用性の 高いスクリプトを組むことができるようになります。
HSPモジュール機能についての詳細は 別途ドキュメント(module.htm) を参照してください。
ver2.4gから新たに、スクリプト実行中にHSPの状態や変数の内容をチェックする ことができるデバッグ機能が搭載されました。この機能を使うための特別な ウインドゥが、「デバッグウインドゥ」になります。これは、スクリプトエディタの 「HSP」メニューの「Debugウインドゥ表示」のスイッチを入れることで、実行時に 常に表示させておくことが可能です。また、このスイッチが入っていない場合でも、 HSPでエラーが起こった場合には自動的にポップアップ表示されます。
デバッグ機能を持たせたためにHSP2.EXEのサイズが多少大きくなって いますが、実行可能なEXE、SCRファイルを作成する場合には、ランタイムのみが 含まれているHSPRTが参照されます。このため、実行可能ファイルには デバッグ機能やエラーメッセージなどのデータ類などは一切含まれません。
- HSPデバッグウインドゥ表示の詳細
デバッグウインドゥの左上のウインドゥで表示カテゴリーを選択します。 選択された情報が、下のウインドゥに表示されます。 情報は、カテゴリーの選択をした時点でのものになります。内容は、 自動的には更新されないので、別な時点での情報を知りたい時には、再び カテゴリーのウインドゥをクリックしてください。
[全般]
現在実行されている行、HSPの状態(実行モード)などが表示されます。 また、gosubやloopのネストレベル(深さ)も表示されます。
[システム変数]
HSPのシステム変数の内容を一覧で表示します。
[MCI]
sndload命令などで読み込まれている音声、動画ファイルの一覧を 表示します。
[モジュール]
モジュール機能が使われている場合に、その詳細を表示します。 登録された新規命令や、モジュール名一覧などを見ることができます。
[変数xxx]
定義されている変数の内容を表示します。 「配列変数を表示」のチェックボックスを入れると、配列の内容を 一覧で表示します。また、「変数のダンプ」のチェックボックスを 入れることで、変数バッファの内容を16進数で表示します。 変数のダンプや配列の表示は、あまりにも大きなサイズが確保されて いる変数の場合は、すべてが表示されない場合があります。 文字列型の変数に、バッファの容量を越えた文字列が代入されている 場合は、警告メッセージが表示されます。その場合は、sdim命令 などで確保するバッファのサイズを大きくしてください。 「モジュール変数を表示」にチェックがついている場合は、 モジュール内部で使用されている変数の内容も表示します。 また、「表示項目をソート」にチェックがついている場合は、 変数名リストがアルファベット順にソートされ検索がしやすくなります。
HSPの通常パッケージは、日本語によるメッセージやメニューが採用されていますが、 起動や実行に関しては、すべての日本語版以外のWindowsでも可能です。
実行ファイル(EXE)やスクリーンセーバー(SCR)を作成した場合も、 英語(US)版Windowsや、欧州版などを含めたWindowsで動作するよう作られています。 (現在は、英語(US)版Windows98でのみ動作確認をしています)
日本語などIMEを標準で搭載しているWindows、日本、中国、韓国、台湾、アラビアなどの 地域向けWindowsでは、フルスクリーン時などにIMEツールバーを消去するように作られて います。そのため、HSP内部ではWindowsにIMEがインストールされているかのチェック をするためのコードが含まれています。
また、HSPのエラーメッセージや、HSPスクリプトエディタのメニューなども含めて英語で 表示されるUS版HSPを別途配布しています。
US版HSPは、 HSPのオフィシャルホームページ (特別バージョンダウンロード)にて入手可能です。
スクリプトが実行された結果をログファイルに記録しながら動作する 履歴付き実行機能が追加されました。 もっとも簡単な使い方は、1. 履歴付き実行をさせるためのスクリプトをスクリプトエディタに読み込む 2. スクリプトエディタから「HSP」→「履歴付き実行」のメニューを選択 3. ダイアログが表示されたら、「実行開始」ボタンを押して実行する 4. 履歴を取りたいところまで実行させる 5. 再びスクリプトエディタから「HSP」→「履歴付き実行」のメニューを選択 6. 「ログの編集」ボタンを押すと履歴(ログ)がエディタが開かれますのような手順で行ないます。これにより、命令1つ1つが実行されるごとに その内容や状態をログファイルに記録します。多くの命令が実行されると、 それだけログファイルも大きくなるので注意してください。
履歴付き実行は、それほど利用頻度の高いものではないですが、 発見が困難なバグや、プラグイン開発、隠れた問題の発見などに効果を発揮します。 特にエラー個所の発見が困難な場合(一般保護エラーで終了した場合など) 直前まで実行していた部分を検証できます。また、割り込み発生時の プログラムの流れや、gosub〜returnネストの不整合チェック、モジュール 呼び出しの様子などを確認することができ、より安定したスクリプトを 作成するための支援となります。
履歴付き実行で使用されるログファイルは、スクリプトと同じディレクトリに 「hsplog.txt」という名前になります。このファイルは、通常のテキスト ファイルになっています。このログに情報を書き込むには次の3つの方法が あります。1. スクリプトエディタから「履歴付き実行」を選択する 2. logmode命令を使用してログ記録のモードを設定する 3. logmes命令を使用してログファイルに直接メッセージを書き込むいずれの場合もデバッグ時にのみ有効になります。実行可能ファイルにした後は これらの機能はすべて無効です。
スクリプトエディタから「履歴付き実行」を選択すると、実行開始時から ログを記録することができます。そうしなかった場合でも、logmode命令を 入れることにより、任意の時点、任意の範囲を履歴付き実行の対象にする ことができます。logmode p1,p2 p1 : 実行履歴(ログ)記録モード 1 = エラー時 2 = 停止/終了時 4 = gosub呼び出し時 8 = module呼び出し時 16 = 外部命令(DLL)呼び出し時 32 = 割り込み呼び出し時 512 = 命令実行時(標準命令) 1024 = 命令実行時(標準のWindows依存命令) 2048 = 命令実行時(代入命令) p2 : 実行履歴(ログ)記録オプション 1 = 実行行 2 = 時刻 4 = 日付 8 = ファイル名 実行履歴(ログ)記録の設定を行ないます。 p1で、どのような時に記録を行なうかを設定します。 複数の項目を指定する場合は、項目の値を合計したものを指定 してください。 p1に-1を指定すれば、すべての項目を指定することができます。 p1に0を指定した場合は、履歴記録は行なわれずに通常の実行と なります。 p2で、記録されるログに付加される情報の項目を指定します。 これも複数の項目を指定する場合は、項目の値を合計したものを 指定します(-1ですべての項目)。 p2の指定を省略した場合は、以前の設定が引き継がれます。 logmes "message" "message" : ログに記録するメッセージ 実行履歴(ログ)にメッセージを記録します。 実行履歴(ログ)記録モードに関わらず、必ずログ記録されます。 ある時点での変数の内容や、通過チェックなどに利用できます。記録された履歴(hsplog.txt)は以下のような内容になります。行番号 ファイル 日付 時刻 実行結果 ------------------------------------------------------------------------ #00000 [test.as] (2001/02/11) (23:01:03) |Start logging:obj #00000 [test.as] (2001/02/11) (23:01:03) |ICMD:$00000002:$04:onexit #00002 [test.as] (2001/02/11) (23:01:03) |LET:$0000000a:h <- 0 #00003 [test.as] (2001/02/11) (23:01:03) |LET:$00000010:b <- 0 #00003 [test.as] (2001/02/11) (23:01:03) |ICMD:$00000014:$2e:logmes #00007 [test.as] (2001/02/11) (23:01:03) |>Test Message #00008 [test.as] (2001/02/11) (23:01:03) |LET:$0000001a:a <- 123 #00009 [test.as] (2001/02/11) (23:01:03) |LET:$00000020:i <- KK #00010 [test.as] (2001/02/11) (23:01:03) |LET:$00000026:a++ <- 124 #00010 [test.as] (2001/02/11) (23:01:03) |DCMD:$0000002a:$27:input #00012 [test.as] (2001/02/11) (23:01:03) |DCMD:$0000002e:$00:button #00013 [test.as] (2001/02/11) (23:01:03) |DCMD:$00000036:$40:objprm #00015 [test.as] (2001/02/11) (23:01:03) |ICMD:$0000003c:$1a:stop #00016 [test.as] (2001/02/11) (23:01:03) |Stopped. #00016 [test.as] (2001/02/11) (23:01:04) |JUMP:0:$0000001e #00016 [test.as] (2001/02/11) (23:01:04) |ICMD:$0000003e:$13:mes #00018 [test.as] (2001/02/11) (23:01:04) |ICMD:$00000042:$1a:stop #00019 [test.as] (2001/02/11) (23:01:04) |Stopped. #00019 [test.as] (2001/02/11) (23:01:06) |IRQ:0:0 #00019 [test.as] (2001/02/11) (23:01:06) |JUMP:0:$00000021 #00021 [test.as] (2001/02/11) (23:01:06) |IF:$00000044:0 #00021 [test.as] (2001/02/11) (23:01:06) |End logging.記録される内容は、記録モードで指定されたイベントごとに異なります。・エラー時
エラーで終了した場合にその内容が記録されます。
・停止/終了時stop命令、end命令などが実行された時点で記録されます。 「Stopped.」のような形式になります。
・gosub呼び出し時gosub,return命令実行時に記録されます。 「GOSUB:xxx」「RET:xxx」のような形式になります。 xxxには、実行される直前のネストレベルが入ります。
・module呼び出し時モジュール機能により登録された新規命令が実行された 時点で記録されます。 「Func:命令名」のような形式になります。
・外部命令(DLL)呼び出し時HSP拡張プラグインにより登録された命令が実行された 時点で記録されます。 「DLL:命令名」のような形式になります。
・割り込み呼び出し時on〜goto,on〜gosubなどにより登録されていた割り込みが 実行された時点で記録されます。 「IRQ:xxx:yyy」のような形式になります。 xxxは割り込みID、yyyは呼び出しタイプIDとなります。
・命令実行時(標準命令)標準命令の中で機種に依存しない命令群が実行された時点で 記録されます。 「ICMD:$xxxxxxxx:$yy:命令名」のような形式になります。 xxxは内部の実行コードアドレス、yyは中間言語コード を示しています。 if命令のみ「IF:$xxxxxxxx:yyy」のような形式で記録され yyyはif命令の論理演算の結果が入ります。 (0の場合は偽、それ以外は真の条件となります)
・命令実行時(標準のWindows依存命令)標準命令の中で機種に依存する命令群が実行された時点で 記録されます。 「DCMD:$xxxxxxxx:$yy:命令名」のような形式になります。 xxxは内部の実行コードアドレス、yyは中間言語コード を示しています。
・命令実行時(代入命令)代入命令が実行された時点で記録されます。 「LET:$xxxxxxxx:変数名 <- 代入値」のような形式になります。 (xxxは内部の実行コードアドレス)
・その他その他、特殊な場面でメッセージが記録されることがあります。 また、logmes命令で記録されたメッセージには「>」が付加されます。
ver2.6から、スクリプトエディタに「実行ファイル自動作成」のメニューが 追加されました。これは、現在エディタで編集中のソーススクリプトを直接 実行ファイルに変換するものです。 今まで、実行ファイル作成には「packfile編集」や実行ファイルの種類、 ファイル名、ウインドゥ初期サイズなど色々なオプションを指定するステップを 踏まなければならず、勘違いやミスが起こりやすかったものをシンプルに 統一したものが実行ファイル自動作成の機能です。
「実行ファイル自動作成」(ctrl+F9)を選ぶと、現在編集中のソースを start.axとして出力して、packfileを作成、「hsptmp.exe」という名前で 実行ファイル(EXE)を生成します。(start.axは暗号化されます)
最も単純なパターンは以上のようなものです。 多くの場合は、自動作成して出来上がる実行ファイルで十分ですが、 さらに細かく設定をする場合や、実行ファイルにリソースとしてファイルを パックしたい場合には、自動作成プロセスをコントロールするプリプロセッサ命令を 置くことで、細かく制御することができます。#pack "ファイル名" [PACKFILE追加ファイル指定] #epack "ファイル名" [PACKFILE追加ファイル指定]実行ファイル自動作成で、packfileに追加されるファイルを 指定します。指定されたファイルは、実行ファイル作成時に リソースとして一緒にパックされます。 #packは、通常の形式でパックします。#epackは、暗号化して パックされます。 重複したファイルを追加しようとした場合には、無視されます。 「start.ax」は、実行ファイル自動作成の際に自動的に追加 されるため特に追加ファイルとして指定する必要はありません。例: #pack "a.txt" #epack "a.bmp"上の例では、「a.txt」「a.bmp」というファイルを 実行ファイルと一緒にパックし、"a.bmp"は暗号化します。#packopt キーワード名 パラメーター [自動作成オプション指定]実行ファイル自動作成の動作を指定します。 キーワード名、の後スペース又はTABを入れてパラメーター (文字列の場合は「"strings"」のように指定)を記述して下さい。 #packoptで指定できるキーワードは以下の通りです。
キーワード 内容 初期値 name 実行ファイル名 "hsptmp" runtime 使用するランタイム "hsprt" type 実行ファイルのタイプ 0 (0=EXEファイル) (1=フルスクリーンEXE) (2=スクリーンセーバー) xsize 初期ウインドゥXサイズ 640 ysize 初期ウインドゥYサイズ 480 hide 初期ウインドゥ非表示SW 0 orgpath 起動時ディレクトリ移動無効化SW 0
例: #packopt type 2 #packopt name "test" #packopt runtime "hsp2c.hrt"上の例では、「test.scr」というスクリーンセーバーを 「hsp2c.hrt」というランタイムを使用して作成します。
今まで通りに、「packfile編集」からパックされるファイルを選択して 実行ファイルを作成することも可能です。 「実行ファイル自動作成」を行なうと、packfileが自動的に作成されるため、 それまで保存されていたpackfileの情報は上書きされるので注意して下さい。 尚、「start.ax」はデフォルトで暗号化されたものがpackfileに追加されます。 また、「#packopt runtime "ランタイムファイル名"」で指定された ランタイムファイル(拡張子がhrtのもの)は、hspcmp.dllと同じディレクトリか、 または、runtimeディレクトリに置かれているものが使用されます。
「初期ウインドゥ非表示SW」のオプションで1を指定した場合には、「初期ウインドゥ非表示SW」がONになります。 (詳しくは、メインウインドゥ非表示EXEファイルを参照してください。)
「起動時ディレクトリ移動無効化SW」のオプションで1を指定した場合には、「起動時ディレクトリ移動無効化SW」がONになります。 (詳しくは、ディレクトリ移動の無効化についてを参照してください。)
ver2.6から、tomさんが製作された拡張プラグイン「loadlib.dll」に含まれる 全機能をHSP標準命令として組み込んでいます。llmodなど多くのloadlib.dll 利用アプリケーションをDLLなしで利用できるようになります。
同梱されているcommonフォルダに含まれるloadlibおよびllmod関連ヘッダ ファイル(llmod.asやloadlib.asなど)は、内蔵命令用に修正されていますが、 過去に作成されたスクリプトなどで古いヘッダファイル(DLLを呼び出すもの) を使用している場合は、内蔵命令のキーワードと衝突してエラーとなりますので ご注意下さい。 過去に作成されたloadlib使用スクリプトも、ver2.6に同梱されているヘッダ ファイルを使用すれば正常に動作するはずです。
ver2.61から、HSPの別バージョンとしてHot Soup Processor CL (コンソール版HSP)を標準で同梱しています。 Hot Soup Processor CLは、GUIやマルチメディア機能を排除しコンソール上での 入出力のみを行なうことができるバージョンです。 これにより、win32コンソールアプリケーションを作成することが可能になります。
Hot Soup Processor CLは、スクリプトエディタの「HSP」メニューにある「コンソールモード」を選択して、チェックマークが入った状態にすることで利用可能になります。 コンソールモード時は、通常のHSP命令とは違い実行時にコマンドプロンプトのウインドゥが開いた上で結果を表示します。 コンソールモードで使用できる命令や、実行結果は通常時と異なります。 ご利用に際しては、ドキュメント(hspcl.txt)をお読み下さい。
また、実行ファイルの自動作成時は「#packopt runtime」でコンソール版のランタイムを指定するようにしてください。 コンソールモード時であっても、ランタイムは変更されないので注意してください。
スクリプトはどのような順番で、どのような処理をするかをまとめた テキストファイルです。その中の、どのような処理をするかを指示する ものを命令(ステートメント)と呼びます。
BASICやCと同じように、命令はファイルの先頭行から下に向かって順に 実行されていきます。
命令(ステートメント)は、プログラムの流れを制御したり、画面や ファイルなどの入出力を行ないます。 大きくわけて、プログラム制御命令と、入出力制御命令の2つからなる多くの命令が存在します。 スクリプトはアルファベットの大文字・小文字を区別しません。 どちらで記述してもかまいません。
HSPでは、命令の後にパラメータを付加する書式が基本になっています。 命令に付加するパラメータと、命令の間はスペースで空けておく必要があり ます。またパラメータが複数ある場合は、「,(カンマ)」で区切ります。 たとえば、
width 640,480
というスクリプトは、「width」が命令(ステートメント)にあたり、 640と480という数値がパラメータになります。この組み合わせで、 「ウインドゥサイズを640x480にする」という意味になります。
例 : ドキュメントファイルの「命令のリファレンス」の説明で、 statement p1,p2 p1=0〜3(1) p2=0〜65535(0)
とあった場合は、この命令にはp1,p2の2つのパラメータが指定でき、 p1のとれる値が0〜3まで、省略した場合の値が1。p2のとれる値が、0〜 65535まで、省略した場合の値が0であることを示しています。 パラメータの省略をすることもできます。上の例では、p2の値を省略して
statement 3
と書くこともできます。その場合は、省略した時の値が自動的に設定 されて、
statement 3,0
と書いたのと同じことになります。 パラメータの途中だけを省略する場合は、
statement ,100
のように省略したパラメータを飛び越えて別のパラメータを指定すること ができます。この場合は、
statement 1,100
と書いたのと同じことになります。
statement
とだけ書いてパラメータを指定しなかった場合でも、自動的に「1,0」と いう値が設定されます。基本的にパラメーターは重要な順番に並んでいる ので、すべてを省略することはあまりありません。また、文字列を指定す るパラメータや、変数名でなければならないパラメータなどは省略ができ ないことがあります。
命令と命令の間を:(コロン)で区切って1行に複数の命令を記述することも 可能です。これをマルチステートメントと呼びます。たとえば、
例: mes "こんにちは" : mes "さようなら"
は、
mes "こんにちは" mes "さようなら"
のように書くのと同じことです。 このように複数の命令を1行にまとめて書くことができます。 1行は最大32767文字まで認識されますが、テキストエディタで見やすい程度に 納めるようにした方がいいでしょう。
1行の中で;(セミコロン)以降はコメント(注釈)とみなし無視されます。
例: pos 320,100 : print "(^_^)" ; 顔マーク表示
CやJavaと同様のコメント記述が可能です。 1行の中で//(ダブルスラッシュ)以降はコメントとみなし無視されます。 「/*」から「*/」までの間は、コメントとみなし無視されます。
例: pos 320,100 : print "(^_^;)" // 顔マーク表示 /* ここはコメントです */ goto *start
スペース、タブは見やすくするために自由に入れられます。
命令のパラメータに数値を指定する場所では、以下のような演算子を 使った式を書くことができます。
-2147483648〜2147483647 | 10進整数 |
$0〜$FFFFFFFF | 16進整数(0xでも可) |
%0〜%111111... | 2進整数(0bでも可) |
'A' | 文字コード(1バイト) |
+,-,*,/ | 加算,減算,乗算,除算 |
&,|,^ | 論理演算(and,or,xor) |
\ | 割り算の余り |
=,<,>,! | 条件式(同じ,小さい,大きい,同じでない) |
==,<=,>=,!= | 条件式2(同じ,以下,以上,同じでない) |
<<,>> | 左、右方向にビットシフト |
たとえば、statement 1+2+3+4は、statement 10と書いたのと同じになります。これを数式といいます。 数式の評価は常に左から順に行なわれます。乗除算の優先はありません。 たとえば、2+7*2は、18になります。計算の順番を変更したい場合はカッコを使って、2+(7*2)のように書けば、カッコ内の7*2が先に計算されて結果は16になります。 条件式や論理演算は、後に説明する条件判断の際に使われます。 カッコは、32重までネスティングすることが可能です。もし、カッコの使い方が 間違っている場合は、エラー15(priority error)が表示されます。
HSPの標準機能では実数をサポートしていませんが、拡張プラグインに実数(小数)を 渡すための仕組みが用意されています。詳しくは、「小数値の記述について」を参照してください。
命令のパラメータに文字列を指定する場所では、文字列を"(ダブルクォーテーション) で囲んでください。例: mes "This is test message..."「+」を使って文字列同士、または変数との結合をすることができます。 たとえば、"ABCD"+"EFGH" は、 "ABCDEFGH" と同じになります。 "VALUE="+val は、 "VALUE=5"(変数valが5の場合)になります。パラメーターを指定する部分に、文字列を使った式を使うことも可能です。 ただし、数式と同様にカッコの中で文字列式を使うことはできません。(文字列の比較を行なう論理式は記述可能です。)例: s="1"+("2"+"0") ; エラーになります if(a="1")&(b="2") ; エラーになりません「\」は特殊な意味を持つキャラクタとして解釈されます。「\n」 は、改行して次の行にするという意味になります。 「\t」 は、TABコードを表わします。 「\r」 は、リターンコード(0x0d)を表わします。 「\"」 は、ダブルクォート(")を表わします。 「\\」 は、ただの「\」になります。ですから、ディレクトリを示すための文字列、たとえば、"C:\WINDOWS\SYSTEM" などの文字列は、 "C:\\WINDOWS\\SYSTEM" と記述しないと認識されません。また、1行に収まりきらない長い文字列をまとめて記述することも可能です。mes {" ここには、1行まるまる直接メッセージを 書いてもいいです。 "}このように、「{"」から「"}」までの間はすべて文字列として解釈されます。 複数行に渡っている時は、1行の最後に改行コードが挿入されます。 文字列の結合や複数行での文字列を指定する場合には、最大65535文字までが 有効となります。
名前をつけた変数を扱うことができます。変数とは、代入により内容 を変化させることのできる容れ物のようなものです。
変数は、アルファベットまたは日本語で始まる59文字(半角)以下の文字列で 識別されます。(記号の「_」は変数名の一部として認識されます)
変数は代入により数値か文字列、または数値の配列を記憶させることができます。
数値として記憶できる範囲は、数式で指定できる値と同じ-2147483648 から2147483647までの32ビット整数値です。
変数にラベルと同じ名前や、命令と同じ名前は使用できません。 変数は、代入命令や、数式の中で使うことができます。
代入命令は次のようなものです。例: x=100 ; 変数xに100という数値を代入 y=200 ; 変数yに200という数値を代入命令の数値指定として使うと、例: x=100:y=200:pos x,y ; (100,200)に移動のようになります。
変数に値を代入すると、以前まで記憶されていたものは消され、新しい 値が保持されることになります。
変数に文字列を代入する場合にも同じように、例: x="strings" ; 変数xに「strings」という文字列を代入 print x ; 変数xの内容を画面に表示代入は"="の先にあるものが数値ならば数値を、文字列ならば文字列として 記憶します。このことから変数には、記憶しているものが文字列だった場合の 文字列型と、数値だった場合の数値型の2つの状態があります。
パラメーターが数値を必要としている命令に文字列型の変数を指定しても、 またパラメーターが文字列を必要としている命令に数値型の変数を指定しても、 「Type mismatch」エラーが出てしまうので注意してください。
変数に文字列を代入する場合には、通常63文字までとなります。もし、それ 以上の文字数を取り扱いたい場合はdim命令によりサイズを指定する必要があり ます。詳しくは「配列変数」の項目で解説されています。
また、いくつかの特殊な代入命令があります。例: a=10 ; 変数aに10を代入 a+=1 ; 変数aに1を加算(a=a+1と同じ)上の例では、変数aは11という値になります。 このように、「+=」を使用すると"="以降が変数a自身に対して加算されます。
同じように「-=」も使用することができます。さらに、例: a+ ; 変数aに1を加算 a- ; 変数aから1を減算のような表現で変数に+1と−1をすることができます。 (C言語やJavaと互換のある書式、a++やa--でも同じ結果になります)
変数の型を特定するために、変数の型を強制的に変更することができます。 そのための命令がintとstrです。例: int a ; 変数aを数値型にする str b ; 変数bを文字列型にする変数の型を変更しても、できる限りその内容を保持しようとします。
"123"という文字列を含んだ変数を数値型に変更すると、123という数値に なりますし、逆に123という数値型の変数を文字列型に変更すると"123"と いう文字列に変換されます。
また、str命令で数値型変数を文字列に変換する際には、通常の10進数文字列の他にも 16進数、0を省略しないで指定した桁数の文字列に変換することができます。
配列変数を使うと、変数に記憶させるものに対して番号をつけて大量に管理 することができるようになります。 通常は、変数aには1つの数値、または文字列しか記憶させることができま せん。しかし配列変数を使えば、これに複数の数値、または文字列を記憶させ ることができます。 配列変数は次のようにして使われます。
例: a.0=10 ; 変数aの要素0に10を代入 a.1=20 ; 変数aの要素1に20を代入 a.2=30 ; 変数aの要素2に30を代入
変数の後に"."(ピリオド)をつけ、その後に数値による番号を指定します。 この番号を「配列の要素」といい変数の中のどこに記憶されているかを 特定します。要素は0から始まって、通常は15まで指定できます。 要素が変わっても同じ変数なので、要素ごとに数値型、文字列型をまぜる ことはできません。変数aが文字列型ならば、すべての要素も文字列型となり ます。数値型も同様です。 要素に変数を使用することもできます。
例: i=0 a.i=123 ; 変数aの要素0に123を代入
ただし、要素に数式を使うことはできません。要素として判断されるのは "."(ピリオド)の後に続く1項目だけです。ですから、
例: a.1=5 a.2=10 print a.1+1
は、変数aの要素2ではなく、変数aの要素1に1を加算したもの、つまり6に なるので注意してください。
配列変数の要素がもっとたくさん欲しい場合にはdim命令で拡張することが できます。
例: dim a,20 ; 変数aの要素は0〜19まで使えるようになります
また、dim命令を使って多次元配列を作成することも可能です。
例: dim a,10,5 ; 変数aは2次元配列が使用できます a.0.0=1 ; 要素(0,0)に1を代入 a.1.0=2 ; 要素(1,0)に2を代入 a.0.1=3 ; 要素(0,1)に3を代入
この場合は、「変数名.1つめの要素.2つめの要素」のように"."(ピリオド) を2つ使って要素を指定しなければなりません。 同じようにdim命令を使って4次元までの配列を作成することができます。
文字列型の変数に配列を使う場合にはsdim命令を使います。 sdim命令では、まず扱う文字列の最大文字数を指定してから、要素の数を 指定します。たとえば、
例: sdim a,32,5 ; 変数aは32文字までの文字列を5つの要素で扱えます a.0="test" a.1="message"
のように変数名の次に2つのパラメータを指定します。 また、sdim命令は通常使う文字列の最大文字数を拡張することもできます。
例: sdim a,200 ; 変数aは200文字までの文字列を扱えます
これは配列変数ではなく、通常の変数になります。 通常の変数は64文字までしか文字列を扱うことができませんが、sdim命令を 使用することで、最大文字数を増やすことができます。
代入するパラメータに「,」をつけることで、配列変数への代入を連続して行なうこともできます。
例: tmp=1,5,10 ; 配列に連続して代入をする
上の例では、「tmp.0=1:tmp.1=5:tmp.2=10」と同じことになります。 配列の途中から代入を開始するには、
例: tmp.2=10,20,50 ; 要素2から連続して代入をする
この例では、「tmp.2=10:tmp.3=20:tmp.4=50」と同じことになります。 「tmp="ABC","DEF","GHI"」のように文字列を連続して代入することもできます。 この場合は、あらかじめsdim命令などで文字列型の配列を用意しなければなりません。
プログラム上の位置を示すためにラベルとして名前をつけることができます。 ラベルは*(アスタリスク)の後に続く59文字(半角)以下の文字列で示します。
例: *label mes "Wait.":wait 100 goto *label ; 無限ループを生成ラベルは主に、goto命令、gosub命令またはbutton命令の飛び先を指定する のに使用されます。
ラベル名で使用できる文字は、変数と同様にアルファベットまたは日本語で始まる文字列です。(記号の「_」はラベル名の一部として認識されます)
(記号の「_」から始まるラベルは、システムが自動的に生成することがあるため、将来の互換性のため使用を避けることを推奨します。)ローカルラベルについてHSPではローカルラベル機能をサポートしています。 これは、特殊な名前のラベルを何度でも使うことのできる機能で、 何でもない部分や、名前をつけるのが面倒な時などに便利です。例: mes "GO!" *@ mes "A="+a a+ if a<5 : goto *@back ; 前のローカルラベルに戻る stopローカルラベルは、「*@」という名前で定義します。これは、他の ラベルと違い1つのソーススクリプト内で何度でも置くことができます。
このローカルラベルを、goto命令などで参照する時には、 「*@back」と「*@forward」を使います。 「*@back」は、その場所より上にあり一番近いローカルラベルを指します。 「*@forward」は、その場所より下にあり一番近いローカルラベルを指す ものになります。
「*back」は、「*b」と省略することが可能です。
「*forward」は、「*f」と省略することが可能です。
ローカルラベルは、多用するとかえって見にくいスクリプトになって しまう可能性もあるので、後の見やすさを考えてから使ってみてください。
条件判断を行う場合には、if命令を使用します。if命令は、パラメータで 示された条件が満たされた場合は、それ以降の命令を実行し、そうでなければ 次の行から実行を続けます。例: a=10 if a=10 : mes "aは10です。"上の例では、「a=10」の部分が条件式になります。条件式には主に、
a=b | aとbは等しい |
a!b | aとbは等しくない |
a<b | aはbよりも小さい |
a>b | aはbよりも大きい | a<=b | aはbよりも小さいか等しい |
a>=b | aはbよりも大きいか等しい |
の4つを使います。if+条件式の後は:(コロン)で区切り、それに続いて 条件が満たされた場合に実行される部分を書きます。
(C言語やJavaと同じように「=」「!」を「==」「!=」のように記述することも可能です)
もし、条件によってプログラムの流れを変えたい場合には、例: a=10 if a>10 : goto *over10 mes "aは10以下です。" stop *over10 mes "aは10より大きいです。" stop上のように、goto命令で別なラベルに飛ばすことも可能です。 また、else命令を使って条件が満たされなかった場合の処理を同じ行に書く ことも可能です。例: a=10 mes "aは、" if a=10 : mes "10です。" : else : mes "10ではありません。" stopこの場合は、else命令のある部分までは、条件を満たした場合に実行され、 else命令以降は、条件を満たされなかった場合に実行されます。 次の行以降は、条件に関わらず通常通りに実行されます。
より複雑な条件判断をするために、論理演算式を使うこともできます。
a&b | aとbがともに正しい (and) |
a|b | aとbのどちらかが正しい (or) |
これによって複数の条件を一度に記述することができます。例: a=10:b=20 if (a=10)|(b=10) : mes "aかbのどちらかが10です。"上の例では、「a=10」と「b=10」という条件式を|(or)でつないで、 どちらかが正しい場合には、正しいという結果が出るようにしています。 論理演算は、「|」「&」といった記号の他に「or」「and」という文字列 でも記述することができます。例: if (a=10)or(b=10) : mes "aかbのどちらかが10です。"上のように書いても、結果は同じになります。
HSPでは、論理演算はビットごとの演算として扱われているため、 C言語やJavaなどで用いられる「&&」「||」などの論理演算子とは等価ではありませんので ご注意下さい。
条件判断の実行を、複数行で行なうこともできます。 if命令の条件が正しい時に実行されるスクリプトを複数行に渡って記述する場合は、例: a=10 if a>5 { mes "TRUE" mes "(MULTILINE IF)" }のように「{」で始めて「}」で終わる部分までを指定します。 (上の例では、見やすくするためにC言語風に行の最初にTABを入れてありますが、 特に必要なものではありません。ユーザーの見やすいように記述してください)例: a=10 if a>5 : mes "TRUE"「{」を使わなかった場合には、if命令以降の1行のみが実行されます。 また、else命令は、条件が正しくない時に実行されるスクリプトを指定します。例: a=10 if a>5 : mes "TRUE" : else : mes "FALSE"上の例では、aが5より大きい場合は、「mes "TRUE"」が、そうでない場合は、 「mes "FALSE"」が実行されます。 else命令でも複数行の指定ができます。例: a=10 if a>5 { mes "TRUE" mes "(MULTILINE IF)" } else { mes " FALSE" mes " (MULTILINE IF)" } returnただし、elseの後に「{」を記述しなければ複数行にはならないので注意して ください。例: if a>5 { mes "TRUE" } else ; <- 間違い { mes "FALSE" }上の例は間違いです。エラーになります。 else命令もまたif命令と同じように、「{」がない限りは、その1行のみが有効範囲に なります。
また、if命令を多重に実行させることも可能です。例: a=10 b=10 c=10 if a>5 { if b>5 { if c>5 { mes "--3" } else { mes "--2" } } else { mes "--1" } }上の例では、変数aが10より大きい場合は「--1」を、変数a,bが10より大きい 場合は「--2」を、変数a,b,cが10より大きい場合は「--3」を表示します。 if命令の多重化は、スクリプトがだんだんと複雑になっていくので、注意して 使ってください。HSPでは、16重までの多重化が可能です。
*現在のHSPでは、if命令で「{」「}」を使った複数行記述と、通常の1行のみの 分岐を混在した場合の動作は保証されません。「{」「}」内でさらに条件分岐を 行なう場合には、「{」「}」を使用するようにしてください。 この問題は、今後のバージョンアップで解消していく予定です。
repeat〜loop命令は、HSPで繰り返しの動作をさせる場合に欠かすことのできない重要な 命令です。repeat 5 mes "繰り返し["+cnt+"]" loopのように、repeat命令の後に回数を指定すると、loop命令までを指定回数だけ繰り返し ます。繰り返し中は、システム変数cntが0、1、2、3…と自動的にカウントアップされ ていきます。
繰り返し回数に0が指定された場合には、repeat〜loopの範囲は実行されずに通過します。 また、繰り返し回数指定を省略するかまたはマイナス値を指定すると無限ループに なります。
repeat〜loop命令と、break、continue命令を組み合わせることにより、さらに高度な 処理が可能になります。 repeat〜loop命令の繰り返しを、途中で強制的に脱出させるのがbreak命令です。repeat 5 if cnt=2 : break mes "繰り返し["+cnt+"]" loop上の例では、システム変数が2になった時点、つまり3回目のループになると、 if命令の判断によって、break命令が実行されるしくみになっています。 break命令が実行されると、繰り返しの回数がまだ残っていても、強制的に繰り返し から抜け出し、loop命令の次にある命令から実行を続けます。 break命令以降(上の例では、mes命令)は実行されません。 この命令を使うと、たとえば次のようなスクリプトが作成可能です。repeat getkey a,1 if a>0 : break await 10 loop上のスクリプトでは、マウスの左ボタンを押すまで待つループになります。 repeat命令の回数指定を省略するかまたはマイナス値を指定すると無限ループに なります。それを利用してボタンの状態が1になるまでは、ずっと同じところを 繰り返すようになっています。 ボタンが押されると、break命令が実行され繰り返しから抜け出します。 いままでは、このようなスクリプトはgoto命令を使って繰り返しの構造を記述する 必要がありましたが、repeat〜loopとbreak命令を使うことにより、ラベルを 用意することなく手軽に条件付きの無限ループが実現できます。
continue命令は、逆に繰り返しをやり直すための命令です。repeat 5 if cnt=2 : continue mes "cnt="+cnt loop上の例では、システム変数cntが2になった時点で、continue命令が実行される しくみになっています。 continue命令が実行されると、repeat命令まで戻り次の繰り返しを実行します。 上のスクリプトが実行されると、cnt=0 cnt=1 cnt=3 cnt=4のような表示になり、システム変数cntが2の時だけmes命令が実行されないのが わかります。 最初はわかりにくいかもしれませんが、continue命令は、loop命令の場所ではないが、 loop命令と同じ働きをするとも言えます。 繰り返しのカウンタは、continue命令が実行された場合でも、loop命令と同様1つ 増加します。もし、最後の繰り返しでcontinue命令が実行されると、repeat〜loopが 終わった状態、つまりloop命令の次の命令から実行を続けます。
さらにもう1つ、continue命令にはパラメータを指定する使い方が存在します。 continueの後に、数値または数値型変数を指定することにより、繰り返しのカウンタ を示すシステム変数cntの内容を変更することができます。 たとえば、「continue 1」と指定した場合は、システム変数cntの内容は1になり、 その値のままrepeat命令の次から繰り返しを続けます。 パラメータを省略して、ただの「continue」だけの場合はloop命令と同様の処理、 数値を指定すると、カウンタの値を変更して繰り返しをやり直すことになります。 ですから、repeat 1 await 10 getkey a,1 if a=0 : continue 0 loopこのようなスクリプトでは、通常1回だけしか実行されないはずの、repeat〜loopの 繰り返しですが、マウスの左ボタンが押されていない場合は、カウンタが0に戻され 無限ループの状態になります。これで、ボタンを押すまで待つという動作になります。
このbreak命令と、continue命令は、ともにrepeat〜loop命令の中で使用しなければ なりません。また、repeat〜loop命令の中であれば、いくつでも使用できます。
注意しなければならないのは、プログラムの流れとしてrepeat〜loop命令は、順番に つながっていなければなりません。repeat命令があったら、そこから下の行に必ず loop命令がなければいけないということです。 repeat命令だけを、gosubでジャンプしたサブルーチンの中で実行したり、 goto命令でスクリプト上の別な場所にジャンプしてloop命令を実行させたりして、 repeat〜loop命令の順番が狂ってしまうとコンパイラはエラーを出してしまいます。
repeat〜loop命令は、多重に使うことができます。repeat 5 if cnt=2 : continue repeat 2 mes "中のループcnt="+cnt loop mes "外のループcnt="+cnt loop上の例では、わかりやすいようにTABを入れて記述していますが、5回繰り返す構造の 中に、さらに2回繰り返すrepeat〜loop命令があります。 繰り返しが多重になった場合でも、break、continue命令は対応するループに対して 機能します。これは、システム変数cntが、やはり対応したループに対しての値を示す のと同様です。
repeat〜loop命令は、多様な使い方のできる構文です。C言語や、Javaにおける、 while文や、do〜until文などに近い記述もできますし、もちろんfor文のような 繰り返しの記述にも使えます。
プリプロセッサ命令は、プログラム実行時ではなく、コンパイル時に解釈し 実行される命令のことです。プリプロセッサ命令は、他の命令と区別がつく ように、行の最初に「#」に続けて記述しなければなりません。
プリプロセッサ命令により、スクリプトの記述そのものをカスタマイズする ことも可能になります。ただし、使いすぎるとプログラムそのものがわかり にくくなったりするので、HSPを一通り使った上級者の方に使用をおすすめ します。#include "filename" [別ファイルを結合]"filename"で指定されたファイルも同時にコンパイルされます。
スクリプトエディタで入りきらないスクリプトも、includeで別ファイルに 分割すればコンパイルすることができるようになります。#define 新規名称 元名称 [新規名称を登録する]新しい別名(エイリアス)を追加するためのものです。
HSPの従来ある命令の名前を、別な名前でも使用できるようになります。 新規名称は、予約されている命令語や変数名と重ならない20文字以内の、 スペースを含まない英文字列でなければなりません。例: #define pr print pr "message..." stop上のように#defineの後に、新規名称と元の名称をスペースで区切り記述 します。すると、「pr」という命令が新しく登録され、「print」命令と まったく同様に使うことができるようになります。
元の名称は、命令の名前である必要はありません。数値や、記号なども 新規の名称として登録することが可能です。例: #define is = #define plus + a is 5 plus 10 print "A="+a stop上の例では、「=」という記号を「is」という言葉に、「+」という記号を 「plus」という言葉にそれぞれ置き換えるように定義しています。
すると、「a is 5 plus 10」という行は、「a=5+10」と同じことになります。
パラメーターを使用して展開することも可能です。例: #define reset(%1) %1=10 reset a mes "A="+a stop上の例では、「reset a」を「a=10」というスクリプトに変換します。
このほか、特殊展開パラメーターなど多くのオプションが用意されています。 詳しくは、「#defineマクロについて」の項を参照してください。
#const マクロ名 数値式 [マクロ名の定数定義]指定されたマクロ名に置換え文字列を設定します。 #defineと同様ですが、#constは定数(数値)の置き換えを行なう場合に あらかじめ計算を行なった結果を置き換えます。例: #const KAZU 100+50 a=KAZU ↓(展開後) a=150あらかじめソース内で使用する値が確定している場合、ソースの 高速化に有効です。すでに定義されているマクロを含めることも可能 なので、例: #const ALL 50 #const KAZU 100*ALL a=KAZU ↓(展開後) a=5000のように使用することができます。 計算式は、整数のみで演算子および数値の記述スタイルは、HSPと 同様のものが使えます。ただし、ver2.xのHSPとは異なり、演算子の 優先順位を考慮しますので注意してください。例: #const KAZU $5+3*10 a=KAZU ↓(展開後) a=35演算子の優先順位は、[*,/]>[+,-]>[比較演算子,<<,>>]>[!]>[&,|,^]となっています。カッコによる順位の指定も可能です。
#undef マクロ名 [マクロ名の取り消し]すでに登録されているマクロ名を取り消します。 登録されていないマクロ名に対して指定してもエラーにはならず 無視されます。
#if 数値式 [数値からコンパイル制御] #ifdef マクロ名 [マクロ定義からコンパイル制御] #ifndef マクロ名 [マクロ定義からコンパイル制御] #else [コンパイル制御を反転]] #endif [コンパイル制御ブロック終了]コンパイルのON/OFFを指定します。 #ifは指定した数値が0ならば以降のコンパイル出力をOFFにして コンパイル結果を無視します。数値が0以外の場合は、出力がONとなります。 このコンパイル制御は、#endifが出るまでの区間を対象にします。 #if、#ifdef、#ifndefのいずれかには、#endifがペアで存在している 必要があります。例: #if 0 mes "ABC" ; この部分は無視されます a=111 ; この部分は無視されます mes "DEF" ; この部分は無視されます #endif#ifの指定には式を使うことも可能なので、例: #define VER 5 #if VER<3 mes "ABC" ; この部分は無視されます a=111 ; この部分は無視されます mes "DEF" ; この部分は無視されます #endifのような使い方もできます。計算式の記述および演算子の注意点などは、 #const命令と同様です。 #ifdefは、指定したマクロ名が定義されていれば出力をONに、そうでない 場合は、出力をOFFにします。 マクロ名は、#defineや#constによって定義されたものになります。例: #define SW #ifdef SW mes "ABC" ; この部分はコンパイルされます a=111 ; この部分はコンパイルされます mes "DEF" ; この部分はコンパイルされます #endif#ifndefは、#ifdefとは逆に指定したマクロ名が定義されていれば出力をOFFに、 そうでない場合は、出力をONにします。 また、ブロック内に#elseを入れることで条件が逆の場合の動作を記述 することができます。例: #ifdef SW mes "AAA" ; SWが定義されている場合 #else mes "BBB" ; SWが定義されていない場合 #endifまた、#if、#ifdef、#ifndef〜#endifのプロックを入れ子にすることも 可能です。例: #ifdef SW #ifdef SW2 mes "AAA" ; SWとSW2が定義されている場合 #else mes "BBB" ; SWが定義されている場合 #endif #endif
#uselib "filename" 外部DLLの指定 #func 新規名称 関数名 タイプ 外部DLL呼び出し命令登録外部DLL内のプログラムを呼び出すための命令を増やすことができます。 これにより、HSP本体のプログラムから、C言語やDelphiなどで作成した DLL内の関数を呼び出すことが可能になります。
func命令により、外部の関数もHSPの命令として定義できるので、 HSPを自由に機能拡張することが可能です。外部DLL作成の方法や、 HSPとのパラメータ受け渡しの詳細は、「拡張プラグイン作成リファレンスマニュアル」を参照してください。
普通に使う場合には、まったく必要のない命令ですので、特に覚えて おかなくても問題ありません。
- 標準マクロ定義ファイル
プリプロセッサでは、commonディレクトリにある「hspdef.as」を標準の マクロ定義として必ず最初に読み込みます。 「hspdef.as」には、システムで定義するシンボル名やマクロ、基本的な モジュールなどが追加されていく予定です。 ユーザーが「hspdef.as」をカスタマイズして、HSPをより使いやすく 改造することもできます。が、その場合ソースを他の環境でコンパイル できなくなるので注意して下さい。 標準マクロ定義ファイルは、以下の順に検索されます。ソースファイルのあるディレクトリにある「hspdef.as」 ↓ commonディレクトリにある「hspdef.as」ファイルが見つからない場合は無視されます。 また、プリプロセッサが自動的に追加するマクロがあります。 以下のマクロは、ver2.6拡張マクロ使用時に使用することが可能です。
命令 内容 _debug デバッグモード時 __hsp26__ ver2.6拡張マクロ使用時 __file__ 使用時点で解析されているファイル名 __line__ 使用時点で解析されている行番号 __date__ 使用時点の日付 __time__ 使用時点の時刻 __hspver__ 生成されるオブジェクトに保存されるHSPバージョン番号。
16進数で上位8bit、下位8bitがメジャー・マイナーバージョンを示します。
#ifdef、#ifndef命令などでこれらのマクロを判別して分岐させることが可能です。
- 複数行をプリプロセッサに渡す
最後が「\」で終わるプリプロセッサ行は次行に継続されます。 1行に収まらない定義を行なう場合に、利用することができます。例: #define aaa mes "AAA"\ :mes "BBB"\ :mes "CCC"これは、この3行すべてが#defineプリプロセッサ命令として解釈されます。
ver2.6から、#define命令のマクロ機能が強化され、より多彩な利用方法が できるようになっています。 #defineマクロは、あくまで個人がスクリプトを書きやすくカスタマイズしたい 場合に使うもので、初心者向きではありません。ここで説明した機能も、 頻繁に利用するものではありませんので、必要な場合にのみ参照してください。
#defineマクロは、基本的に置き換え文字列を登録します。例: #define hyouji mes hyouji "AAAAA..." ↓(展開後) mes "AAAAA..."#define、#const命令の直後に「global」を入れることで、すべてのモジュールで 永続的に利用することのできるマクロを作成することができます。例: #module #define global test 0x1234 #global a=test ; aに0x1234が代入される通常は、モジュール内で#defineを定義した場合には、それ以外のモジュール およびグローバルなエリアでは、同じ名前は認識されません。 global指定を入れることで、それ以降のすべての場所で定義した名前を マクロで置き換えることができるようになります。
単純な置き換えマクロの他に、引数付きの展開が可能です。 引数は、マクロ名の後にカッコで囲んだ%1,%2,%3…の引数名で指定を 行ないます。 引数は必ず「%数値」で指定する必要があり、数値は1から順番に記述 してください。CやC++のプリプロセッサのようにシンボル名では指定 できないので注意してください。例: #define hyouji(%1) mes "prm="+%1 hyouji "AAAAA..." ↓(展開後) mes "prm="+"AAAAA..."また、引数に初期(デフォルト)値を設定することが可能です。例: #define hyouji(%1="PRM=",%2=123) mes %1+%2 hyouji "AAA",a hyouji "BBB" hyouji ,b ↓(展開後) mes "AAA"+a mes "BBB"+123 mes "PRM="+b初期(デフォルト)値は、マクロを使用した時に省略された場合に 自動的に補完される値です。初期値を省略された場合は、補完されません。 マクロ引数の指定では#defineで指定する側では、カッコで囲んで いますが、実際に使用する時にはカッコなしで指定してください。#define hyouji(%1) mes "prm="+%1 hyouji("AAAAA...")のような記述はエラーになるので注意してください。 ただし、ctypeオプションを使用することで以下のようなカッコ付き記述が 可能になります。#define ctype kansu(%1) (%1*5+1) a=kansu(5)このオプションは、計算式など命令部分以外にマクロを使用したい時に 有効です。一見、C言語などの関数のように振舞いますが、実際にはマクロで 置き換えているだけなので、応用範囲は狭いので注意してください。 この記述方法は、本来のHSP文法とは異なるため自分のスタイルで記述したい というカスタマイズ用途以外での利用は推奨していません。
マクロの展開時に特殊な動作を行なうキーワードを設定することが可能です。 この特殊キーワードは、主にことなるマクロ間でパラメータを共有したり、 入れ子構造をスタックによって実現するためのものです。#define start(%1) %tstart %s1 mes "START" #define owari %tstart mes %oここで指定されている「%s1」や「%o」などが特殊展開マクロです。 これを使ったサンプルは、以下のように展開されます。start "OK" → mes "START" owari → mes "OK"このように、異なるマクロ間でデータを共有させることが可能になります。 特殊展開マクロは、以下の種類と機能があります。
マクロ 機能 %t タグ名を設定する %n ユニークなラベル名を生成する %i ユニークなラベル名を生成してスタックに積む %o スタックに積まれた文字列を取り出す %p スタックに積まれた文字列を取り出す(スタック維持) %s 引数パラメーターをスタックに積む %c 改行を行なう
特殊展開マクロは、「%」に続けて英文字1文字+パラメータで表現します。 以降のキーワードと識別するために、特殊展開マクロの後には半角スペースを 入れて下さい。「%tabc aaa」のようスペースを含む部分までが特殊展開マクロ と判断されます。 特殊展開マクロでは、一般的なスタック(First In Last Out)を持っています。 このスタックは、同じタグ名を持つマクロで共有させることができます。 タグ名は、「%tタグ名」のように「%t」に続けて半角英文字16字以内で指定 します。先の例では「%tstart」と指定された「start」がタグ名にあたります。 「%s」は、引数パラメーターをスタックに積むための特殊展開マクロです。 「%s1」と指定すると、「%1」のパラメータをスタックに1段積みます。 スタックに積まれた文字列を取り出す場合は、「%o」を使用します。 「%o」は、スタックに積まれた文字列を取り出して展開します。スタックなので、 最後に積まれたものが最初に取り出されます。「%o0」と指定すると、 スタックを取り出しますが文字列の展開は行ないません(スタック取り出しのみ)。 スタックを戻さずに内容だけを取り出すのが「%p」です。「%p0」は、次に 取り出されるスタックの内容を展開します。「%p1」は、もう一段深いスタック を取り出します。以降、「%p0」〜「%p9」までを指定することが可能です。 ラベル生成の例を以下に示します。#define start %tstart *%i #define owari %tstart await 20:stick a:if a=0 : goto *%oこれを使ったサンプルは、以下のように展開されます。start → *_start_0000 owari → await 20:stick a:if a=0 : goto *_start_0000「%i」は、他と重ならないようなユニークなラベル名を生成してスタックに 1段積みます。「%i0」と指定するとラベル名をスタックに1段積みますが、 展開は行ないません。また、「%n」は、ユニークなラベル名を生成して展開 するだけで、スタックには積みません。 上の例では、ラベル名生成によってラベルを新しく作成して、ループ構造を 実現しています。この方法を使えば、入れ子になってもラベル名が重なる ことのないループ構造を構築することができます。 また、1つのソーススクリプトファイル内ですべてのスタックが取り出されて いなかったマクロ(タグ名)は、コンパイル時にエラーが報告されます。 かならず、すべてのスタックが取り出されて終わるようなマクロ命令の構成に しておいてください。 それ以外に、「%c」によって改行を挟んで展開することが可能です。「%c」の部分で行が分割されます。 HSP ver2.6で追加された標準定義マクロのwhile〜wend、do〜until、for〜next は特殊展開マクロによって作られています。
HSP ver2.4からは、メモリノートパッド命令という新たな命令セットが追加されました。 これは、行単位で文字列扱うことのできるユニークで便利な機能です。これにより、 テキストファイルを読み込み解析したり加工することが容易になります。 また、コンボボックスやリストボックスを表示するための命令(combox,listbox命令)のパラメータ指定に使う文字列や、 ディレクトリの内容を調べるdirlist命令が返す文字列なども、メモリノートパッド命令を使うことでシンプルに処理できるようになります。
メモリノートパッド命令は、簡単に言えばWindowsの「メモ帳」のようなテキストエディタを使うような感覚で、複数行を含んだ文字列を扱うための命令セットです。 通常の文字列は、「ABCDEFG」のように任意の文字が集まったものです。複数行を含んだ文字列というのは、 「ABCD\nEFGH」のように間に改行(\n)があり1行目は「ABCD」、2行目は「EFGH」というようにちょっと複雑な構造になっている文字列のことです。 テキストエディタなどでロード・セーブすることのできるテキストファイルも、このような複数行を含んだ文字列と言えます。 これらの文字列を行単位で取り出したり、修正をしたりすることがメモリノートパッド命令で可能です。 メモリノートパッド命令セットは、以下の種類があります。
命令 | おもな機能 | 備考 |
notesel | メモリノートパッドとして扱う変数の指定 | |
notemax | 全体の行数を取得 | |
noteadd | 指定行に内容追加 | 挿入/上書きモードあり |
noteget | 指定行の内容読み出し | |
notedel | 指定行の削除 | |
noteload | ファイルから内容読み込み | バッファ自動確保 |
notesave | 内容をファイルに書き出し |
基本的な使い方は、まずnotesel命令で文字列型の変数を指定します。それ以降は、メモリノートパッド命令はすべて、そこで指定した変数が対象になります。 指定した変数には、あらかじめ文字列が代入されているか、または中身をカラ(a=""のように)にしておかなければなりません。 notesel命令で変数を指定した後は、自由にnotemax,noteadd,noteget,notedel命令を使って変数の内容(文字列)にアクセスすることができるようになります。例: a="ONION\nTOMATO\nCARROT" notesel a noteget b,0 print "index0="+b noteget b,1 print "index1="+b noteget b,2 print "index2="+b stop上の例では、変数aに「ONION」「TOMATO」「CARROT」という3行が代入されています。 まずnotesel命令で、変数aを指定してから、各行の内容をnoteget命令を使って取り出して表示しています。 メモリノートパッド命令では、行の指定に「インデックス」という単位を使用しています。 最初の行はインデックス0、その次はインデックス1、そのまた次はインデックス2…というふうに続きます。 行数だと最初は1行目ということになりますが、インデックスは0から始まるので注意してください。 つまり、「noteget b,0」は最初の行を変数bに読み出す…という意味になります。例: a="ONION\nTOMATO\nCARROT" notesel a noteadd "POTATO" mes a stop上の例では、変数aに代入されている「ONION」「TOMATO」「CARROT」という3つの要素に、「POTATO」 という行を追加しています。4行目の「mes a」で、その結果を表示しているので確認することができます。 内容を追加するには、noteadd命令を使用します。「noteadd "POTATO"」は、最後の行に「POTATO」 を追加します。noteadd "POTATO",1と指定をすると、インデックス1の位置に追加されます。 それまでインデックス1以降にあった内容は下にずれることになります。また、noteadd "POTATO",1,0は、同じくインデックス1の位置に追加されますが同じ行に上書きで追加されます。 それまでインデックス1にあった内容は消去され、かわりに指定した内容になります。
指定したインデックスの行を削除する命令も用意されています。notedel 1は、インデックス1を削除します。
これらのメモリノートパッド命令は、他の命令と組み合わせた時に威力を発揮します。 メモリノートパッド命令は、テキストファイル、mesbox命令で入力される複数行テキスト、dirlist命令の結果、comboxおよびlistbox命令で指定するパラメータの処理に使用することができます。 また、1行単位で取り出した文字列は、poke,peek命令などで1文字単位で扱うことが可能です。 いままでは、getstr命令などを使わなければできなかった行単位の処理が大幅に便利になることでしょう。例: nmax=0 notesel a noteload "aaa.txt" notemax nmax idx=0 repeat nmax noteget b,idx print "index"+idx+"="+b idx++ loop stop上の例では、"aaa.txt"という名前のテキストファイルを読み込み、そのすべての行をインデックス番号 とともに表示します。 noteload命令を使用することにより、変数に確保されたメモリバッファのサイズを読み込みファイルに合わせて調節します。 全体の行数がわからない場合は、notemax命令を使用します。これは、メモリノートパッドの対象になっているテキストの行数を調べて変数に代入します。
例: alloc a,32000 alloc tmem,32000 tmem="" fname="" ; dirlist a,"*.*" sel=0 objsize 160,24 listbox sel,150,a ; ID=0 button "SELECT",*ok ; ID=1 pos 180,0 mesbox tmem,450,200 ; ID=2 stop *ok notesel a noteget fname,sel exist fname if (strsize=0)or(strsize>32000) : goto *lderr bload fname,tmem objprm 2,tmem stop *lderr dialog "LOAD ERROR!" stopこれは、メモリノートパッド命令と、その他の命令を組み合わせたサンプルです。 カレントディレクトリにあるファイル一覧をリストボックスに表示して、そこで選んだファイルの内容を、 右側にあるメッセージボックスの中に表示します。 dirlist命令やlistbox命令で使われている文字列は、いずれもメモリノートパッド命令で扱うことのできる複数行のテキストです。 最初は複雑に感じるかもしれませんが、多くのデータを一度に扱うことができ、使い方次第で応用範囲がさらに広がります。
標準マクロは、より個人が書きやすい記述を実現するために用意されたものです。 C言語など、すでに慣れた形式でスクリプトを記述したい場合にお使いください。 初心者の方には、標準マクロのご使用はお奨め致しません。また、標準のサンプル類も 基本的には標準マクロを使用しないものを提供していきます。
ver2.6から、プログラム制御のための新しいマクロ定義が追加されました。 見かけ上、命令と同様に動作するほか、同様のマクロを新しく定義する ことも可能です。詳しくは、別項「#defineマクロについて」を参照してください。 以前のスクリプトを動かす際に、新しく追加されたマクロ名がすでに変数名や ラベル名として使われているとエラーになります。doやfor、nextなど短い単語は 衝突する可能性が高いので、注意してください。もし、衝突してしまっている 場合は、変数名・ラベル名を別なものに置き換えれば動作させることができます。 以前の名前を変更したくない場合は、スクリプトエディタの「HSPメニュー」から、 「HSP拡張マクロを使用する」のチェックを外すことで、標準マクロを使用せずに 以前(ver2.55)と同様の予約キーワードだけが定義されます。・do〜untilマクロuntilに続く条件が満たされるまで、doからuntilまでの部分を繰り返します。 条件が満たされている場合でも、最低一回はdo〜until内を実行します。 untilに続く条件を省略した場合は、繰り返しを行ないません。 また、_continueにより繰り返しの先頭から再開、_breakにより繰り返しを脱出することができます。例: a=0 do a=a+1:mes "A="+a until a>5 ; aが5以上になるまでdo以下を繰り返す
・while〜wendマクロwhileに続く条件が満たされている間だけ、whileからwendまでを繰り返します。 条件が満たされていない場合はねwhileからwendまでを実行しません。 whileに続く条件を省略した場合は、無限に繰り返しを行ないます。 _continueにより繰り返しの先頭から再開、_breakにより繰り返しを脱出することができます。例: a=0 while a<5 a=a+1:mes "A="+a wend ; aが5以下の間だけwhile以下を繰り返す
・for〜nextマクロfor 変数名,初期値(0),終値(0),増分(1)
をパラメーターとして指定すると、for〜nextの間を指定回数繰り返します。 カッコ内は省略した場合の値です。変数名は省略できません。 指定された変数をカウンターとして使用し、初期値から始まって、 1回繰り返すごとに増分を足していきます。終値に達した時点で、 繰り返しから抜けます(終値はループに含みません)。 最初から終値の条件が満たされている場合は、繰り返しを実行しません。 また、_continueにより繰り返しの先頭から再開、_breakにより繰り返しを脱出することができます。例: for a,0,5,1 mes "A="+a next ; aが0から4の間(5回)繰り返すこの例では、変数aは0,1,2,3,4と5回繰り返してループを終わります。 増分にマイナス値を指定することも可能です。例: for a,5,0,-1 mes "A="+a next ; aが5から1の間(5回)繰り返すこの場合、変数aは5,4,3,2,1と5回繰り返してループを終わります。 forマクロは、内部でマクロ展開後に特殊な新規命令exgotoを生成します。 exgoto命令はforマクロのための補助命令で単体で使用することは推奨 していません。
・switch〜case〜swendマクロswitch〜case〜swendは、ブロック内に複数の条件判断と処理をまとめて書くことができる構文です。
switch 比較元
でswitchブロックを開始します。 比較元のパラメーターは、変数または式を指定することができます。 switch以降は、
case 比較値
を置くことで、これ以降に「比較元」が「比較値」と同じだった場合に処理する内容を記述することができます。 caseは、ブロック内に複数記述することができ、それぞれの比較値ごとの処理を指定できます。 caseの比較が正しい場合は、swbreakが存在するまで以降の命令を実行します。 また、caseの替わりに
default
を置くと、caseで指定したどの比較値にもあてはまらない条件の場合に以降が実行されます。
switchブロックが終了した場合は、
swend
を必ず最後に書いておく必要があります。 以下は、switchマクロを使用したスクリプトの例です。例: a=0 switch a ; aを比較対象とする case 0 ; aが0だった場合 mes "A=0" swbreak ; case0の条件実行終了 case 1 ; aが1だった場合 mes "A=1" default ; aが0以外だった場合 mes "A!=0" swbreak swendこの例では、変数aの内容が0か1かそれ以外かで条件分岐を行なっています。 「case 0」以降は、「swbreak」までが実行されますが、「case 1」の場合は、 「swbreak」が存在しないため、「default」以降に実行される「mes "A!=0"」も 含めて実行されるので注意してください。
ver2.6から、メモリバッファの内容を擬似的にファイルとして扱う機能が追加 されました。picload命令など本来ファイルの内容を対象とした機能を、 変数の持つ内容から実行させることができます。 メモリストリーム機能は、memfile命令によって設定します。これ以降は、 「MEM:ファイル名」というパス名で指定されたファイルは、memfile命令によって、 設定された変数バッファから読み込まれます。memfile p1,p2,p3 [メモリストリーム設定] p1=変数 : ストリーム対象となる変数名 p2=0〜(0) : バッファのオフセット p3=0〜(MAX) : バッファのサイズメモリストリーム機能によってファイルの替わりとして扱うメモリ 空間を持った変数を設定します。 p1で指定された変数は、これ以降に「MEM:ファイル名」で 指定されたファイルの読み出し元となります。 p2で、オフセット(読み出す際の先頭位置)を指定します。0が指定されるか 省略された場合は、バッファの先頭から読み出されます。 p3で、読み出す対象となるサイズを指定します。0が指定されるか、 省略された場合は、変数のバッファ全体が対象となります。 メモリストリーム機能を使うことで、「picload "MEM:a.jpg"」と指定 すれば変数バッファの内容を画像ファイルとして扱うことが可能です。 ただし、picload命令やsndload命令など拡張子をファイル種別として判断 している場合には、ダミーのファイル名(「MEM:a.jpg」など)を指定する ようにしてください。また、拡張プラグインに渡すファイル名に関しては、 メモリストリーム機能は適用されませんので注意してください。
メモリストリーム機能は、独自形式のアーカイブや暗号形式を用意して その内容を読み出して画像として展開する場合など、特殊な場面でのみ使われる ことを想定したものです。
ver2.6から、DPMファイルの名前を明示してそこに含まれるファイルを直接 指定することができます。 DPMファイルは、複数のファイルをまとめて1つにパックしておいたもので、 スクリプトエディタの「packfile編集」で必要なファイルを選択した後、 「DPMファイル作成」によって作成することが可能です。 HSPでは通常、「DATA.DPM」というファイルをデフォルトで読み出し対象と して起動されますが、DPMファイルの明示機能により「DATA2.DPM」や 「ABC.DPM」のような別な名前のDPMファイルを扱うことが可能になります。 DPMファイルを明示する場合は、「DPM:data.dpm:ファイル名」のように、 「DPM:」に続けてDPMファイル名、その後「:」に続けて実際のファイル名を 記述してください。それ以降は、指定されたDPMファイルが読み出しの対象 となります。 拡張プラグインに渡すファイル名に関しては、DPMファイルの明示は無効に なりますので注意してください。
HSPが読み出すファイル検索の順序は以下の通りです。・スクリプトエディタからの実行時(hsp2.exe) 1. DPMファイル(初期状態ではdata.dpm)内に含まれるファイル ↓ 2. カレントディレクトリに存在するファイル ・実行ファイル形式での実行時(hsprt) 1. exeファイル内に含まれるファイル、または明示指定されたDPMファイル に含まれるファイル。 ↓ 2. カレントディレクトリに存在するファイルこれにより、複数のDPMファイルを扱うことが可能です。 DPMファイルの作成時にファイルの暗号化を行なうことも可能ですが、実行 ファイル作成時の暗号化よりもセキュリティ時には弱くなることを留意して おいてください。DPMファイルそのものをエディタやビューアーなどで直接 見ることはできなくなりますが、DPMファイルに含まれるファイル名がわかって いれば、HSPからは読み出すことが可能になります。
ver2.6から、run命令にcmdlineの内容を指定するパラメーター追加されました。run "filename","cmdline" [指定したファイルに制御を移す] "filename" : 実行するHSPオブジェクトファイル名 "cmdline" : システム変数cmdlineに代入される文字列別のファイルに書かれたHSPのプログラムを実行します。 指定するファイルはHSPのオブジェクトファイル(拡張子がAX)でなければ なりません。 オブジェクトファイルは、スクリプトエディタの「オブジェクトファイル作成」 によって作成することができます。
例: run "MENU2.AX","-s"が実行されると、いままでのプログラムはなくなり"MENU2.AX" というファイルのプログラムが最初から実行されます。 画面の状態は維持されますが、変数、メモリバッファの内容は すべて初期化されます。 また、「-s」という文字列がシステム変数cmdlineに代入された状態で 実行が開始されます。
objmode命令のオプション指定により、Windowsのダイアログと同様の [TAB]キーによるオブジェクトのフォーカス移動が可能になります。 HSPのソース側では、特に何の変更も必要ありません。 フォーカス移動の順番は、オブジェクトIDの順になります。 また、この機能の導入に伴って、以前のバージョンでinput命令により 配置された入力オブジェクト内で、[Enter][TAB]キーなどを押した場合に ベル(BEEP)が出力されていた現象も解消しています。objmode p1,p2 [オブジェクト設定モード] p1=0〜2(0) : オブジェクトフォント設定モード指定 p2=0〜1(0) : フォーカス移動キー指定(0=OFF/1=ON)button,input,mesboxなどのオブジェクト配置命令で使用される フォント設定のための命令です。 p1で0〜2までのフォント設定モードを指定することができます。 これにより、以降のオブジェクト配置命令実行時のフォント設定が 変わります。モードの値と内容は以下の通りです。
p1 モード ----------------------------------------------- 0 : HSP標準フォントを使用 1 : デフォルトGUIフォントを使用 2 : font命令で選択されているフォントを使用ウインドゥが初期化された直後は、モード0に設定されています。 たとえば、これをモード1に変更してから、オブジェクトを配置すると デフォルトGUIフォント(メニューやダイアログボックスなどで使われて いる、小さいサイズのフォント)が使われます。
また、モード2に変更した場合は、font命令で指定したフォントが 使われるようになります。これは、オブジェクト配置命令が実行 される時点で、設定されているフォントが使用されます。objmode命令 が実行された時点のフォントではないので注意してください。
p2で、[TAB]キーによるオブジェクトのフォーカス移動モードの ON/OFFを行ないます。p2を1に指定した場合は、表示されているオブジェクト の入力フォーカスを[TAB]キーで移動することができます。
尚、ver2.61よりフォーカス移動時に入力ボックスの項目を全選択するように修正されています。p2 モード ------------------------------------------------------- 0 : [TAB]を無効にする(標準) 1 : [TAB]キーによるオブジェクトのフォーカス移動可能
ver2.6から、指定された値に応じて飛び先を選択するon命令が追加されました。on p1 goto/gosub ラベル0,ラベル1… [数値による分岐] p1=0〜(0) : 分岐のための値 ラベル0〜 : 分岐先のラベル名on命令は、p1で指定された値が0,1,2…に応じて分岐先を選択します。 「on 数値 goto」または、「on 数値 gosub」のような書式で、続いて 分岐する先のラベルを1つ以上「,」で区切って記述することができます。 指定された数値が0の場合はラベル0が、数値が1の場合はラベル1が分岐の 対象になります、以降2,3,4…と対応したラベルを任意の数だけ記述して いくことが可能です。 「on 数値 goto」の場合はgoto命令と同じ単純な分岐、「on 数値 gosub」 の場合はgosub命令と同じサブルーチンジャンプを行ないます。 数値がマイナス値か、対応したラベルが指定されていない場合は分岐は 行なわれずに次の行に進みます。 n88系のBASICと違い最初のラベルが数値0に対応しているのでご注意下さい。 (n88系BASICでは数値1が最初のラベルになります)
例: a=1 on a goto *a0,*a1,*a2 mes "その他":stop *a0 mes "A=0":stop *a1 mes "A=1":stop *a2 mes "A=2":stop
次の変数はシステム起動時、または特定の命令を実行した時に自動的に 値が代入される変数です。普通の変数と同じように参照することができ ます。ただし、システム変数に対して値を代入することはできません。 (ただし、モジュール内では例外的に、値を返すためシステム変数に値を代入する ことが可能です)
変数名 | 設定される内容 |
system | ?? |
hspstat | HSPランタイムの情報を取得する(*1) |
hspver | HSPのバージョン番号(*2) |
cnt | repeat〜loopループのカウンター |
err | エラーコード |
stat | 色々な命令のステータスなど |
dispx | ディスプレイのX方向 解像度 |
dispy | ディスプレイのY方向 解像度 |
paluse | Windowsがパレットモード(256色)の時は1、それ以外の時は0 |
mousex | マウスカーソル-X |
mousey | マウスカーソル-Y |
rval | RGBカラーのR(赤)輝度情報 |
gval | RGBカラーのG(緑)輝度情報 |
bval | RGBカラーのB(青)輝度情報 |
cmdline | コマンドラインに渡された引数の文字列(最大2048文字) |
winx | 現在のウインドゥ描画エリアXサイズ |
winy | 現在のウインドゥ描画エリアYサイズ |
strsize | getstr命令で読み出したByte数 |
csrx | カレントポジションのX座標 |
csry | カレントポジションのY座標 |
windir | Windowsがインストールされているディレクトリパス |
curdir | カレントディレクトリパス |
exedir | 起動したEXEファイルのあるディレクトリパス |
refstr | ファイルダイアログで選択されたファイル名 |
prmx | ginfo命令で取得されるX値 |
prmy | ginfo命令で取得されるY値 |
looplev | repeat〜loopのネストレベル |
sublev | サブルーチン(モジュール)のネストレベル |
wparam | 割り込み時に保存されるWindowsのシステム値(wParam) |
lparam | 割り込み時に保存されるWindowsのシステム値(lParam) |
iparam | 割り込み要因を示す値 |
*1 以下の情報がすべて合計された値になります。 ( デバッグモード = 1 ) ( IMEが有効 = 2 ) ( Macintosh版HSP = $80 ) ( IMEをサポートしないOS = $100 ) *2 バージョンコード + マイナーバージョンコードの値になります。 (2.61は$0261になる)
現バージョンでのシステムリソースの許容範囲は以下の通りです。 この値をオーバーしてしまった場合、正常な動作の保証はできません。
ソースファイル(.AS)の最大サイズ | 無制限 |
オブジェクトファイル(.AX)の最大サイズ | 無制限 |
HSPスクリプトエディタの最大ファイルサイズ (Windows95/98/Meのみ) | 48000bytes(変動あり) |
宣言できるラベルの最大数 | 4096個 |
宣言できる変数の最大数 | 4096個 |
識別されるラベル・変数の最大文字数 | 59文字(半角) |
命令内で使用できる文字列の最大 | 65535文字 |
変数に保持できる文字列の最大 | 無制限 |
変数に保持できる配列の最大 | 無制限(ただし4次元まで) |
定義可能なプラグインの最大数 | 2730 |
プラグインで拡張可能な命令最大数 | 4096 |
定義可能なモジュールの最大数 | 無制限 |
モジュール内のユーザー定義命令最大数 | 4096 |
1画面内のボタン最大数 | 64個 |
表示できるウインドゥの最大サイズ | 無制限(メモリが許す限り) |
表示できるMAG画像の最大サイズ | X方向/Y方向 無制限 |
表示できるJPEG画像の最大サイズ | X方向/Y方向 無制限 |
HSPは中間言語処理によるシングルタスクのインタプリタです。 HSPと他のWindowsアプリケーションはマルチタスクで同時に走らせることができます。 (HSP2.EXEを複数同時に走らせることもできますが、メモリ容量の少ない環境ではおすすめできません)
ただし、そのために1つだけHSPのスクリプトを作る上で約束事があります。 DOSのBASICをいじっていた人などには、最初はわかりにくいと思いますが、HSPでは 「キーを押さないと進まないなどの無限にループになる可能性のある部分では、必ずwaitかawait命令を入れる必要がある」 という約束事を覚えておいてください。 waitやawait命令はWindowsの他のタスクに空き時間を回すための重要な役割があります。 これを守らないと、無限ループでWindowsのほぼすべてのタスクを奪ってしまい、 マルチタスク動作に影響が出ます。その結果、ウインドゥが正常にドラッグできなくなったり、 タスクの切り替えができなくなったりと変な状態になります。 (Windowsそれものが動かなくなるなどの致命的な状態にはなりません。 誤ってHSPで無限ループを作ってしまった場合は、[Ctrl]+[Alt]+[Del]を同時に押してHSPのタスクを終了させればもとの状態に戻ります)
しかし、この約束事を気にしすぎる必要もありません。1秒以内に確実に終わる程度のループであれば、 waitを入れる必要はありません。waitを入れることでさらに処理速度が遅くなってしまいます。 最も問題になるのは、たとえば「マウスのボタンを押すまで待つ」というような部分を、例: *mwait getkey a,0 if a=0 : goto *mwaitのように記述すると、そこで無限ループになってしまいます。これを、例: *mwait getkey a,0 await 5 if a=0 : goto *mwaitこのように修正すれば、無限ループは回避され正常にタスクが実行されます。 「await 5」は、非常に短い単位でのウェイトなので、これによってボタンの入力がしにくくなることもありません。
await命令を使うとwait命令よりも高精度で細かいウエイトが可能ですが、 wait命令よりもCPUのタスクを消費します。 リアルタイムに画像を書き換えるなどの処理でなければ、wait命令を使用した方がCPU(Windows)の負担が軽くなります。 常にデスクトップに配置するようなアクセサリにはwait命令を、 ゲームアプリケーションなどにはawait命令を使うといった使い分けをするといいでしょう。
HSPの中心となる機能は、画面に文字や画像、そして点、線などを描画する ものです。HSPでは複数の描画バッファが用意されていて、それぞれに ウインドゥを割り当て、複数のウインドゥ画面を操作することが可能です。
HSPでは描画対象となる仮想的な画面を32個まで持つことができます。 これらの仮想画面は、ウインドゥIDと呼ばれる数値で管理されます。 それらは次のように使うことができます。
ウインドゥID | 内容 |
0 | HSPのメイン画面(スクロール不可) |
1 | フルスクリーン時の背景となる画面(通常は使用しない) |
2〜31 | 自由に使用できるオプションの画面(スクロール可) |
ウインドゥID0は、最初に現れる画面を指します。2つ以上のウインドゥを 開くことがないのであれば、ウインドゥIDは特に意識せずに使用できます。 ウインドゥID1は、システム側で使用する画面なのでユーザーは自由に使用 できません。
HSPのメイン画面とは別に新しいウインドゥを開いたり、メモリ上に仮想 画面を作成する場合には、ウインドゥID2〜31を使うことになります。
新しい仮想画面は、初期化してから使用しなければなりません。そのための 命令がscreen命令およびbuffer命令です。screen命令で初期化をすると、 その画面は新しいウインドゥとしてディスプレイ上に表示されます。この ウインドゥはサイズを変更することができ、スクロールバーを使ってスク ロールさせることができるので、大きなサイズの画像でも表示可能です。 それに対して、buffer命令で初期化をすると、その画面はメモリ上に存在 するだけとなり、ディスプレイからはその内容は見えません。このような 画面は、ほかの画面に画像の一部をコピーするためのテンポラリとして、 また一時的な画像の保存場所などに使用することができます。
*一度初期化された仮想画面の属性は変更できません。 つまり、screen命令で初期化された画面を消したり、buffer命令でメモリ 上のバッファにすることもできません。
通常画面の基本的な使い方は、まずcls命令で画面をクリアするか、picload 命令で画像を画面に表示して初期化します。その後、メッセージやボタンを 配置します。
メッセージの出力、グラフィックデータのコピー、ボタンの配置などは カレントポジションと呼ばれる座標を対象に行なわれます。
カレントポジションはDOS画面のカーソルのようなもので、メッセージが出力 された後は、カレントポジションも改行した次の行に自動的に移動します。 カレントポジションは、pos命令によって変更することが可能です。また、 objsize命令によって、カレントポジションの移動量を調節することができます。 cls命令などで画面が初期化された時は、カレントポジションも(0,0)にリセ ットされます。
カレントポジョンがどこにあるかは、システム変数のcsrx,csryを参照する ことで得られます。
HSPでは、押しボタン、入力ボックスなどの部品をオブジェクトと呼び、画面内で自由に配置することが可能です。
HSPでは、以下のようなオブジェクトを使用することができます。
オブジェクト名 | 配置するためのHSP命令 | 内容 |
ボタン | button | 押されると指定ラベルのプログラムを実行 |
入力ボックス | input | 数値や文字列を入力(1行) |
メッセージボックス | mesbox | 文字列を入力・表示(複数行) |
チェックボックス | chkbox | ON/OFFチェックマーク切り替え |
コンボボックス | combox | 複数要素から選択可能な枠 |
リストボックス | listbox | 複数要素から選択可能な枠 |
それぞれのオブジェクトには、オブジェクトIDという番号が割り振られ管理されています。 このオブジェクトIDは、画面内に配置した順に自動的に0,1,2,3…とついていくもので、 普通は意識する必要はありません。 オブジェクトIDの把握が必要な時は、オブジェクトの一部を後から消したい時、オブジェクトの状態を変更したい時などです。
また、押しボタンが押された時には、システム変数statに押されたボタンのオブジェクトIDが代入されます。 そこで、ボタンの飛び先を同じ場所にしておき、この値を調べて、 それに応じた処理を行なうことも可能になります。
オブジェクトは簡単に配置して使うことができますが、より奥深い使い方をマスターすれば、 さらに高度なスクリプトを書くことも可能になります。 オブジェクトの内容を後から変更するための、objprm命令や、オブジェクトにWin32メッセージを直接送るobjsend命令はそのような高度な使用のために用意された命令です。
メッセージの出力、点、線、矩形の描画などに使用される色がカレントカラー です。これは、palcolor命令、color命令で変更することができます。
cls命令などで画面が初期化された時は、カレントカラーは黒色にリセットされ ます。
HSPでは、通常の変数や、配列変数が割り当てられるメモリをファイルに セーブしたり、ファイルからロードをするための命令が用意されています。 メモリバッファは、Windowsが許す限りのメモリを扱うことができ、上限は ありません。
基本的なメモリバッファの使い方は、sdim命令やdim命令で変数の配列として メモリバッファを初期化します。 よりメモリサイズが明確に指定できるalloc命令も使用できます。
メモリバッファのファイル入出力は、bload命令、bsave命令で行ないます。
HSP2では、WAV形式のPCM音声ファイル、SMF(MID)形式の標準MIDIファイル、 CDの音声トラック再生、AVI/MPEG動画ファイルなどを手軽に扱うことができます。
また、MCIコントロールデバイスとして登録されている機器のコントロール も可能です。
再生するためのファイルは、sndload命令によってHSPに登録され、snd命令で 再生を開始することができます(再生中断はsndoff命令)。 それぞれのサウンドは、ループ再生、再生終了までのウエイトを選択できます。
ただし、MIDIのループ再生には問題があり完全なループ演奏にはなりません。 WindowsのMIDIシーケンサーが演奏開始まで時間がかかるのと、MIDIデータには 最初に音源を初期化するコードや音色の指定などで時間がかかる場合が多いため 演奏終了から、ループまでがうまくつながらないことが多いからです。
ですから、この機能はあくまで簡易のループということをご了承ください。 そもそもループポインタが指定できないので、前奏まで戻るのも変なんですが、 ゲーム中にBGMが終わってしまうのが寂しいのを避けるためと割り切って使う ことはできるかもしれません。
MIDIのデバイスドライバによっては、MIDI演奏をストップした直後に、再びMIDI演奏を開始すると Windowsがフリーズしたり演奏されないものがあるようです。 そのような場合には、MIDI演奏終了後に1〜2秒ほどのウエイト(wait 20など)を入れてから、 次の演奏を開始するようにしてみてください。
WAV形式のPCM音声だけは、最初にすべてメモリにロードされてから再生される のでループ再生も問題なく行われます。ただし、WAVファイルのサイズだけメモリ を占有するので、あまりにも巨大なファイルは、mci命令で再生するようにしてください。
ver2.6から、文字列バッファの管理やチェックが変更され、より安全に利用する ことができるようになっています。 一部の命令において、文字列データを取得したり、追加する場合にメモリバッファを 自動調整するようになりました。・dirlist命令 ・noteadd命令 ・noteload命令これらの命令は、指定した変数にデータを追加もしくは代入します。 その場合に、確保しているメモリよりも大きなサイズが代入される場合には、 自動的に新しいサイズで確保し直して実行を継続します。 たとえば、従来のdirlist命令は、sdim buf,1000 dirlist buf,"*.*"のように指定した場合は、bufに確保されている1000バイトを越えるサイズの ディレクトリ情報があった場合にバッファオーバーフローが発生していましたが、 ver2.6からは、dirlist buf,"*.*"の命令だけで、それまでに確保されているバッファのサイズを越える場合に、 再確保を自動的に行ないます。 また、同様に、メモリノートパッド命令のnoteaddも、指定したバッファに文字列を 追加しますが、追加することでバッファがオーバーフローをするような場合には、 自動的に再確保を行ないます。例: sdim a,64 notesel a repeat 100 noteadd "#"+cnt loop従来は例にあるコードでは、バッファオーバーフローが発生していましたが、 ver2.6では再確保により安全にバッファが運用されます。 新規に追加されたnoteload命令は、主にテキストファイルをバッファに読み込む ための機能で、指定されたファイルサイズに従ってバッファの確保を自動的に行ない ます。
バッファ自動増加機能は、単純な変数にのみ適用されます。 文字列型の配列変数では、再確保は行なわれませんので注意してください。
より高速な処理や、ちらつきのない書き換えを行なう場合には、 redraw命令が有効です。redraw命令により、描画スイッチを一時的にOFFに しておき(redraw 0)、普通に描画処理を行ない、すべてが終わったところで 描画スイッチをONにします(redraw 1)。
これにより、描画中の状態を画面では見えなくし、しかも高速に処理されます。 高速化のためには、何はなくともまずredrawの制御を行なってください。
screen命令および、buffer命令で仮想画面を初期化する際にも、 パレットモードで初期化する方法と、フルカラーモードで初期化する方法の 2つがあります。指定を省略すると、現在の画面モードに合わせて自動的に 設定されますが、そこに表示される画像が256色のものだけであれば、 パレットモードで初期化しておく方が効率がいいでしょう。
逆にフルカラーモードで初期化した仮想画面を、256色表示のディスプレイ 上に表示させようとすると、フルカラーのデータをパレットにマッチング させるためウインドゥの表示が遅くなることがあるので注意してください。 (詳しくは、パレットモードでの注意点を参照してください)
mes,print命令で変数の内容などを常に更新したい場合などは、文字が 重なりあってしまって都合がよくありません。同じ画面で、何度も表示を 書き換えたい時は、title命令を使ってキャプションバーに表示すること をおすすめします。title命令はmes,print命令に比べても高速です。 たとえば、title "X,Yの内容="+x+","+yのように変数x,yの内容を表示する時に使用するといいでしょう。
HSPでは、パレットモードとフルカラーモードという2つのモードをなる べく同等に扱えるように作られていますが、仕様上ある程度気をつけな いといけない点があります。256色の画像ファイルを扱う場合や、同時に 複数の画像を表示する高度なスクリプトを作成する時には特に注意して 下さい。まず、以下のようなOS上の制限からくるHSPの仕様があることを 覚えておいてください。
1.フルカラーモード
65536色、1670万色、または8ビットを越えるカラーモードのこ とを言います。1670万色モードでは、指定された色がそのまま 発色され、65536色では指定された色に近い色が発色します。 色数の多い画像を同時に表示しても、色が変になることはあり ません。ただし、一般的にパレットモードよりも描画スピード が遅くなることが多く、HSPで使用するメモリの量も増加します。
2.パレットモード
256色以下のカラーモードのこと。
画面上に256色までしか同時に使用できないうえに、すでに Windowsでは20色のスタティックカラーを使っているので、 HSPで自由に使えるのは236色以下になります。
従って、色数の多い画像を同時に表示させると、色がおかし くなったり、元と違う色で表示されることがあります。
HSPでは、パレットモードでもJPEG画像が表示できるように、 自動的に220色のパレットを設定してフルカラーに近い色で表 示されるようになっています。
パレットモードでは、一般的にフルカラーモードよりも描画 速度が速くなり、HSPで使用するメモリの量も少なくて済みます。
以上の点から、フルカラーモードでも、パレットモードでも動作する スクリプトを作る場合には、以下のような注意が必要です。
普段、フルカラーモードでスクリプトが正常に動いていたのに、パレ ットモードに変更したとたんに表示がおかしくなった場合なども、多 くは次のような原因によるものです。
1. 16色、256色の画像を同時に表示しない
パレットモードでは、16,256色の画像をロードした時点で、 それまで表示されていた画像がウインドゥ内に残っていた場合、 色がおかしくなることがあります。JPEG画像はフルカラーな ので問題はありませんが、MAG,BMPファイルを複数のウインドゥ で表示する時には注意しなければなりません。その場合には、 一番手前にあるウインドゥのパレットがすべての画像に適用 されて正確な色が再現されなくなります。
パレットモードでも、複数の画像を同時に正確に表示したい 場合は、すべてのパレットを同じにしておいてください。
2. 8ビットカラーは256色でなく230色までを使用するようにする
パレットモードでは上にあるように、236色以下しか使用でき ません。256色をフルに使っている画像などは、画像の一部が 変な色になってしまう可能性があります。これを避けるため に、最初から230色程度までしか使用しないで画像を作っておく か、ツールなどで減色しておくことをおすすめします。
以上の点に注意してスクリプトやデータを作成すれば、パレットモード でも正常に動作するはずです。どうしても、この制限が回避できない 時は、フルカラーモードのみで動作するスクリプトになってしまいま す。そのような場合は、システム変数paluseで判断して、フルカラー モード専用を知らせるメッセージを出すように作っておくと、より親切 です。
gcopyでのコピーモード設定は、描画対象になっているウインドゥIDに設定されることに 注意してください。たとえば、ID2からID0に画像をコピーしたい場合には、gcopy命令をID0に 対して実行するので、 ID0に対してgmodeの設定をしなければなりません。 (ウインドゥIDごとにgmodeの設定が保持されているため) 正常にモードが設定されないと感じる時には、以上の点に注意してgmode命令を記述してください。
画面上を何度もコピーするような場合は、面積にもよりますが、描画スイッチをコントロール する「redraw」命令を使用するとパフォーマンスが向上します。 最初に「redraw 0」を実行して再描画をOFFにした状態で、gcopy命令を使って画面上のコピーを 複数回行ないます。最後に1回だけ「redraw 1」を実行することで、画面全体が更新されます。
ver2.6から、いくつかのコピーモードが追加されています。 gmode命令のパラメータ設定については以下を参考にしてください。gmode p1,p2,p3,p4 [画面コピーモード設定] p1=0〜6(0) : 画面コピーモード p2,p3 : コピーする大きさX,Y(ドット単位) p4=0〜256(0) : 半透明合成時のブレンド率gcopyで使用されるモードおよび、サイズ、ブレンド率などを設定します。 それぞれのコピーモード動作は以下の通りです。・モード0 = 通常のコピー(bitblt)WindowsのシステムAPIを使った画像コピーを行ないます。 最も標準的なモードです。・モード1 = メモリ間コピー画像バッファ間のメモリコピーを行ないます。 コピー元とコピー先は、同じ画像モード(パレットあり・なし) でなければなりません。 モード0よりも速度面で有利な場合があります。・モード2 = 透明色付きコピーモード1と同様の方法でコピーを行ないますが、RGBが0の ドットは透明色とみなされコピーされません。・モード3 = 半透明合成コピーフルカラーモード時のみ使用することができます。 gmodeの4番目のパラメーターで指定したブレンド率による 半透明合成コピーを行ないます。 ブレンド率は0〜256の値となり、256で完全なコピーに なります。 ブレンド率が0の場合はコピーは実行されません。 また、ブレンド率が256以上はメモリ間コピーが実行されます。・モード4 = 透明色付き半透明合成コピーモード3と同様の方法でコピーを行ないますが、RGB値が color命令で設定された色と同じドットは透明色とみなされ コピーされません。 ブレンド率が0の場合はコピーは実行されません。・モード5 = 色加算合成コピーフルカラーモード時のみ使用することができます。 gmodeの4番目のパラメーターで指定したブレンド率による 色加算合成コピーを行ないます。 色加算では、コピー先のRGB値に、コピー元のRGB値を加算します。 加算時に輝度が255を越える場合は、255にクランプされます。・モード6 = 色減算合成コピーフルカラーモード時のみ使用することができます。 gmodeの4番目のパラメーターで指定したブレンド率による 色減算合成コピーを行ないます。 色減算では、コピー先のRGB値から、コピー元のRGB値を減算します。 減算時に輝度が0を下回る場合は、0にクランプされます。
これらのモードは、gzoom命令では使用されません。 あくまでもgcopy命令使用時なので注意してください。 また、gmodeは現在gsel命令で選択されているウインドゥID のモードが変更されます。gmodeの設定後に、別なウインドゥIDで gcopy命令を実行しても設定が反映されないので注意してください。
スクリプト中にパラメータとして小数値を記述することができます。 ただし、これは実数を完全にサポートしているということではありません。 小数値を32bitまたは64bitのバイナリデータとして扱い、プラグインやAPIに データを受け渡すことを可能にするものです。 HSPでの完全な実数サポートは、多くの方からご要望を頂いていて、実現したい ことの1つですが、実行速度をあまり損なわずにサポートするためには、 システムの大幅な改修が必要なため、それまでは拡張プラグイン側での 小数サポートを可能にする措置として取り急ぎ実装したものとお考え下さい。
スクリプトに記述可能な値として以下の型が用意されています。
モード 型 記述形式 0 整数値 1 1 固定小数値 1.0k 2 単精度浮動小数値(float) 1.0f 3 倍精度浮動小数値(double) 1.0d
記述した数値の最後に「k」「f」「d」などの識別子が付いているものを 小数値として扱います。識別子がないものは通常の整数として扱われ 小数点がある場合にはエラーとなります。
識別子「k」は、固定小数値(整数のうち何ビットかを小数部とする) として扱うための整数値に変換して扱います。 固定小数値の小数部ビットは#fpbit命令で設定可能です。 識別子「f」は、単精度浮動小数(float)値を32bitの整数値データ として扱います。通常の整数と同様に変数に代入して扱うことが できますが、あくまで特殊な意味を持つfloat値のデータだという ことに注意してください。 識別子「d」は、倍精度浮動小数(double)値を8文字の文字列データ として扱います。double値のデータは可読不可能な64bit(8文字)の バイナリデータとなります。 小数を記述していても、あくまで"abcdefgh"のような文字列として 判断されますので注意してください。
モード2,3は、拡張プラグインや外部DLL呼び出しなどでfloat値や double値を扱う必要がある場合のため用意されたものです。 HSP単体での浮動小数の演算や変換はできませんのでご了承ください。ver2.61においてモード3(倍精度浮動小数)は正常に動作致しません。 将来的には倍精度のサポートを行なっていく予定ですが、現状では未サポートとなっていますのでご了承ください。#fpbit p1 p1 : 固定小数値の小数部bit数(0〜31) 小数値格納モードが固定小数値(モード1)の場合に変換される 固定小数部のビット数を設定します。 デフォルトは16bitになっています。 この場合に「1.0」という小数を指定したとすると、固定小数では 「65536」という整数として扱われます。スクリプト内での小数の記述は、「1.23f」、「0.5d」、「10k」のように識別子を含む形で書いてください。小数点は省略が可能です。 ただし「0.5」を「.5」と書くことはできません。数字で始まり、 小数点を含んでいる必要があります。 また、小数点の後には数字が続いていなければなりません。 (1.0fや1fと書くことはできますが、1.fと書くことはできません)
ver2.6では、色々な要因による割り込み処理がサポートされています。 これらの命令(onkey、onclick)などは、現在以下のような仕様で使うことができます。onkey goto *label キー割り込み実行指定 onclick goto *label マウスクリック割り込み実行指定 onexit goto *label プログラム終了時に割り込み onerror goto *label エラー発生時に割り込み *label : 割り込み時に実行されるラベルキーおよびマウスクリック時、またはエラー時に割り込み実行を行なう設定をします。 onkey命令でラベルを指定すると、それ以降はHSPのウインドゥがアクティブな時に キー入力があるたびに*labelで指定したラベルにジャンプします。 onclick命令でラベルを指定すると、それ以降はHSPのウインドゥ上でマウスクリック が行なわれるたびに*labelで指定したラベルにジャンプします。
onexit命令は、クローズボックスや[Alt]+[F4]によりプログラムが中断された場合に、 指定されたラベルにジャンプします。
onerror命令は、スクリプトが原因でHSP内部でエラーが発生した時に、 指定したラベルにジャンプします。 onerror命令によりエラー後の処理を指定した場合であっても、 必要な処理が終わったら、そのままアプリケーションの実行は再開 せずに、なるべくend命令で終了させてください。 onerror命令は、エラーから回復させるものではありません。 エラー発生の原因によっては、HSPのシステム自体が不安定になったり 障害が発生することも有り得ます。 onerror命令を使う場面としては、実行ファイル作成時にエラーが 発生した場合にアプリケーション側で独自のエラー表示を行ないたい 場合や、特定のエラーが発生する場合にだけデバッグのための表示を 行なうなどが考えられます。
キーやマウス入力による割り込みジャンプは、stop命令および、wait、await命令で 停止している時にのみ割り込みを受け付けてジャンプを行います。 また、割り込みによりジャンプを行なった後は以下のシステム変数がセットされ ます。
割り込み要因 iparam wparam lparam onkey 文字コード wParam lParam onclick マウスボタンID wParam lParam onexit 終了要因 wParam lParam onerror 0(なし) エラー番号 エラー発生行番号
システム変数iparamには、割り込み要因ごとのパラメータが代入されます。 また、wparam,lparamはWindowsメッセージとして渡されたパラメータが そのまま格納されています。
イベント割り込み実行の一時的なON/OFFをすることも可能です。onkey 0で一時的にキー割り込みを停止します。onkey 1で一時停止したキー割り込みを再開させることができます。 同様に、onclick 0 / onclick 1 / onerror 0 / onerror 1 / onexit 0 / onexit 1も使用できます。
ver2.55から、Windowsシャットダウン時(再起動、電源を落とす等)にも onexit命令による終了処理が実行されるように変更されました。 これにより、スクリプト実行中にシャットダウンが起こった場合でも、 それを検知して適切な終了処理を行なうことが可能になりましたが、 以下のような制限がありますので、終了時を判定するスクリプトを作成 する場合は、留意しておいてください。
- onexitでジャンプされた直後は、システム変数iparamに終了要因が値として保存されています。
iparam = 0 の場合は、ユーザーの意思でプログラムを終了。
iparam = 1 の場合は、Windowsシャットダウンによる終了です。
- Windowsシャットダウン時の終了処理には、await、wait、stop命令 などでシステムにアイドルタイム(待ち時間)を発生させた場合には、 シャットダウン処理を中止します(シャットダウンされません)。 await、wait、stop命令を使わずにend命令で終了した場合には、 そのままシャットダウン処理が継続されます。
シャットダウン処理を中止させないで、終了処理を行ないたい場合には、 待ち時間の発生する命令(await、wait、stop命令など)は使用できません。 (ただし、コモンダイアログ(dialog命令)などは使用できます) 最小限の終了処理だけを行なって、そのまま終了するようにしてください。
HSPで作られたアプリケーションは、通常WindowsXP上で問題なく動作します。 ただし、WindowsXP以降からサポートされたビジュアルスタイル(コモンコントロール6.0)に対応させたい場合には注意が必要です。
普通にHSPで作成されたアプリケーションは、Windows9xや2000と同様のボタンや、チェックボックスになっています。この状態では、以下に挙げるような互換性に関係する問題はありません。他のWindowsと同じように動作します。
ビジュアルスタイルに対応することにより、ボタンやチェックボックスなどのオブジェクト類がWindowsXPで使用されているLunaなどのスタイルに変わります。
manifestファイルを作成、またはXMLリソースを作成するなどして、HSPで作られたアプリケーションをビジュアルスタイル対応にすることは可能ですが、以下の点に注意して下さい。
- input、mesboxなどで使用されるエディットコントロールの仕様が異なるため、文字数の指定や、返される文字列の長さが範囲を超える可能性があります。
現在のところ、HSPのシステム側ではコモンコントロール6.0に正式対応していないため、ビジュアルスタイル対応でエディットコントロールを使用する場合は、 文字列の長さに十分注意するようにしてください。
(コモンコントロール6.0では、文字数の長さはunicode単位となるため、全角でも半角でも1文字(2byte)と認識されます。入力可能な文字数の指定(EM_SETLIMITTEXT)や、選択範囲の指定(EM_SETSEL)なども1文字(2byte)単位のインデックス値として扱われています。 objsend命令を使用する場合なども含めて互換性が一部失われているので注意してください。)
「sample\new」フォルダに「xpstyle.as」というサンプルスクリプトが存在します。 このスクリプトをエディタで読み込んで実行ファイルを作成して下さい。 ([ctrl]+[F9]で自動作成をするか、「xpstyle.exe」という名前で実行ファイル作成。) 作成された「xpstyle.exe」と同じフォルダに「xpstyle.exe.manifest」があることを確認して、「xpstyle.exe」を起動すると、コモンコントロール6によるオブジェクトが表示されるはずです。
このように、exeファイルと同名のmanifestファイルを作成することで、ビジュアルスタイルに対応することが容易に可能です。ただし、input、mesbox命令が使用されている場合は、上の事項に注意してください。