[Top Page][Edit][Discussion][Edit History][All Pages][Recent Changes][->Japanese]

HSP2.6:hsp2faq


HSP ver2についてのよくある質問(FAQ)

line命令で1ドットだけ線が引かれません

lineの終点のドットは描画されないのが、Windows GDI(描画API)の仕様みたいです。 これは連続した線を描画する時に重ならないようにということだと思われます。 現状では、この仕様に合わせてスクリプトを組んでいただくようお願いします。

EXEファイルやスクリーンセーバーのアイコンを変更できますか

ユーザーが作成した実行ファイルのアイコンは自由に変更して構いません。 詳しくは、EXE,SCRファイルのアイコン書き換えを参照してください。 公開や配布の場合には、アイコンを変更するといいでしょう。 変更せずにカップの絵のアイコンをそのまま使っていただいても、もちろん構いません。

タイトルの文字を変えることはできますか

タイトル(キャプションバー)とは、ウインドゥの一番上にある行、 通常は「Hot Soup Processor ver???」と表示されている部分のことです。 この内容は、title命令を使って簡単に変更できます。 (「title "TEST"」とすれば、「TEST」に変更されます)

数値を16進数で表示することはできますか

数値を文字列に直すためのstr命令を使えば、 16進数の文字列に変換することができます。 詳しくは、str命令のリファレンスを参照してください。

EXEファイルを作るとMIDIがうまく再生されません

HSPのsndload命令で指定されたMIDIファイルは、 Windowsのシステムがファイルを読み込み演奏するため、 packfile編集でEXEファイルにまとめてあっても、読み込むことができません。 MIDIファイルやAVIファイルだけは、EXEファイルを作る場合でも、 packfileでまとめないように心がけて下さい。(mci命令で指定するファイルも同様です)

オブジェクトを配置する部分で一般保護エラーが出る

何度かボタンを押しているとエラーが出る、 clrobj命令でオブジェクトを削除しているにもかかわらず、 オブジェクトを出すとエラーが出るなどの症状が出ることがあります。 この原因は、オブジェクトIDの限界数(64)を越えていまっているためです。 一番多いミスは、button命令やinput命令などのオブジェクトを画面上に配置するための命令が、 何かのボタンが押されるたびに実行されてしまうというものです。オブジェクトを、 前のものとまったく同じ座標に配置してしまうと複数出ているのに気がつきません。 画面上に配置したオブジェクトは、画面をクリアしない限りは残りますので、 最初の1回だけ配置して、後は配置する命令を通らないようにスクリプトを 組むように心がけて下さい。また、clrobj命令によってオブジェクトを画面上から削除した場合は、 その後にオブジェクトを配置した場合、オブジェクトIDは再利用されます。

オブジェクトのフォントを変更することはできますか

button,input,mesbox,combox,listboxなどで配置されるオブジェクトのフォントは、 何も指定しなければデフォルトのフォントが使用されます。 HSP ver2.5以降では、 objmode命令により使用されるフォントを変更することができます。

ボタンに画像を貼り付けることはできますか

標準機能ではサポートしていません。画像をgcopy命令などで画面内に配置しておき、 独自にマウスクリックを検出するようなスクリプト(mousex,mouseyを調べる)を組めば、 擬似的な画像ボタンを作成することはできますが、それなりに大変です。 同機能をサポートしている拡張プラグインなどを利用するのも1つの方法です。

MIDIの演奏をするところで画面が止まってしまいます

MIDIのデバイスドライバによっては、MIDI演奏をストップした直後に、 再びMIDI演奏を開始するとWindowsがフリーズしてしまうものがあるようです。 MIDI演奏終了後に1〜2秒ほどのウエイト(wait 20など)を入れてから、 次の演奏を開始するようにしてみてください。

メニューやツールバーを出すことはできますか

標準の機能ではできませんが、拡張プラグインDLLによって実現可能です。 詳しくは、「HSP拡張プラグインについて」を参照してください。

ディレクトリの指定がうまくできないようです

すみません、ちょっとわかりにくい部分なんですが、 通常ディレクトリの区切り記号に使われる「\」記号ですが、 HSPでは「\」記号は特別な意味に使われていて、そのままでは「\」にならないのです。 かわりに、「\\」とすると、「\」と同じ意味になります。ですから、たとえば

