More ... | 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の仕様があることを覚えておいてください。
以上の点から、フルカラーモードでも、パレットモードでも動作するスクリプ トを作る場合には、以下のような注意が必要です。 普段、フルカラーモードでスクリプトが正常に動いていたのに、パレットモー ドに変更したとたんに表示がおかしくなった場合なども、多くは次のような原 因によるものです。
以上の点に注意してスクリプトやデータを作成すれば、パレットモードでも正 常に動作するはずです。どうしても、この制限が回避できない時は、フルカラ ーモードのみで動作するスクリプトになってしまいます。そのような場合は、 システム変数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で使用されるモードおよび、サイズ、ブレンド率などを設定します。それ ぞれのコピーモード動作は以下の通りです。
これらのモードは、gzoom命令では使用されません。あくまでもgcopy命令使用 時なので注意してください。また、gmodeは現在gsel命令で選択されているウイ ンドゥID のモードが変更されます。gmodeの設定後に、別なウインドゥIDで gcopy命令を実行しても設定が反映されないので注意してください。 小数値の記述についてスクリプト中にパラメータとして小数値を記述することができます。ただし、 これは実数を完全にサポートしているということではありません。小数値を 32bitまたは64bitのバイナリデータとして扱い、プラグインやAPIにデータを受 け渡すことを可能にするものです。 HSPでの完全な実数サポートは、多くの方 からご要望を頂いていて、実現したいことの1つですが、実行速度をあまり損な わずにサポートするためには、システムの大幅な改修が必要なため、それまで は拡張プラグイン側での小数サポートを可能にする措置として取り急ぎ実装し たものとお考え下さい。 スクリプトに記述可能な値として以下の型が用意されています。
記述した数値の最後に「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命 令で停止している時にのみ割り込みを受け付けてジャンプを行います。また、 割り込みによりジャンプを行なった後は以下のシステム変数がセットされます 。
||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 命令による終了処理が実行されるように変更されました。これにより、スクリ プト実行中にシャットダウンが起こった場合でも、それを検知して適切な終了 処理を行なうことが可能になりましたが、以下のような制限がありますので、 終了時を判定するスクリプトを作成する場合は、留意しておいてください。
シャットダウン処理を中止させないで、終了処理を行ないたい場合には、待ち 時間の発生する命令(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が読み出すファイル検索の順序は以下の通りです。
これにより、複数の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
|