[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSP2.6:HSPPROG:HSPの基本動作概念


HSPのタスク

HSPは中間言語処理によるシングルタスクのインタプリタです。 HSPと他の Windowsアプリケーションはマルチタスクで同時に走らせることができます。 (HSP2.EXEを複数同時に走らせることもできますが、RAM容量の少ない環境では おすすめできません)

ただし、そのために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 内容
HSPのメイン画面(スクロール不可)
フルスクリーン時の背景となる画面(通常は使用しない)
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動画ファイルなどを手軽に扱うことができます。

また、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命令は、主にテキストファイルをバッファに読み込むための機能で、 指定されたファイルサイズに従ってバッファの確保を自動的に行ないます。 バッファ自動増加機能は、単純な変数にのみ適用されます。文字列型の配列変 数では、再確保は行なわれませんので注意してください。