exec "c:\Program Files\Netscape\navigator\netscape.exe"

ではエラーになって動きませんが、

exec "c:\\Program Files\\Netscape\\navigator\\netscape.exe"

とすれば、うまくいくはずです。この「\」記号の使い方は、 他のC言語やJavaなどでも共通なので覚えておいても損はしません(^^)

HSP実行中のウインドゥの動作が何か変です

DOSのBASICをいじっていた人などには、最初はわかりにくいと思いますが、 HSPでは 「キーを押さないと進まないなどの無限にループする可能性のある部分では、 必ずwaitかawait命令を入れる」 というお約束があります。 waitやawait命令はWindowsの他のタスクに空き時間を回すための重要な役割があります。 これを守らないと、無限ループでWindowsのほぼすべてのタスクを奪ってしまい、 マルチタスク動作に影響が出ます。ウインドゥの動作が変というのも、 このあたりが原因だと思います。

mousex,mouseyでカーソル位置が参照できません

上の質問にも関連するのですが、システム変数mousex,mouseyは一度 waitかawait命令を入れないと座標が更新されません。waitやawait命令を 入れないで無限ループを作って、 その中でmousex,mouseyを参照しても値は変わらないわけです。 そのあたりに注意すれば、正確なカーソル位置が参照できるはずです。 以下はそのサンプルです。参考にしてみてください。

*main1
x=mousex : y=mousey
color 255,255,255:boxf 0,0,99,23
color 0,0,0:pos 0,0:mes "X="+x+"/Y="+y
getkey a,1
if a : goto *main2
await 5
goto *main1
*main2
end

MCIコマンドを利用してWAVを繰り返し再生をするにはどのようにすればよいのでしょうか

WAVの繰り返し再生はsndload命令でロードする際にループ指定をすることで可能ですが、 sndload命令は64K(65535byte)を越えるサイズのWAV再生はサポートしていません。 (64Kを越えるオンメモリでのループはWindows自体がサポートしていないみたいです) しかし、MCIコマンドを使うとディスクからファイルを読みながら再生され、 64Kを越えるデータも指定することができます。これで繰り返しをするためには、 ちょっと裏ワザっぽいですが、次のようなスクリプトで可能になります。

button "stop",*owari
mci "open rnse7.wav alias myid"
sndload "",1,1
snd 1
stop
*owari
end

上の例では、"rnse7.wav"というファイルをsndload命令でバッファ1にロードしたことになります。 以降は、snd 1でループ再生させることが可能です。

chgdisp命令で解像度を替えて全画面表示にしてもタスクバーが表示されてしまいます

HSPを使ってフルスクリーン画面に切り替えたソフトを作る場合には、 フルスクリーンモードや screen命令による通常ウインドゥを使わずに、 bgscr命令で新しいウインドゥを全画面に表示するといいでしょう。 タスクバーを消すためにはちょっとコツがいります。chgdisp命令を使うと、 全画面の再描画が行なわれてタスクバーも描かれてしまいます。 そこで、chgdisp命令の後にbgscr命令で全画面サイズのウインドゥを作成します。 bgscr命令は、枠やタイトルバーが一切ないウインドゥを作成し、 すべてのウインドゥよりも手前に表示します。これでタスクバーも隠れるはずです。

chgdisp 1
bgscr 2,640,480,0
cls 4
color 255,255,255
mes "TEST SCREEN..."
mes "[ALT]+[F4]で終了します"
stop

上の例では、ウインドゥID2としてフルスクリーンのウインドゥを表示します。

スクリプトエディタの「DPM作成」とは何ですか

