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

HSP2.6:HSPPROG:プログラミングの注意点


高速な描画をするには

より高速な処理や、ちらつきのない書き換えを行なう場合には、 redraw命令が 有効です。redraw命令により、描画スイッチを一時的にOFFにしておき(redraw 0)、普通に描画処理を行ない、すべてが終わったところで描画スイッチをONに します(redraw 1)。 これにより、描画中の状態を画面では見えなくし、しかも高速に処理されます 。高速化のためには、何はなくともまずredrawの制御を行なってください。

グラフィックの描画速度はビデオカードの性能と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色程度までしか使用しないで画像を 作っておくか、ツールなどで減色しておくことをおすすめします。

以上の点に注意してスクリプトやデータを作成すれば、パレットモードでも正 常に動作するはずです。どうしても、この制限が回避できない時は、フルカラ ーモードのみで動作するスクリプトになってしまいます。そのような場合は、 システム変数paluseで判断して、フルカラーモード専用を知らせるメッセージ を出すように作っておくと、より親切です。

gcopy命令を使う時の注意点

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.6においてモード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

も使用できます。

Windowsシャットダウン時の動作について

ver2.55から、Windowsシャットダウン時(再起動、電源を落とす等)にも onexit 命令による終了処理が実行されるように変更されました。これにより、スクリ プト実行中にシャットダウンが起こった場合でも、それを検知して適切な終了 処理を行なうことが可能になりましたが、以下のような制限がありますので、 終了時を判定するスクリプトを作成する場合は、留意しておいてください。

  • onexitでジャンプされた直後は、システム変数iparamに終了要因が値とし て保存されています。
    iparam = 0 の場合は、ユーザーの意思でプログラムを終了。
    iparam = 1 の場合は、Windowsシャットダウンによる終了です。
  • Windowsシャットダウン時の終了処理には、await、wait、stop命令などで~ システムにアイドルタイム(待ち時間)を発生させた場合には、シャットダ~ ウン処理を中止します(シャットダウンされません)。 await、wait、stop~ 命令を使わずにend命令で終了した場合には、そのままシャットダウン処理~ が継続されます。

シャットダウン処理を中止させないで、終了処理を行ないたい場合には、待ち 時間の発生する命令(await、wait、stop命令など)は使用できません。 (ただし 、コモンダイアログ(dialog命令)などは使用できます) 最小限の終了処理だけ を行なって、そのまま終了するようにしてください。

メモリストリーム機能について

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」
など)を指定するようにしてください。また、拡張プラグインに渡すファイ
ル名に関しては、メモリストリーム機能は適用されませんので注意してく
ださい。

メモリストリーム機能は、独自形式のアーカイブや暗号形式を用意してその内 容を読み出して画像として展開する場合など、特殊な場面でのみ使われること を想定したものです。

DPMファイルの明示機能について

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からは読み出すこ とが可能になります。

run命令のcmdlineパラメーターについて

ver2.6から、run命令にcmdlineの内容を指定するパラメーター追加されました 。

run "filename","cmdline"[指定したファイルに制御を移す]

"filename" : 実行するHSPオブジェクトファイル名
"cmdline"  : システム変数cmdlineに代入される文字列

別のファイルに書かれたHSPのプログラムを実行します。指定するファイル
はHSPのオブジェクトファイル(拡張子がAX)でなければなりません。オブジ
ェクトファイルは、スクリプトエディタの「オブジェクトファイル作成」
によって作成することができます。

例:

run "MENU2.AX","-s"

が実行されると、いままでのプログラムはなくなり"MENU2.AX" というファ イルのプログラムが最初から実行されます。画面の状態は維持されますが 、変数、メモリバッファの内容はすべて初期化されます。また、「-s」と いう文字列がシステム変数cmdlineに代入された状態で実行が開始されます 。 cmdlineパラメーターが省略された場合は、システム変数cmdlineの内容は空に なります。また、システム変数cmdlineは最大1024文字まで内容が保存されます 。

[TAB]キーによるオブジェクトのフォーカス移動

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]キーで移動することができます。

  p2モード
----
  0 : [TAB]を無効にする(標準)
  1 : [TAB]キーによるオブジェクトのフォーカス移動可能

on〜goto、on〜gosub命令について

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