HSPはプログラム(命令と実行の順序を記したもの)によって動作します。 そのもとになるのがスクリプト(ソースファイル)です。これはテキスト ファイルの形式で、拡張子は .AS になります。 スクリプトはHSPに付属しているHSPスクリプトエディタ(HSED2.EXE)や、 テキストエディタなどのアプリケーションで作成することができます。
HSPスクリプトエディタ(HSED2.EXE)を使用すると、非常に簡単にHSPの スクリプトを作成、編集、実行することが可能です。HSPスクリプト エディタを使用した場合は、
1.テキストのスクリプトを書く(xxx.AS) |
↓ |
2.「コンパイル+実行」のメニューを選ぶか、 |
という手順だけで、簡単にHSPのスクリプトを実行して動作を確かめることができます。
HSPスクリプトエディタ(HSED2.EXE)は、HSPのスクリプト編集用のエデ ィタです。コンパイルや実行なども自動的に行なうことができます。 HSPスクリプトエディタは、本体(HSED2.EXE)とHSP実行ファイル(HSP2.EXE) のファイルを使用しますので、新しいディレクトリを作成して新規に スクリプトを作成する場合でも、これらのファイルをコピーしておく 必要があります。
HSED2.EXE | : HSPスクリプトエディタ本体 |
HSP2.EXE | : HSP実行ファイル本体 |
新規にHSPのスクリプトを作成、実行するためには、最低限上のファ イルが、新規スクリプト(xxx.AS)と同じディレクトリに存在していな ければなりません。また、コンパイルの際に次のファイルが自動的に 生成されます。
HSPTMP | : ソーススクリプトのテンポラリファイル |
OBJ | : 実行オブジェクトのテンポラリファイル |
これらのファイルは、コンパイル時にのみ必要なファイルなのでスクリ プトができあがった時には削除してかまいません。
HSPスクリプトエディタを起動すると、新規のテキスト編集ウインドゥ が表示されます。あとは普通のテキストエディタと同じように、ファ イルをロードしたり、セーブしたりしながらHSPのスクリプトを記述し ていきます。基本的な操作は、Windowsに付属している「メモ帳」と 同じです。文字列のカット&ペースト、検索などもメニューから選ぶこ とができます。
編集しているHSPスクリプトを実行させてみるには、メニューから「コ ンパイル+実行」を選ぶか、またはファンクションキーのF5を押します。 「実行」またはCTRL+F5を押すと、最後にコンパイルされたスクリプト を実行します。
コンパイル中にエラーが発生した場合は、コンパイル後にエラーの内容 とエラーの出た行番号を知らせるダイアログが表示されます。
上の例では、「ラベルが重複している」エラーが行番号15で発生したと いうことを示しています。エラーが発生した場合は、「カーソル」メニュー の「指定行に移動」(またはCTRL+J)を選んで、エラーが発生した行へ 移動してその内容をチェックしてみてください。
一般的な使い方としては、HSPスクリプトエディタで編集、実行を繰り 返しながらスクリプトを作成して、完成したらメニューから「オブジェ クトファイル作成」を使って完成したスクリプトのオブジェクトファイル を作成。最終的には、EXEファイルやSCRファイル(スクリーンセーバー)を 作成して1本のソフトができあがります。
ソーススクリプトのアイコンを、HSED2.EXEのアイコンの上にドロップする だけで編集をすることができるようになっています。ソーススクリプトが ドロップされると、そのソースファイルが格納されているディレクトリが カレントディレクトリとなります。 より便利な使い方としては、「.as」という拡張子を「HSED2.EXE」と関連 付けしておけば、「.as」の拡張子を持つファイルをダブルクリックするだけで、 ソースを開くことができるようになります。 また、デスクトップに「HSED2.EXE」のショートカットを置いておき、そこに ソーススクリプトをドロップするような使い方も可能です。
外部のテキストエディタでHSPのソースファイルを編集したものを手軽にコン パイル+実行させるために、スクリプトエディタでは「外部ファイル実行」の ボタンがツールバーの一番右端に用意されています。 これにより、使い慣れた他のテキストエディタを使いHSPのスクリプトを記述 することが比較的容易になります。主な作業手順は以下のようになります。
このような手順で、外部のエディタでスクリプトを編集することができます。この場合、 HSPスクリプトエディタは、コンパイル+実行をするためのランチャーのような状態だと 考えるといいでしょう。ウインドゥのサイズを小さくして、編集部分をなくしてしまえば 画面上にコンパクトに配置することが可能です。
スクリプトの書き間違いや、指定のミスなどでHSPの実行中にエラーを 発見した時には、エラーコードとエラー行番号が表示されるようになって います。ダイアログが出て、
| HSP | : error code nn |
| in line xxx | |
| --> Syntax error |
のような表示が出た時は、スクリプトのxxx行がコードnnのエラーだと いうことを示しています。 エラーの意味は次のようになっています。
"Unknown_code" | オブジェクトファイル内に |
"Syntax_error" | 構文が正しくない |
"Illegal_function_call" | その命令には使用できない値を使用しようとした |
"wrong_expression" | 計算式の表現がおかしい |
"No_default_parameter" | デフォルトパラメーターが使用できない |
"Type_mismatch" | 指定した型(文字列型か数値型)が間違っている |
"Array_overflow" | 配列の要素がオーバーフローした |
"Not_a_label_object" | ラベルの指定が正しくない |
"Too_many_nesting" | repeat-loopやgosub-returnの |
"Return_without_gosub" | サブルーチンでないのにreturnがあった |
"Loop_without_repeat" | repeat内ではないのにloopがあった |
"File_I/O_error" | ファイルの作業中にエラーが起こった |
"Picture_file_missing" | 指定した画像ファイルが見当たらない |
"External_execute_error" | exec命令など外部でエラーが発生した |
"Priority_error" | 計算式でカッコの使い方が間違っている |
HSP本体は指定されたオブジェクトファイルを読み込み実行するための 核となる部分です。これはHSP2.EXEですべて行われますので、それ以外に 余計なDLLやモジュールは必要としません。もちろん、HSP2.EXE本体には、 サンプルデモのデータやスクリプトは入っていません。スクリプトを最低限 動作させるだけの部分なのです。 もし、あなたがHSPで作ったソフトを配布したいと思ったら、単体で実行 できるEXE(実行)ファイルを作成することができます。EXEファイルを作成 すると、そのファイルをダブルクリックするだけでスクリプトが動作する ようになります。ネットワークや同人ソフトとして配布する際には便利な 機能です。 バッチファイルやコマンドプロンプトから直接HSP2.EXEをファイル名指定 付きで実行させることもできます。 hsp2 demo.ax のように入力すると、"demo.ax"というオブジェクトファイルをHSP2.EXE が読み込んで実行します。
HSPでは、ユーザーが作成したスクリプトや、そこで使用されるデータ ファイルなどを、ひとまとめにしてEXEファイルを作成することができる ようになっています。また、EXEファイルの一種であるSCRファイル( スクリーンセーバーモジュール)も同じ手順で作成できます。
| 1. | スクリプトのオブジェクトファイルを作成しておくこと。 この時、最初に実行されるオブジェクトファイル名は、 必ず「start.ax」にしておくこと。これがないと、スクリプトが起動されません。 |
| 2. | 「PACKFILE編集...」のダイアログで、EXEファイルに含めるための ファイル一覧(PACKFILE)を作成します。ここでは、start.axなど EXEファイルに埋め込むためのファイル名をすべて選択しておく 必要があります。 |
| 3. | スクリプトエディタのツールメニューから「EXEファイル作成」を選択します。 スクリーンセーバーの場合は、「スクリーンセーバー作成」を選択します。 これで、EXEまたはSCRファイルがカレントディレクトリにできあがります。 |
EXEファイルやSCRファイルを作成するには、必ずPACKFILEが必要に なります。PACKFILEとは、複数のファイルをひとまとめにして、EXE, SCRファイルの中に埋め込むための定義ファイルです。PACKFILEで指定 されたファイルは、スクリプトからは使用できますが、外部からは見え なくなります。これには次のような効果があります。
・ゲームで使用する画像ファイルなどを取り出せないように保護する |
・各ファイルの無駄なクラスタをなくしディスク容量を軽減する |
・大量のデータファイルがディレクトリにちらばるのを防ぐ |
この機能を使えば、EXEの中に埋め込まれた画像ファイルやデータファ イルなどを使うことができ、1ファイルだけの画像や音声を使った ソフトを作ることができます。(ただしMIDIファイルなど一部のデータ ファイルは埋め込むことができません。また、埋め込んだファイルの 内容を変更して上からセーブすることはできません)
もちろん、スクリプトで使用されているすべてのデータファイルを EXEの中に埋め込む必要はありません。必要だと思ったものだけを、 埋め込み、それ以外は通常の外部ファイルとして置いておいても問題 ありません。ただし、最初に実行されるスクリプト「start.ax」だけは 必ず埋め込んでおく必要がありますので注意してください。 「start.ax」というオブジェクトファイルは、「start.as」という名前でソーススクリプトをセーブした状態で、「オブジェクトファイルの作成」メニューで作成することができます。 つまり、最初に実行されるスクリプトは必ず「start.as」というファイル名にしておく必要があります。
PACKFILEは、スクリプトエディタの「PACKFILE編集...」で簡単にファイルを 選択して編集することができます。ただし、ここで指定するファイル名は スペースを含まない半角で11文字以内のMS-DOSファイルネームでなければなりません。
| 1. | EXEに埋め込まれたファイルがある場合には、その中からまずロードするファイルを探す。 |
| 2. | なかった場合には、カレントディレクトリから探す。 |
| 3. | それでもなかった場合には、pathで指定されているディレクトリから探す。Windows、Systemディレトクリなど。 |
| 4. | それも見つからない場合は、エラーになります。 |
EXEファイルを作成し終わったら、まず必要最低限と思われるファイル だけを、新しく作ったディレクトリに移して実行できるかどうかを 確認しておくといいでしょう。通常作業を行なっているディレクトリ には、EXEに埋め込む前のファイルがカレントディレクトリに置かれて いるので、PACKFILEで指定を忘れてファイルが埋め込まれていない 場合でも、正常に動作してしまうためです。
「PACKFILE一覧」ダイアログでは、EXEファイルやSCRファイルを作成する際に必要な データファイル群を選択、管理することができます。ここで選択されたファイルの データは、PACKFILEというファイル名でカレントディレクトリに保存されます。 まず、メニューから「ツール」→「PACKFILE編集...」を選んでください。 「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」などのスペースを含むディレクトリ下にあるファイルを 指定すると、うまく動作しないことがありますので注意してください。
HSPでは、Windows95/NTで動作するスクリーンセーバーモジュールの 作成が可能です。これは、特殊な命令を使いフルスクリーン画面を 作成してそこに描画された内容がそのままセーバーとなるもので、 通常のスクリプトにちょっと手直しをするだけで作成できます。 詳しくは、スクリーンセーバーのサンプルファイル「arusaver.lzh」 を解凍されているスクリプトファイル「start.as」にスクリプトの 書き方と実際の作成手順、そしてサンプルスクリプト本体が書か れていますので参考にしてみてください。
HSPでは、起動オプションを取り込みスクリプトでそれに応じた 処理をすることができます。これにより、色々な機能を持たせた EXEをバッチファイルから呼び出したり、EXEファイルのアイコン上 にファイルをドロップするような処理することが可能になります。
この機能をスクリプトエディタ上から試すために、HSPメニューに 「起動オプション...」があります。これを選択すると、スクリプト エディタ上から起動した時にも、擬似的に起動オプションをつける ことができます。 実際にスクリプトで起動オプションの内容を調べる場合には、 cmdlineというシステム変数を使用します。詳しくは、hspref.txt を参照してください。
HSPでは大きくノーマルウインドゥモードと、フルスクリーンモード を選ぶことができます。ノーマルウインドゥモードは、通常の Windowsアプリケーションと同じくデスクトップ上に任意の大きさの ウインドゥが開いて、それ以外の領域にはデスクトップ画面が見えて います。フルスクリーンモードでは、デスクトップのかわりにユー ザーが任意に指定した壁紙をバックにした画面になり、ディスプレイ 全体がHSPの画面となります。HSPのスクリプトが終了しない限り 別のウインドゥアプリケーションには移ることができません。 この2つのモードは、スクリプトエディタのHSPメニューにある、 「フルスクリーンモード」を選択することで切り替えることができ ます。
通常、EXEファイルやSCRファイルを作成すると、Windowsから見た アイコンはHSP2.EXEと同じものになっています。 このアイコンを自分の好きなものに変更したい方もいると思います。 現在のHSPには、アイコンの編集機能はありませんが以下のシェア ウエアを使うことでアイコンを直接書き換えることが可能です。
| iconrep.exe : IconReplaceProgram |
| Copyright(C)1994-95 Kazuhiro Bando |
| http://www.vector.co.jp/vpack/browse/software/win31/amuse/sn031587.html |
このソフト以外でも、アイコンを直接書き換えるタイプのソフト であれば、アイコンの変更が可能です。これらのソフトで、自由に アイコンを書き換えてください。
1.44MBのフロッピーディスクで配布する場合や、ネットワークで 公開する場合は、作成したEXEファイルのサイズが少しでも小さい方が いい人もいるかと思います。HSPでは、よりコンパクトなサイズで機能 を限定したバージョンも存在します。コンパクト版のHSPは、基本機能 は同じですが一部の命令が削られています。CG集や音楽集など、すべての 機能を使う必要がないという時には使ってみてください。 コンパクト版の、HSP ver2.2ec はHSP2.EXEのサイズが約80Kbyteです。 (ただし、HSP ver2.2e相当の機能に限定されています) コンパクト版は、ONION softwareのホームページにてダウンロード 可能です。あとは、コンパクト版のHSP2.EXEに入れ替えるだけで Okです。
付属しているファイル"samp.as"には、HSP ver2.2で使うことのできる簡単な 例が集められています。この中には、多数のサンプルスクリプトが収録されて います。この一部を切り出してスクリプトの一部として使用することができます。 HSPの機能を活用するための参考にしてみてください。 "samp.as"に含まれているサンプルスクリプトは以下の通りです。
スクリプトはどのような順番で、どのような処理をするかをまとめた テキストファイルです。その中の、どのような処理をするかを指示する ものを命令(ステートメント)と呼びます。
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行は最大256文字まで認識されますが、テキストエディタで見やすい程度に 納めるようにした方がいいでしょう。
1行の中で;(セミコロン)以降はコメントとみなし無視されます。
例: pos 320,100 : print "(^_^)" ; 顔マーク表示
また、スペース、タブは見やすくするために自由に入れられます。
命令のパラメータに数値を指定する場所では、以下のような演算子を 使った式を書くことができます。
| -2147483647〜2147483647 | 10進整数 |
| $0〜$FFFFFFFF | 16進整数(0xでも可) |
| %0〜%111111... | 2進整数(0bでも可) |
| 'A' | 文字コード(1バイト) |
| +,-,*,/ | 加算,減算,乗算,除算 |
| &,|,^ | 論理演算(and,or,xor) |
| \ | 割り算の余り |
| =,<,>,! | 条件式(同じ,小さい,大きい,同じでない) |
| {,} | 左、右方向にビットシフト |
たとえば、statement 1+2+3+4は、statement 10と書いたのと同じになります。これを数式といいます。 数式の評価は常に左から順に行なわれます。乗除算の優先はありません。 たとえば、2+7*2は、18になります。計算の順番を変更したい場合はカッコを使って、2+(7*2)のように書けば、カッコ内の7*2が先に計算されて結果は16になります。 条件式や論理演算は、後に説明する条件判断の際に使われます。 カッコは、8重までネスティングすることが可能です。もし、カッコの使い方が 間違っている場合は、「priority error」というエラーが表示されます。
命令のパラメータに文字列を指定する場所では、文字列を"(ダブルクォーテーション) で囲んでください。例: mes "This is test message..."「+」を使って文字列同士、または変数との結合をすることができます。 たとえば、"ABCD"+"EFGH" は、 "ABCDEFGH" と同じになります。 "VALUE="+val は、 "VALUE=5"(変数valが5の場合)になります。ただし、「\」は特殊な意味を持つキャラクタとして解釈されます。「\n」 は、改行して次の行にするという意味になります。 「\t」 は、TABコードを表わします。 「\"」 は、ダブルクォート(")を表わします。 「\\」 は、ただの「\」になります。ですから、ディレクトリを示すための文字列、たとえば、"C:\WINDOWS\SYSTEM" などの文字列は、 "C:\\WINDOWS\\SYSTEM" と記述しないと認識されません。また、1行に収まりきらない長い文字列をまとめて記述することも可能です。mes {" ここには、1行まるまる直接メッセージを 書いてもいいです。 "}このように、「{"」から「"}」までの間はすべて文字列として解釈されます。 複数行に渡っている時は、1行の最後に改行コードが挿入されます。 文字列の結合や複数行での文字列を指定する場合には、最大32768文字までが 有効となります。 ver2.3c以降では、半角カナも使用可能です。
名前をつけた変数を扱うことができます。変数とは、代入により内容 を変化させることのできる容れ物のようなものです。
変数は、小文字アルファベットで始まる20文字以下の文字列で識別され ます。変数は代入により数値か文字列、または数値の配列を記憶させる ことができます。
数値として記憶できる範囲は、数式で指定できる値と同じ-2147483647 から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言語のようにa++やa--にはらないので注意してください)
変数の型を特定するために、変数の型を強制的に変更することができます。 そのための命令がintとstrです。例: int a ; 変数aを数値型にする str b ; 変数bを文字列型にする変数の型を変更しても、できる限りその内容を保持しようとします。
"123"という文字列を含んだ変数を数値型に変更すると、123という数値に なりますし、逆に123という数値型の変数を文字列型に変更すると"123"と いう文字列に変換されます。
配列変数を使うと、変数に記憶させるものに対して番号をつけて大量に管理 することができるようになります。 通常は、変数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命令を 使用することで、最大文字数を増やすことができます。
プログラム上の位置を示すためにラベルとして名前をつけることができます。 ラベルは*(アスタリスク)の後に続く20文字以下の文字列で示します。
ラベルは行の先頭になければなりません。また、原則としてラベルのある 行には命令を書かないようにしてください。例: *label mes "Wait.":wait 100 goto *label ; 無限ループを生成ラベルは主に、goto命令、gosub命令またはbutton命令の飛び先を指定する のに使用されます。
条件判断を行う場合には、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よりも大きい |
の4つを使います。if+条件式の後は:(コロン)で区切り、それに続いて 条件が満たされた場合に実行される部分を書きます。 もし、条件によってプログラムの流れを変えたい場合には、例: 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を一通り使った上級者の方に使用をおすすめ します。#include "filename" 別ファイルを結合"filename"で指定されたファイルも同時にコンパイルされます。
スクリプトエディタで入りきらないスクリプトも、includeで別ファイルに 分割すればコンパイルすることができるようになります。#define 新規名称 元名称 新規名称を登録するHSPに新しい命令の名前を追加するためのものです。
HSPの従来ある命令の名前を、別な名前でも使用できるようになります。 新規名称は、予約されている命令語や変数名と重ならない20文字以内の、 スペースを含まない英文字列でなければなりません。例: #define pr print pr "message..." stop上のように#defineの後に、新規名称と元の名称をスペースで区切り記述 します。すると、「pr」という命令が新しく登録され、「print」命令と まったく同様に使うことができるようになります。
元の名称は、命令の名前である必要はありません。数値や、記号なども 新規の名称として登録することが可能です。例: #define max 10 a=max mes "A="+a stop上の例では、maxという名称は10という数値を表わすものになっています。
このように、定数として名称を定義しておくことが可能です。一見、変数と 変わりませんが、defineで定義したものは変数メモリを消費しないので、 あとから書き替えることのない定数の定義をするのに便利です。
また、計算式で扱う記号そのものを置き換えることが可能です。例: #define is = #define plus + a is 5 plus 10 print "A="+a stop上の例では、「=」という記号を「is」という言葉に、「+」という記号を 「plus」という言葉にそれぞれ置き換えるように定義しています。
すると、「a is 5 plus 10」という行は、「a=5+10」と同じことになります。 ただし、記号の置き換えは式の演算子のみ行なうことができます。#uselib "filename" 外部DLLの指定 #func 新規名称 関数名 タイプ 外部DLL呼び出し命令登録外部DLL内のプログラムを呼び出すための命令を増やすことができます。 これにより、HSP本体のプログラムから、C言語やDelphiなどで作成した DLL内の関数を呼び出すことが可能になります。
func命令により、外部の関数もHSPの命令として定義できるので、 HSPを自由に機能拡張することが可能です。外部DLL作成の方法や、 HSPとのパラメータ受け渡しの詳細は、インターネット上のONION software ホームページにて別途ファイルをダウンロードすることができるように なっていますので、そちらの付属サンプルプログラムソースなどを 参照してください。
普通に使う場合には、まったく必要のない命令ですので、特に覚えて おかなくても問題ありません。
現バージョンでのシステムリソースの許容範囲は以下の通りです。 この値をオーバーしてしまった場合、正常な動作の保証はできません。
| ソースファイル(.AS)の最大サイズ | 無制限 |
| オブジェクトファイル(.AX)の最大サイズ | 無制限 |
| HSPスクリプトエディタの最大ファイルサイズ | 48000bytes |
| 宣言できるラベルの最大数 | 無制限 |
| 宣言できる変数の最大数 | 1024個 |
| 命令内で使用できる文字列の最大 | 32768文字 |
| 変数に保持できる文字列の最大 | 無制限 |
| 変数に保持できる配列の最大 | 無制限 |
| 1画面内のボタン最大数 | 64個 |
| 表示できるMAG画像の最大サイズ | X方向1024 Y方向無制限 |
| 表示できるJPEG画像の最大サイズ | X方向/Y方向 無制限 |
HSPは中間言語処理によるシングルタスクのインタプリタです。 HSPと他のWindowsアプリケーションはマルチタスクで同時に走らせることが できます。HSPを複数同時に走らせることもできますが、RAM容量の少ない環境 ではおすすめできません。
HSPの中心となる機能は、画面に文字や画像、そして点、線などを描画する ものです。HSP2.0では複数の描画バッファが用意されていて、それぞれに ウインドゥを割り当て、複数のウインドゥ画面を操作することが可能です。
HSPでは描画対象となる仮想的な画面を8個まで持つことができます。 これらの仮想画面は、ウインドゥIDと呼ばれる数値で管理されます。 それらは次のように使うことができます。
| ウインドゥID | 内容 |
| 0 | HSPのメイン画面(スクロール不可) |
| 1 | フルスクリーン時の背景となる画面(通常は使用しない) |
| 2〜7 | 自由に使用できるオプションの画面(スクロール可) |
ウインドゥID0は、最初に現れる画面を指します。2つ以上のウインドゥを 開くことがないのであれば、ウインドゥIDは特に意識せずに使用できます。 ウインドゥID1は、システム側で使用する画面なのでユーザーは自由に使用 できません。
HSPのメイン画面とは別に新しいウインドゥを開いたり、メモリ上に仮想 画面を作成する場合には、ウインドゥID2〜7を使うことになります。
新しい仮想画面は、初期化してから使用しなければなりません。そのための 命令がscreen命令およびbuffer命令です。screen命令で初期化をすると、 その画面は新しいウインドゥとしてディスプレイ上に表示されます。この ウインドゥはサイズを変更することができ、スクロールバーを使ってスク ロールさせることができるので、大きなサイズの画像でも表示可能です。 それに対して、buffer命令で初期化をすると、その画面はメモリ上に存在 するだけとなり、ディスプレイからはその内容は見えません。このような 画面は、ほかの画面に画像の一部をコピーするためのテンポラリとして、 また一時的な画像の保存場所などに使用することができます。
*一度初期化された仮想画面の属性は変更できません。 つまり、screen命令で初期化された画面を消したり、buffer命令でメモリ 上のバッファにすることもできません。
通常画面の基本的な使い方は、まずcls命令で画面をクリアするか、picload 命令で画像を画面に表示して初期化します。その後、メッセージやボタンを 配置します。
メッセージの出力、グラフィックデータのコピー、ボタンの配置などは カレントポジションと呼ばれる座標を対象に行なわれます。
カレントポジションはDOS画面のカーソルのようなもので、メッセージが出力 された後は、カレントポジションも改行した次の行に自動的に移動します。 カレントポジションは、pos命令によって変更することが可能です。また、 objsize命令によって、カレントポジションの移動量を調節することができます。 cls命令などで画面が初期化された時は、カレントポジションも(0,0)にリセ ットされます。
カレントポジョンがどこにあるかは、システム変数のcsrx,csryを参照する ことで得られます。
押しボタン、入力ボックス、メッセージボックス、チェックボックスは、 HSPではオブジェクトと呼ばれ、それぞれにオブジェクトIDという番号が 割り振られ管理されています。このオブジェクトIDは、画面内に配置した 順に自動的に0,1,2,3…とついていくもので、普通は意識する必要はありま せん。オブジェクトIDの把握が必要な時は、オブジェクトの一部を後から 消したい時、オブジェクトの状態を変更したい時などです。
たとえば、押しボタンが押された時には、システム変数に押されたボタン のオブジェクトIDが代入されます。そこで、ボタンの飛び先を同じ場所に しておき、この値を調べて、それに応じた処理を行なうことも可能になり ます。オブジェクトの使い方をマスターすれば、さらに高度なスクリプト を書くことも可能になっていくはずです。
メッセージの出力、点、線、矩形の描画などに使用される色がカレントカラー です。これは、palcolor命令、color命令で変更することができます。
cls命令などで画面が初期化された時は、カレントカラーは黒色にリセットされ ます。
HSPでは、通常の変数や、配列変数が割り当てられるメモリをファイルに セーブしたり、ファイルからロードをするための命令が用意されています。 メモリバッファは、Windowsが許す限りのメモリを扱うことができ、上限は ありません。
基本的なメモリバッファの使い方は、alloc命令で変数の配列としてメモリ バッファを初期化した後、通常の配列変数として内容にアクセスします。
メモリバッファのファイル入出力は、bload命令、bsave命令で行ないます。
HSP2では、WAV形式のPCM音声ファイル、SMF(MID)形式の標準MIDIファイル、 さらにCDの音声トラック部分などを手軽に扱うことができます。
また、MCIコントロールデバイスとして登録されている機器、AVIなどの動画 ファイル再生も可能です。
再生するためのファイルは、sndload命令によってHSPに登録され、snd命令で 再生を開始することができます(再生中断はsndoff命令)。 それぞれのサウンドは、ループ再生、再生終了までのウエイトを選択できます。
ただし、MIDIのループ再生には問題があり完全なループ演奏にはなりません。 WindowsのMIDIシーケンサーが演奏開始まで時間がかかるのと、MIDIデータには 最初に音源を初期化するコードや音色の指定などで時間がかかる場合が多いため 演奏終了から、ループまでがうまくつながらないことが多いからです。
ですから、この機能はあくまで簡易のループということをご了承ください。 そもそもループポインタが指定できないので、前奏まで戻るのも変なんですが、 ゲーム中にBGMが終わってしまうのが寂しいのを避けるためと割り切って使う ことはできるかもしれません。
WAV形式のPCM音声だけは、最初にすべてメモリにロードされてから再生される のでループ再生も問題なく行われます。ただし、再生できるデータのサイズは 1ファイルで最高65535byteまでです。これを超えるサイズのPCMデータは、 mci命令で再生するようにしてください。また、再生できる音声のレートなどは サウンドカードによって違いますが、多くの機種で再生されるようなスクリプト に使用する場合は、「8bit 22KHz モノラル」程度にしておくのがいいでしょう。
グラフィックの描画速度はビデオカードの性能とCPU速度に左右されます。 また、画面の色数モードにも大きく関わってきます。
スプライト制御やMAG画像ファイルのロードなどは256色モードの方が高速 に動作しますし、逆にフルカラーのJPGファイルは256色モードの方が減色 処理のために遅くなってしまいます。
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で使用するRAMの量も増加します。
2.パレットモード
256色以下のカラーモードのこと。
画面上に256色までしか同時に使用できないうえに、すでに Windowsでは20色のスタティックカラーを使っているので、 HSPで自由に使えるのは236色以下になります。
従って、色数の多い画像を同時に表示させると、色がおかし くなったり、元と違う色で表示されることがあります。
HSPでは、パレットモードでもJPEG画像が表示できるように、 自動的に220色のパレットを設定してフルカラーに近い色で表 示されるようになっています。
パレットモードでは、一般的にフルカラーモードよりも描画 速度が速くなり、HSPで使用するRAMの量も少なくて済みます。
以上の点から、フルカラーモードでも、パレットモードでも動作する スクリプトを作る場合には、以下のような注意が必要です。
普段、フルカラーモードでスクリプトが正常に動いていたのに、パレ ットモードに変更したとたんに表示がおかしくなった場合なども、多 くは次のような原因によるものです。
1. 16色、256色の画像を同時に表示しない
パレットモードでは、16,256色の画像をロードした時点で、 それまで表示されていた画像がウインドゥ内に残っていた場合、 色がおかしくなることがあります。JPEG画像はフルカラーな ので問題はありませんが、MAG,BMPファイルを複数のウインドゥ で表示する時には注意しなければなりません。その場合には、 一番手前にあるウインドゥのパレットがすべての画像に適用 されて正確な色が再現されなくなります。
パレットモードでも、複数の画像を同時に正確に表示したい 場合は、すべてのパレットを同じにしておいてください。
2. 8ビットカラーは256色でなく230色までを使用するようにする
パレットモードでは上にあるように、236色以下しか使用でき ません。256色をフルに使っている画像などは、画像の一部が 変な色になってしまう可能性があります。これを避けるため に、最初から230色程度までしか使用しないで画像を作っておく か、ツールなどで減色しておくことをおすすめします。
以上の点に注意してスクリプトやデータを作成すれば、パレットモード でも正常に動作するはずです。どうしても、この制限が回避できない 時は、フルカラーモードのみで動作するスクリプトになってしまいま す。そのような場合は、システム変数gmodeで判断して、フルカラー モード専用を知らせるメッセージを出すように作っておくと、より親切 です。
[一番上に戻る]