これはマニュアルでは説明し忘れていました(^^;) DPMは、packfile編集で指定したファイルを1つにまとめたファイルです。 「DPM作成」をすると、DATA.DPMというファイルが作成されます。 このDATA.DPMには、packfileで指定したファイルすべての情報が含まれています。 これをHSP2.EXEと同じディレクトリに置いておくことで、 HSPからDATA.DPMに含まれるファイルを使用できるようになります。たとえば、 packfileで"test.jpg"というファイルを指定してDATA.DPMを作成したとします。 これで、もしHSPと同じディレクトリに"test.jpg"が存在しなくても、 DATA.DPMさえあればそこに含まれている"test.jpg"の情報をHSPが 自動的に取り出してくれるようになるのです。 なお、DPMファイルは「EXEファイル作成」をした時にも自動的に作成されてしまいますが、 これはEXEファイルに含めるための中間ファイルなので削除しても問題ありません。

gcopyでのコピーモードが正常に設定されません

すみません、HSPのグラフィックモード設定関係はちょっと間違えやすい仕様になっています。 gmodeでのモード設定は現在、描画対象になっているウインドゥIDに設定されます。 たとえば、ID2からID0に画像をコピーしたい場合には、gcopy命令をID0に対して実行するので、 ID0に対してgmodeの設定をしなければなりません。つまり、 ウインドゥIDごとにgmodeの設定が保持されているのです。 このあたりに注意してgmode命令を記述すれば、正常にモードが設定されるはずです。

実行するとInvalid versionというエラーが出てしまいます

これは、HSP2.EXE本体とHSED2.EXE(スクリプトエディタ)のバージョンが 合っていない時に発生します。ダウンロードしたHSP本体と、 スクリプトエディタのバージョンをそろえればエラーは出なくなると思われます。 また、作成したEXEファイルやスクリーンセーバーを実行した時に、 このエラーが出る場合は、「start.ax」などのオブジェクトファイルが 古いことを示しています。新しいバージョンのスクリプトエディタで、 もう一度オブジェクトを作成すればエラーはなくなります。

ディレクトリの中にあるファイル名一覧を調べる方法はありますか

これは、HSP ver2.4からサポートされたdirlist命令で可能です。 詳しくは、リファレンスマニュアルを参照してください。

関連付けされたファイルを指定して実行させることはできますか

これは、HSP ver2.4からexec命令のオプションで可能になりました。 詳しくは、リファレンスマニュアルを参照してください。

EXE(SCR)を作成したが、エラーが出る

これには、いくつか可能性があります。まず、EXE(SCR)ファイルを作成するためには、 「PACKFILE編集」メニューを選んで、まとめあげるデータファイルを指定しなければなりませんが、 必要なファイルの選択を忘れた場合にFile Not Found(エラー13)が出ます。 また、「start.ax」というファイルがpackfile編集で選択されていないと、 実行できなくなります。まれに、packfile編集で指定したファイル名が おかしくなることがあるようなので、一度「全削除」をして、 もう一度すべてのファイルを選択してから、 実行ファイルを作成するとうまくいくことがあります。

実数(小数)が使えるようにはならないのでしょうか

小数が扱えるようにという希望は、いくつか寄せられています。 すぐには対応が難しいと思いますが、いずれ考えていきたいと思っています。 とりあえず、現在の整数のままで小数に近いことを行なう強引な方法がいくつかあります。 まず、%の計算などをする場合。たとえば、123という数の30%を算出する場合は、

123(もとの数) * 30(%数) / 100

という計算式で求められます。最初に%の数値を掛けてやるのがポイントです。 (123 /100*30 では、100で割る時点で小数がないので誤差が出てしまいます) また、ここで小数点以下の値を出したい場合は、

123(もとの数) * 30(%数) / 10

とすれば、下1桁が小数点以下1位、その上の桁が整数部となります。 このように、整数のある桁から下を、小数部として考える方法は、 固定小数点演算と呼ばれていて、整数でありながら1よりも 細かい単位として考えることができます。たとえば、 1000という数値の下3桁を小数部として考えれば、 1000は、1.000となり、0.000〜xxxxxxx.999までの実数として扱うこともできます。 これをHSPで表示するには、

a=1234    ; 固定小数点で1.234とする
b=a/1000  ; 整数部 取り出す
c=a\1000  ; 小数部を取り出す
print "a="+b+"."+c  ; 小数点をつけて表示する

のようにするといいでしょう。これは1つの例で、 他にも下数bitだけを小数部とする方法など色々ありますが、基本的な考え方は同じです。

