HSP自分FAQ
HSPに関して、自分で解らなかった事などを、FAQ形式でお送りする、二の轍を踏まないための杖。
書いている時点では正しいと思った情報も、後々間違っている事実に気が付くかもしれない。
あと入門者コーナーとかではないので、質問内容が偏っている。
トップメニュー
Q.01 HSPで簡単にWindowsプログラムが組めると聞いたのですが、どこに行けば手には入りますか?お金はかかりますか?それを使って第2のビルゲイツを気取りたいのですが手数料や許可などは必要ですか?
A "ONION software"で無料配布されています。タダです。商用目的にも無断で使用できます。がんばってビルを目指して訴えられてください。
Q.02 どんなソフトなんですか?
A インタプリタ言語です。故に、動作に多少のオーバーヘッドがあります。どうしようもないので諦めてください。そういえば、BASICに似ていなくもないです。
Q.03 とりあえずムフフなグラフィックを表示したいのですが、どうしたらいいですか?
A 「picload」命令を使います。「picload "sample.bmp"」のように使います。この命令でビットマップ以外も表示できます。
Q.04 無事表示できました。そこでさらに局部を表示したいのですがどうすればいいですか?
A 「buffer」命令で仮想画面を確保し、「picload」命令で読み込んだ後、仮想画面から表示画面に領域を指定してコピーします。
詳しくは以下のソースを参照。各命令についてはHSP付属のオンラインマニュアルを見てください。
; 仮想画面2に画像を読み込み、仮想画面の(32,64)の位置から(128,96)のサイズを表示画面(16,24)の位置へ表示する
buffer 2,0,0
picload "sample.bmp",0,640,480
gmode 0,128,96
gsel 0
pos 16,24
gcopy 2,32,64,128,96
stop
「gmode」命令は、いらないかもしれません。
Q.05 ゲームのメインループみたいなものを作りたいのですが、タイマなどのタイミングはどうすればいいですか?
A 「await」という命令を使います。これは「前回のawaitから指定した時間が経過するまで待つ」という、まさにゲーム向きの命令です。「await 16」といった感じで使います。値は"1"で1msです。
Q.06 アニメーションらしきことをやってみました。重いです。誰が悪いんですか?
A 知りません。HSPが悪いかもしれませんし、あなたのマシンが悪いかもしれませんし、Windowsが悪いかもしれませんし、そもそもあなたのプログラム(つまりあなた)が悪いのかもしれません。
とりあえず、「await」命令の前に「redraw 1」を、「await」命令の後に「redraw 0」を入れてみて実行してみてください。これで改善されないなら、少なくともHSPのせいではない筈です。
Q.07 「ALT+F4」で終わるのがウザイので、「ESCキー」なんか押してみてスマートに終わらせたいのですが?
A 「getkey」命令を使ってキー情報を取得して、「if」条件分岐命令で処理を分岐させます。詳しくは以下のソースを参照。
; 「ESCキー」で処理を終了(key_retは状態取得用変数/27はESCキーコード)
*main_loop
redraw 1
await 16
redraw 0
getkey key_ret,27
if key_ret = 1: goto *exit
goto *main_loop
*exit
end
Q.08 グラフィックに関してはバッチグーなので、マルチメディアにサウンドなんか鳴らしてみたいのですが、音はどんなものが鳴らせますか?あとこれってITでニューメディアなeビジネスですか?
A HSPのマルチメディア命令は簡単でサポート形式も多彩です。標準でサポートしている形式は「WAV/MIDI/AVI/CD-DA」です。これらはすべて「mci」命令で再生可能です。例えば単にMIDIファイルを再生したいだけなのであれば「mci "play sample.mid"」だけで再生可能です。
あと「ITでニューメディア」に関してですが、訳が解らないうえに時代的にも合ってないので答えられません。
Q.09 MIDIを再生させました。一回しか再生されません。ループさせたいのですが?
A 現時点(2000/10/1現在)で自分が使用している方法は、「曲の長さと再生位置を比較し、同じになったら再生位置を最初に戻す」という方法です。そうするために、「MIDIファイルを開いてから再生する」という方法をに変更しています。また、MIDIファイルを開くときに「エイリアス名」というそのファイルの識別子を定義します。
ソースにすると、以下のようになります。
; MIDIのループ再生("bgm"はエイリアス名/"bgm_len"は曲の長さ/"bgm_pos"は再生位置/"stat"は命令実行後に結果が返ってくるシステム変数)
mci "open sample.mid alias bgm"
mci "status bgm length"
bgm_len = stat
*midi_loop
await 16
mci "status bgm position"
bgm_pos = stat
if bgm_len != bgm_pos: goto *midi_loop
mci "seek bgm to start"
mci "play bgm"
goto midi_loop
Q.10 画面全体ではなく一部分だけクリアしたいのですが、何か良い方法はありますか?
A 「boxf」命令を使います。使う前に「color」命令を使って色を決める必要があります。「color」命令で設定した色で埋め尽くすのが「boxf」命令です。
「boxf」命令は「boxf 開始位置X,開始位置Y,サイズX,サイズY」のように使い、「color」命令は「color r値,b値,g値」のように使います。
ところで、どこが「グラフィック関係はバッチグー」ですか?