ver2.55では、スクリプト中に小数を記述して拡張プラグインに値を 渡すことが可能になっています。この機能を利用したhgimg.dllプラグインでは、 小数値をサポートする命令がいくつか用意されています。

HSPについてのよくある質問(昔のもの) これ以降は、ver2.2以前にあった質問の中で、ver2.2でもあてはまるものを選んで掲載しています。

HSPって何?

HSP( Hot Soup Processor )は、Windows用のソフトを作成することができる インタプリタ言語システムです。BASICに似た簡単な命令セットを覚えるだけで、 グラフィックやサウンドを手軽に扱ったソフトを作ることができます。

HSPでどんなことができるの?

CG集や、音楽集、アプリケーション起動メニューなどの単純なものから、 アドベンチャーゲームやパズルゲームなどの本格的なアプリケーションまで。 また、画面レイアウトの試作や、画像データの変換、文化祭、学園祭の展示、 店頭のデモなどアイデア次第で応用範囲がどんどん広がります。

どんな機種で動作するの?

Microsoft Windows 95(または、NT3.51以上)が動作する機種ならば、 どれでも動作させることができます。 HSPで作成したソフトならば、 PC98、AT機を問わず多くの機種で使用できます。また特殊なドライバや、 WinG、DirectXなどのランタイムなども一切必要なく単体で動作させることができるので、 インストールの煩わしさがありません。

なぜインタプリタなの?

インタプリタ方式なので、変更、作成したものをすぐに実行して見ることができます。 速度の遅い機種でもコンパイルなどの時間を待たされることなく効率的な開発ができます。 またHSPは、中間コードを使用して高速に命令を実行するので、通常は処理速度を気にする心配もありません。

自由に使ってかまわないの?

HSPはフリーウエアです。HSPを使うのも、HSPを使って作成したソフトを発表するのも、 販売するのもすべて作成者の自由です。HSPを使うためのコストは一切かかりません。 これは、多くの人にWindowsで自由にプログラムを組む環境を提供したいのと、 自由なかわりにサポートや保証などはないので各人の責任で使用してほしいという2つの理由からです。

HSPを使う利点は?

HSPは、C++やVisualBasic、Delphiなどでプログラムを作るよりも手軽に、 グラフィック画像の表示、音の再生、他のアプリケーションとの連携を行なうことができます。 また、Windowsでは複雑になりがちな手続きを覚えることなくDOSのような感覚でソフトを作成できます。 逆に、大規模なアプリケーションや、高度な数値演算、非常に高速な処理を要求されるソフトにはHSPは向いていません。

HSPでCDや動画は扱うことができますか?

Windowsには、MCIというサービスが用意されており、 MCIに対応したマルチメディア機器をコントロールすることができるようになっています。 HSPでは、このMCIにコマンドを送る命令が用意されているので、 MCIに対応した機器であれば簡単に扱うことができます。 通常のCD-ROM付きのマシンであれば、CDトラックの演奏、停止、動画の再生、 MIDIデータの演奏などはMCIで扱うことができるはずです。 (HSP2.2以降では、より簡単にCD,MIDIの演奏が可能になっています)

Javaとは違うの?

Javaも、HSPと同じく中間言語を用いたインタプリタで、 フリーに使うことができる言語です。 HSPと比べると、Javaの方が機能も高く、 拡張性にも優れています。もし、Javaがどのマシンでも同じように動作し、 手軽に扱うことができればHSPはもう必要ないかもしれません。 しかし、現時点ではJavaで作成したソフト(アプレット)を動作させるには インタプリタのランタイムをインストールしなければならなかったり、 互換性に難があったりと、手軽に使ったり配布することができるのはまだ先といった感じです。

VisualBasicとは違うの?

HSPはVBなどとは違って単純で原始的なシステムです。しかし、 その単純さゆえに手軽で思ったことがすぐに実現できます。 VBは非常に高度なソフトやシステムを構築することも可能ですが、 多少手続きや設定も面倒になっています。しかし、CG集やメニューなど、 それほど高度でないソフトを作成する時にも同じように手続きや設定が必要になってしまいます。 HSPはそんな時に、小回りをきかせ、VBよりも手軽に早くソフトの作成することができます。