More ... | HSP2.61:hspdx
HSPDX.DLL ver2.61 REFERENCE MANUAL HSP : Hot Soup Processor はじめにこのDLLは、Hot Soup Processor ver2.5以降とともに使用することで、様々な 機能拡張を行なうことのできるプラグインモジュールです。 この拡張DLLを使用することにより、新規命令が多数追加され、DirectXを使用した ハイレベルなソフトを開発することが可能になります。 HSPDX.DLLを使用するためには、Microsoft DirectX3以降(DirectX5を推奨)が インストールされている必要があります(Windows98には標準搭載されています)。 また、WindowsNT4.0でも動作を確認しています。 インストール拡張プラグインのファイル、HSPDX.DLLは、HSED2.EXEおよび、HSP2.EXEのある ディレクトリと同じ場所に置いてください。 (実行に使われているHSP2.EXEと同じディレクトリに、HSPDX.DLLがない場合は エラーになります) また、スクリプトを作成する場合には、HSPDX.ASをスクリプトと同じディレクトリ に置き、スクリプトの先頭に必ず「#include "hspdx.as"」という行を追加 してください。以上で、HSPの機能が拡張され、このリファレンスで説明を している命令を使用することができるようになります。 まず最初に、試しに付属のサンプルスクリプトを実行してみてください。 拡張された機能の簡単な使用例を見ることができるはずです。 注意点HSPDX.DLLは、HSP2.EXEと同時に使用されるプラグインファイルです。 EXEファイルを作成した場合でも、HSPDX.DLLをEXEファイルと同じディレクトリ に置かないと動作しません。また、packfileにDLLを追加することはできません。 著作権および連絡先HSPDX.DLLの著作権は、おにたま(onion software)とSinagawaにあります。 使用の規定についてはHot Soup Processor ver2.55と同様です。 HSPによって作成したEXEファイルと同様にHSPDX.DLLを自由に配布してかまいません。 onion software/Sinagawaは本プログラムによって生じた、いかなる損害についても 保証いたしません。自己の責任の範囲で使用してください。 更新履歴ver2.55同梱版より、hspdx.dllは、Sinagawaさんが追加修正を行なっている hspdxfix.dll(ver0.12)と同等のものを収録しています。 このバージョンについてのご意見や感想などは、onion softwareではなく、 Sinagawaさんにフィードバックされるようお願いします。 Sinagawa soft laboratory URL ->http://www.diveto.net/zero/ 更新履歴・bugfix情報?
また、以下の点について仕様変更を行っています。
また、コンパイルオプションの見直しでファイルサイズが小さくなりま した。
また、以下の点について仕様変更を行っています。
・エラーが出た際にデバッグウィンドウが奥に隠れて表示されないバグ の修正 ・es_syncのウェイトルーチンを修正。 ウェイトが安定すると思います。 以下の命令を追加しました。 ・es_timer p1 →Windowsを起動してからの経過時間をミリ秒単位で返します。 ・es_getfps p1 →p1に秒間のフレーム数を返します。 いちいち他のDLL使ったりルーチン組むのが面倒なので作っただけで す。 ○Ver 0.05 2001/02/20 ・es_palsetでp1に0〜255の範囲外を入れると強制終了するバグの修正 ・es_syncのウェイトルーチンをさらに修正 ・ウィンドウモードをサポート(ただし一部制限あり) ○Ver 0.06 2001/02/24 ・es_syncでフルスクリーンでもvsyncを待たないようにできるように した ・ウィンドウモードでフェードイン/アウトすると色が化けるバグの 修正 ・es_aimでstatに角度が返るようにした (以前からそうでしたが、書 き忘れていました) ・ウィンドウモードでウィンドウのサイズにあわせて画面を拡大縮小 するようにした ○Ver 0.07 2001/03/01 ・純正HSPDXとの互換性のためにes_syncのウェイトの仕様を逆にした (単純なウェイトをとる方式がデフォルトとなっています) ・es_ang命令を追加した(たかのんさんより要望を頂きました) ○Ver 0.08 2001/03/06 ・es_angで返す角度が逆になっていたバグの修正 ・オフスクリーンバッファを最大64個まで取得できるようにした (Takaさんより要望を頂きました) ○Ver 0.09 2001/05/04 ・es_angとes_aimで角度の検出範囲を変更 (たかのんさんより要望を頂きました) ・デスクトップの色数が16bit以上でウィンドウモード時にes_getbuf を実行すると正しく表示されないバグの修正 ・↑により、HSP側のバッファはフルカラーでも可、 バッファサイズ はDirectX側と違っても正常に動作するようになりました ・es_buffer実行時、デスクトップの色数が16bit以上の場合は画像を BitBltでバッファに転送するように変更 (ウィンドウモード時に色化けする可能性があったのを回避するため の修正です) ・↑に伴い、以前のバージョンに添付していたCOLTEST.ASはアーカイ ブから外しました ○Ver 0.10 2001/05/09 ・一部のパレットがフェードイン/アウトできなかったバグの修正 ○Ver 0.11 2001/06/14 ・一部の環境でフルスクリーン時にフェードイン/アウトができなか ったバグの修正 ・ハイカラー、フルカラーに対応 (まだ十分に動作確認していません) ○Ver 0.12 2001/06/15 ・24bitが指定できなかったバグの修正 現在わかっている、このプラグインの問題? ・es_bye実行後、stopがきかなくなる。 HSPDX.DLLの概要HSPDX.DLLは、DirectXを使ったアプリケーションをHSPから作成するための拡張 プラグインです。DirectXは、Microsoftが配布している高速な画面書き換えの ためのモジュール(Windows98には標準搭載)です。HSPDX.DLLを使用する場合には、 DirectXが必ずインストールされている必要があります。 HSPDX.DLLで追加される主な機能は以下の通りです。 ・画面モード、解像度の変更 ・DirectXのサポート状況を知る機能 ・高速な画像の転送、透明色を含む転送など ・キャラクターパターンの登録とアニメーション機能 ・スプライトの表示、移動の管理および衝突判定機能 ・垂直帰線単位でのウェイトと処理の負荷検出機能 ・256色をフルコントール可能なパレット機能 ・オートフェードイン、フェードアウト機能 DirectXを使うと有利な点DirectXは、Mircosoftが配布している高速な画面描画のためのコンポーネント です。これは、それぞれのビデオカードごとにドライバを用意することにより、 直接ビデオカード上のハードウエアを介して画面描画を行なうことを可能に するものです。 DirectXでは、通常のウインドゥ描画の時に比べていくつか有利な点があります。 その1つは、フルスクリーンで動作させることで、動作速度が安定するのと、 アニメーションのちらつきがなくなることです。 DirectXのフルスクリーンモードになると、画面やパレットをすべて自由に 使えるだけでなく、垂直帰線(V-BLANK)中に画面を書き換えることができるので、 非常にスムーズな動きをさせることができます。 DirectXを使用した市販ソフトなどが、スムーズに動いて見えるのは、この効果 によるものです。HSPDX.DLLを使用した場合も、この点を十分に生かしたソフト を作成することができます。 逆に言えば、フルスクリーンモードを使わない限りは、これらの恩恵には預かれ ません。ウインドゥモードでは、制約も多く、使える機能も制限されてしまうので 少なくとも画面描画に関しては、DirectXを使う利点はほとんどありません。 命令一覧es_ini p1,p2 システムの初期化 es_screen p1,p2,p3,p4 画面モードの変更 es_bye システム解放 es_sync p1,p2 画面更新とウェイト es_caps p1,p2,p3,p4 DirectXシステム情報取得 es_palfade p1,p2 パレットフェード es_palset p1,p2,p3,p4 パレット変更 es_boxf p1,p2,p3,p4 矩形塗りつぶし es_fill p1,p2,p3 矩形塗りつぶし es_copy p1,p2,p3 画像コピー es_zoom p1,p2,p3 拡大縮小画像コピー es_xfer p1,p2,p3,p4 バッファ間画像コピー es_fmes "str" フォント指定文字列表示 es_mes "str" 文字列表示 es_cls p1,p2,p3 画面クリア es_put p1,p2,p3,p4 キャラクタ画面表示 es_draw p1,p2 スプライト描画 es_window p1,p2,p3,p4 スプライト表示エリア設定 es_area p1,p2,p3,p4 スプライト有効エリア設定 es_opt p1 システムオプション設定 es_buffer p1,p2,p3 VRAMイメージ転送 es_getbuf p1 VRAMイメージ読み出し es_size p1,p2,p3 キャラクタサイズ指定 es_pat p1,p2,p3,p4 キャラクタ画像定義 es_link p1,p2 アニメーション設定 es_release p1 スクリーンバッファ削除 es_set p1,p2,p3,p4 スプライト設定 es_new p1,p2 新規スプライト取得 es_get p1,p2,p3 スプライト情報取得 es_find p1,p2,p3 スプライト検索 es_check p1,p2,p3 衝突判定取得 es_offset p1,p2 オフセット座標設定 es_flag p1,p2 flag値設定 es_chr p1,p2 chr値設定 es_type p1,p2 type値設定 es_kill p1 スプライト削除 es_clear p1,p2 複数スプライト削除 es_pos p1,p2,p3 スプライト座標設定 es_apos p1,p2,p3 スプライト移動設定 es_adir p1,p2,p3 スプライト移動方向設定 es_aim p1,p2,p3,p4 スプライト参照座標設定 es_timer p1 タイマー取得 es_getfps p1 FPS取得 es_ang p1,p2,p3,p4 角度取得 初期化と終了の方法HSPDX.DLLでは、初期化を以下の手順に従って行なって下さい。 以下のスクリプトでDirectXを初期化して、画面モードを変更します。 もし、初期化でエラーが起こった場合は、ダイアログが表示され終了します。 正常に初期化が終了すると、「*start」というラベルにジャンプします。 ;------------------------------------------------------------------ wx=640:wy=480 ; 画面の解像度の指定 es_ini ; system初期化 es_screen wx,wy,8 ; スクリーン初期化 if stat=1 : goto *dderr1 if stat=2 : goto *dderr2 goto *start ; 正常に完了 *dderr1 dialog "DirectXの初期化に失敗しました",1 end *dderr2 dialog "スクリーンの初期化に失敗しました",1 end ;------------------------------------------------------------------ *start gsel 0 es_cls es_sync wait 100 ;------------------------------------------------------------------ ; ここから先に描画スクリプトを書いてください ;------------------------------------------------------------------ この「*start」以降に、描画などの命令を実行させてください。 一度フルスクリーンモードでDirectXの初期化を行うと、[Ctrl]+[Alt]+ [Del]キーによる中断はできなくなります。 ですから、決して無限ループなどは作らずに、何かのキーを押したら 終了するなどの抜け道を用意して、必ず終了できるようにしておいて ください。「stop命令」などのずっと停止するような命令を入れた場合は、 中断できなくなり、Windowsに戻ることができなくなるので注意してください。 通常のウインドゥモードに戻るには、DirectXのシステムを終了させる命令、 es_bye を使用します。ただし、この命令を入れなくてもHSPのクリーンアップ関数指定 により、スクリプトの実行が終了した時点(end命令か、エラーが発生した場合) で自動的にウインドゥモードに復帰するようになっています。 dialog命令を始めとするWindowsシステムを使った命令は、DirectXの使用中は 機能しません。ウインドゥに描画する命令も使用できません。あくまで、 HSPDX.DLLでサポートしている描画命令しか使用できなくなります。 描画の方法HSPDX.DLLを使用する場合、画面の描画方法が通常とは異なります。 描画のメインループでは、以下のような手順で画面描画を行なって下さい。 1. 画面全体をクリアする(es_cls命令) 2. 描画を行なう(es_copy命令、es_draw命令など) 3. es_sync命令で画面の更新を行なう 4. 「await 0」を入れる 通常は、描画命令が実行されれば画面が変化しますが、HSPDX.DLLでは上の ような手順が必要です。ちょうど、redraw命令で画面の更新スイッチをOFFに しているような状態とも考えられます。 画面の更新は、描画がすべて終わった時点でes_sync命令を実行して初めて 行なわれます。そして、es_sync命令の後にはawait 0を入れてWindowsに タスクを戻してください。この処理はすぐに終了するので全体の速度に影響は 与えません。 画面上の表示を動かす場合には、上の1〜4までのプロセスを1回として、 1フレームごとに繰り返してください。つまり、毎回必ず画面をすべて書き直す ということです。 画面をクリアして、すべての物体を描画し直していたら非常に時間がかかると 思う方もいるかもしれません。DirectXでは、これらの処理をビデオカード上の ハードウェアで行なわせているために、非常に高速に処理されます(これは もちろんビデオカードにより性能が変わってきます)。ですから、通常のウイン ドゥ内の描画とは比べ物にならないほど一瞬で描画が終了します。 画面への描画は、それぞれの命令で行ないますがすぐには反映されません。 これは、バックバッファと呼ばれる見えない部分に描画を行なっているためで、 sync命令を実行して始めて画面が一気に切り替わります。これにより、 ちらつきのないスムーズな画面書き換えが可能になるのです。 画面に描画が可能な命令は、es_cls, es_copy, es_zoom, es_fmes, es_mes, es_draw, es_boxf, es_putのみです。HSPで通常使用する画面描画命令は 使用できませんので注意してください。ただし、buffer命令で作成した仮想 画面には通常通り描画や画像ファイルのロードが可能です。ウインドゥに 対しての描画ができなくなるということです。 画面に直接描画が可能な命令には、以下のようなものがあります。 es_cls p1,p2,p3 画面クリア p1=画面クリア時のR値 p2=画面クリア時のG値 p3=画面クリア時のB値 この命令は、画面全体を指定した色でクリアします。 p1,p2,p3でクリアする色をRGBコードで指定可能です。 パレットモードでは、指定したRGBに最も近い色を持つパレットでクリアされます。 p1,p2,p3の指定を省略すると、黒でクリアします。 es_boxf p1,p2,p3,p4 矩形塗りつぶし p1=塗りつぶし左上X座標 p2=塗りつぶし左上Y座標 p3=塗りつぶし右下X座標 p4=塗りつぶし右下Y座標 (p1,p2)-(p3,p4)の矩形範囲を現在選択されている色で塗りつぶします。 色の選択は、color命令で行ないます。 es_fmes "str" フォント指定文字列表示 "str"=表示文字列 カレントポジション(pos命令で指定されたX,Y座標)から、指定した文字列を 表示します。文字の色は、現在選択されている色(color命令で指定)になり、 フォントはfont命令で選択されているものが使用されます。 es_mes "str" 文字列表示 "str"=表示文字列 カレントポジション(pos命令で指定されたX,Y座標)から、指定した文字列を 表示します。 es_fmes命令と似ていますが、文字の色やフォントが選べないかわりに、 こちらの方が高速に処理されます。 文字の色は、常に白(RGB=255)となり、標準フォントが使用されます。 画像コピーの方法HSPDX.DLLでは、画面に高速に画像を表示(コピー)することができる点が最も 重要な要素です。この処理は、DirectXによりそのビデオカードで最も高速な 方法でコピーを行ないます。通常、HSPではメインウインドゥに画像をコピー してくる場合には、そのコピー元の画像を保存しておくために仮想画面という ものを用意していました。HSPDX.DLLでも、基本的に画面とは別に仮想画面 (オフスクリーンバッファ)を用意して、そこからメインの画面に画像をコピー することになります。 以下にその手順を示します。 1. buffer命令で仮想画面を確保して、そこにコピー元の画像を描画もしくは ロードする。 2. es_buffer命令で、HSPの仮想画面の内容をDirectXのオフスクリーンバッ ファに転送する。(この時、パレットも転送される) 3. 以降は、es_copy、es_zoom命令でオフスクリーンバッファから画像をコピー してくることが可能。 HSPが確保している仮想画面と、DirectXのオフスクリーンバッファは別のもの です。HSPDX.DLLでは、HSPの仮想画面に一旦画像を作成しておき、それを オフスクリーンバッファに転送してから使用することになります。 オフスクリーンバッファは、0〜63までのID番号で管理されます。 (HSPのウインドゥIDとは別のものです) たとえば、 buffer 3,640,480,1 picload "test.bmp" es_buffer 0 のようなスクリプトは、HSPの仮想画面ID3に「test.bmp」という画像を読み 込んだ後、DirectXのオフスクリーンバッファID0にその内容を転送しています。 オフスクリーンバッファに画像を転送して初めて、実際の画面への画像の転送 が可能になります。オフスクリーンバッファとは、DirectXが管理している画像 メモリのことで、これには2つの種類があります。1つは、ビデオカード上のメモリ 空間で通常VRAMと呼ばれます。もう1つは、通常のコンピュータ上のメモリ空間 です。画像の転送では、オフスクリーンバッファがビデオカード上のメモリ空間 にあった方が速度が速く有利です。しかし、ビデオカード上のメモリは空間が 限られています。ビデオカードには、多いものだと64MByteのメモリが搭載 されていますが、少ないものでは1Mbyte程度しか搭載されていません。 つまり、Windowsが動いている動作環境によって使用できるVRAMの量が違って くるということです。 DirectXを使ってたくさんの画像を転送しようとしている人は、この制限に注意 して、なるべく多くの環境で動作するように工夫することが大切です。 オフスクリーンバッファに画像を転送するes_buffer命令では、オフスクリーン バッファをVRAMに取るか、メインメモリに取るかを選ぶことが可能です。 es_buffer p1,p2,p3 VRAMイメージ転送 p1=オフスクリーンバッファID(0〜9) p2=属性スイッチ(0〜2) p3=透明色 属性スイッチ=0 : オフスクリーンバッファをVRAMに取る、 失敗した場合は、メインメモリに取る 属性スイッチ=1 : オフスクリーンバッファをメインメモリに取る 属性スイッチ=2 : オフスクリーンバッファをVRAMに取る 2番目のパラメータの属性スイッチが、オフスクリーンバッファをどこに取るか を指定するスイッチです。通常は、0が指定されVRAMにオフスクリーンバッファ が取れなかった場合には、メインメモリに取るという方法が取られています。 実際の画像コピーは、es_copyおよびes_zoom命令で行ないます。 es_copy命令は等倍の画像コピー、es_zoomは拡大縮小などの変倍が可能な画像 コピーです。これらの命令を使用する場合には、あらかじめpos命令とgmode命令 でコピーする座標と、画像のサイズを設定しておく必要があります。 pos p1,p2 p1=コピー先X座標 p2=コピー先Y座標 gmode p1,p2,p3 p1=コピーモード ( 0=不透明 / 1〜2=透明 ) p2=コピーされるXサイズ p3=コピーされるYサイズ es_copy p1,p2,p3 p1=オフスクリーンバッファID(0〜63) p2=コピー元X座標 p3=コピー元Y座標 es_copy命令では、pos命令で指定した座標に、gmodeで指定したサイズとモードで p1で指定したIDの(p2,p3)の座標から画像がコピーされます。 HSPのcopy命令とは若干違いがありますが、ほぼ同じ記述でコピーが可能です。 gmode命令により、コピーの際に透明色の処理をするかどうかを指定することが できます。コピーモードが0の場合は、コピー元の画像が完全にコピーされます。 コピーモードが1か2の場合は、コピー元の画像で透明色に指定されている色は コピーされません。図形のまわりだけを切り抜いたようにコピーしてくる場合には 有効です。 objsize p1,p2 p1=コピー先のXサイズ p2=コピー先のYサイズ es_zoom p1,p2,p3 p1=オフスクリーンバッファID(0〜63) p2=コピー元X座標 p3=コピー元Y座標 es_zoom命令では、pos命令で指定した座標に、gmodeで指定したサイズとモードで p1で指定したIDの(p2,p3)の座標から画像がコピーされます。 ただし、コピー先のサイズはobjsize命令で指定したサイズが使われます。 これにより、コピー元とは違ったサイズでコピー先に転送してくることが可能です。 この機能は、ビデオカードのハードウェアが変倍コピーをサポートしている時は 高速に動作しますが、そうでない場合はソフトウェアで処理されるため劇的に速度 が低下するので注意してください。 パレットについてパレットモード使用中は、0〜255までのパレットに設定された色を使用可能です。 パレットの設定は、es_buffer命令でオフスクリーンバッファに画像を転送する 際に設定されていたものが、そのまま使用されます。 複数のオフスクリーンバッファに画像を何度か転送した場合は、最後に転送された 画像の持つパレット設定が有効になります。 HSPDX.DLLでは、画面のフェードイン・アウトが可能です。 es_palfade p1,p2 パレットフェード p1=フェード値(-256〜256) p2=フェードするスピード(0〜128) p1で画像の明るさを設定します。p1が0の時が通常(設定パレットのまま)です。 p1がマイナス値になるほど画像は暗くなり、プラス値になるほど明るくなります。 p1が-256で完全な黒になり、256で完全な白になります。 p2でフェードのスピードを指定することができます。p2を省略するか、0の場合は es_palfade命令が実行されるとすぐにp1の指定が反映されます。 1〜128の場合は、現在設定されている値からp1で指定した値までなめらかに変化 します。指定した数値が大きいほど変化のスピードは速くなります。 スプライトについてHSPDX.DLLでは、擬似的にスプライトの描画が可能です。 スプライトとは、画面上の自由な場所に配置できて、好きな画像を表示できる矩形 のことです。ちょうど、絵の描かれた四角いパネルを、画面の上に1枚1枚貼り付け ていくようなものです。 たとえば、シューティングゲームの自機や、敵キャラクターも図形を表示している スプライトと考えることができます。さらに、ミサイルや爆発マークなどすべての 画像を出している最小単位がスプライトと言えます。このように、決まった図形を 画面の任意の場所に表示する、入れ物をスプライトと呼んでいます。 普通、これを実現するためには、画像コピーを何度もする必要が出てきて煩わしく なりがちです。 スプライトという単位で、表示されている図形を管理することにより、より便利で シンプルにゲームなどを作成することができます。 HSPDX.DLLでは、このスプライト機能を扱いやすく、高機能にすることでゲームなど のソフト作成が楽に行なえるよう設計されています。 スプライトを使用する場合には、最初にシステムを初期化する必要があります。 システムの初期化は、es_ini命令で行ないます。 スプライトの初期化をしたら、スプライトの表示が可能になります。 スプライトは、スプライトNo.という番号で管理され、その1つ1つに別々な画像 を表示させることができます。スプライトとして表示される画像をキャラクタ パターンと呼び、これもまたキャラクタNo.という番号で管理されます。 キャラクタパターンは、あらかじめオフスクリーンバッファの1部分を切り出し 登録しておく必要があります。 この、スプライトNo.と、キャラクタNo.をいくつまで登録できるようにするかを es_ini命令による初期化時に指定することができます。 es_ini p1,p2 システムの初期化 p1=スプライトの最大数 p2=キャラクタ定義の最大数 パラメータを省略すると、スプライトは512個まで、キャラクタ定義数は1024個 までを最大としてスプライトを初期化します。es_ini命令は何度でも実行する ことができるので、スプライトをすべてクリアしたい時などにも使用可能です。 また、パラメータに上限はありませんので、大きな数値を指定することで スプライトやキャラクタの最大数を自由に増加させることができます。ただし、 その分メモリを多く消費します。 スプライトを使用するための準備として、キャラクタパターンの登録を行なう 必要があります。 キャラクタパターンの登録方法は、まず、 es_size p1,p2,p3,p4 キャラクタサイズ指定 p1=キャラクタのXサイズ p2=キャラクタのYサイズ p3=ヒットチェック領域(%) p4=不透明フラグ( 0=透明 / 1=不透明 ) でキャラクタサイズを指定します。(p1,p2)がキャラクタのX,Yサイズになります。 p3は当たり判定を行なう際のヒットチェック領域が、何%になるかを指定します。 100を指定すると、(p1,p2)で指定したサイズいっぱいにヒットチェックを行ない ます。p4は、0ならば透明色を透過します。1ならば不透明のキャラクタパターンに なります。 キャラクタのX,Yサイズには特に制限はありませんが、オフスクリーンバッファ から、はみ出すようなキャラクタパターンの指定は無効になります。 es_size命令の設定は、以降のキャラクタ定義でずっと有効になります。 これでサイズを設定したら、 es_pat p1,p2,p3,p4 キャラクタ画像定義 p1=キャラクタNo.(0〜1023) p2=キャラクタパターンの左上X座標 p3=キャラクタパターンの左上Y座標 p4=表示フレーム数(0) で、キャラクタを登録します。 p1はキャラクタNo.、(p2,p3)の座標から、es_sizeで設定した大きさのキャラクタ が登録されます。ここで対象となる画像は、直前にes_buffer命令でVRAMに転送 された画像データとなります。この画像の中の一部を切り出してきてキャラクタ パターンとして登録しておきます。 es_pat命令1回で、指定したキャラクタNo.にキャラクタパターンが登録されます。 たくさんのキャラクタパターンが必要な場合は、そのぶん登録をしておく必要が あります。p4のパラメータは、キャラクタアニメーションをするための設定です。 通常は省略しておいて構いません。 キャラクタのパターンが登録できたら、次にスプライトの登録をします。 基本的な使い方は、 es_set p1,p2,p3,p4 スプライト設定 p1=スプライトNo.(0〜511) p2=スプライトX座標 p3=スプライトY座標 p4=キャラクタNo.(0〜1023) で、スプライトを登録することができます。 p1は、スプライトNo.(0〜511)、(p2,p3)は画面上でのスプライトの座標になります。 この座標を左上として、p4で指定したキャラクタNo.が表示されます。 スプライト座標は、-32767〜32767までの範囲が設定可能です。 通常は画面の左上を(0,0)として画面解像度の範囲に表示されますが、これを 変更することも可能です。 es_window p1,p2,p3,p4 スプライト表示エリア設定 p1=スプライト表示基点X座標 p2=スプライト表示基点Y座標 p3=スプライトを表示するX方向の範囲 p4=スプライトを表示するY方向の範囲 この命令により、スプライトを画面内の限られた範囲内にのみ表示することが可能 です。指定した範囲内がスプライトの表示エリアになります。 スプライト以外の描画命令には、この範囲は適用されません。 以上で、スプライトを表示するための準備が整います。 実際の描画は、メインループでスプライト描画命令を実行した時に行なわれます。 たとえば、以下のようなメインループを構成してください。 *gmain stick ky,$1f ; キーの情報を取得 if ky&$80 : goto *owari ; [ESC]中断チェック es_cls ; 画面クリア es_draw ; スプライト描画 es_sync ; 画面の更新 await 0 ; Systemアイドル goto *gmain 上の例では、es_cls命令でまず画面をクリアしておき、es_draw命令で登録されて いるすべてのスプライト描画を行ないます。そして、es_sync命令で画面の更新を 行ない、await 0はお約束で入っています。 このようにes_draw命令により、あらかじめ登録されているすべてのスプライトを 描画します。同時にたくさんのスプライトが重なって表示される場合は、スプラ イトNo.が小さい数になるほど手前に(優先順位が高く)表示されます。 es_cls命令とes_draw命令の間に、es_copy命令などで画像を転送すれば、スプラ イトの背景となりますし、es_draw命令の後にes_copy命令などで画像を転送すると 常に手前にある画像となります。 大きなキャラクタパターンを優先順位の低い(スプライトNo.の大きい)スプライト として登録しておき、背景とすることも可能です。 スプライトの設定を変更するための命令がいくつか用意されています。 es_chr p1,p2 chr値設定 es_type p1,p2 type値設定 es_flag p1,p2 flag値設定 これらは、p1でスプライトNo.を指定、p2で値を指定します。 es_chr命令は、キャラクタNo.を変更します。 es_type命令は、ユーザーの好きに設定することができる識別用の値 (type値)を指定します。 flag値は以下のような意味を持ちます。 flag値= 0 : スプライト未登録 bit 0-6 : 1〜127 カウントダウンタイマー bit 7 : カウントダウン消失SWITCH bit 8 : $100 スプライト表示ON bit 9 : $200 スプライト移動ON bit10 : $400 自由落下移動ON bit11 : $800 BGとリンクして移動(未実装) bit12 : $1000 ボーダー消去無効ON bit13 : $2000 ボーダーXで反転SWITCH bit14 : $4000 ボーダーYで反転SWITCH bit15 : $8000 カウントダウンタイマー時点滅SWITCH flag値は、スプライトが有効になっている場合は、通常は$100(256) が自動的に設定されています。普段は特にいじる必要はありません。 それ以外のビットによりスプライトの動作を指定できます。 スプライトが未登録の場合は、0になっています。 flag値のカウントダウンタイマーは、通常は0になっています。 これを1〜127に設定すると、表示するたびに1づつマイナスされて いきます。 カウントダウンタイマーがマイナスされている時には、スプライトが 自動的に点滅します。これは、bit15(カウントダウンタイマー時点滅 SWITCH)が1の時はOFFにすることができます。 カウントダウンタイマーが0になった時点で、そのスプライトは消去 (未登録)されます。ただし、bit7(カウントダウン消失SWITCH)が1の 場合はこの機能は働きません。 このカウントダウンタイマーにより、 ・一定時間、点滅するスプライト( bit7=1 / bit15=0 ) ・一定時間、点滅後に消滅するスプライト( bit7=0 / bit15=0 ) ・一定時間後に消滅するスプライト( bit7=0 / bit15=1 ) を実現することができます。 次に、スプライトの座標を変更する場合は、 es_pos p1,p2,p3 スプライト座標設定 p1=スプライトNo.(0〜511) p2=スプライトX座標 p3=スプライトY座標 を使用します。p1でスプライトNo.を指定して、(p2,p3)でX,Y座標を 設定します。es_posは、設定済みのスプライトの座標だけを変更する 命令です。 1フレームごとに自動的にスプライトの座標を移動させることも可能 です。以下の命令が用意されています。 es_apos p1,p2,p3 スプライト移動設定 p1=スプライトNo.(0〜511) p2=1フレームにX方向に移動するドット数 p3=1フレームにY方向に移動するドット数 p4=移動スピード(%) p1でスプライトNo.、p2,p3でX,Y方向の増分を指定します。 p4で移動スピードを%で指定します。p4を省略するか、100を 指定した場合は、100%のスピードとなり、1フレームに(p2,p3) で指定した増分だけ移動し続けます。もし、移動スピードを 50(%)にして、増分が(+4,-2)に指定された場合は、実際には、 (+2,-1)の増分になります。増分の単位は、1ドット以下になった 場合でも正確に移動を行ないます。たとえば、1フレームに、 (1,0)の移動を10%で行なった場合でも、10フレーム後に1ドット 移動するように計算されます。 es_adir p1,p2,p3 スプライト移動方向設定 p1=スプライトNo.(0〜511) p2=移動する方向(0〜63) p3=移動スピード(%) es_adir命令は、es_apos命令と同じく自動的にスプライトを移動 するように設定する命令ですが、es_adir命令では方向を指定して 移動を行ないます。 p1でスプライトNo.、p2で方向を指定します。方向は、0〜63までの 数値で指定します。0が真下となり、反時計回りに増加していきます。 p3で移動スピードを%で指定します。p3を省略するか、100(%)を指定 した場合には、指定した方向に1フレームにつき1ドットの距離を 移動します。 es_aim p1,p2,p3,p4 スプライト参照座標設定 p1=スプライトNo.(0〜511) p2=移動先のX座標 p3=移動先のY座標 p4=移動スピード(%) es_aim命令は、es_adir命令と同じく指定した方向にスプライトを 移動させるためのものです。es_aim命令では、方向の替わりに移動 する目標となるX,Y座標を指定します。スプライトは、現在の座標 から、目標となる座標への方向を計算し移動を開始します。 この命令は、たとえば敵から発射されるミサイルがプレイヤーを狙っ て移動するようにしたい時などに役立ちます。 p4で移動スピードを%で指定します。p3を省略するか、100(%)を指定 した場合には、指定した方向に1フレームにつき1ドットの距離を 移動します。 スプライトを移動させる上で知っておくと便利な機能の1つとして、 スプライト自動削除機能があります。これは、画面外の座標が設定 されたり、スプライトの自動移動で画面外へ出てしまったものを 自動的に削除する機能です。このために、スプライト有効エリアと いうのが設定されています。スプライト有効エリアの範囲内にある スプライトのみが有効となり、その範囲から出たスプライトは自動的 に削除されるというしくみになっています。 通常、スプライト有効エリアは、表示範囲(640x480)の外128ドット 以内になっています。つまりスプライトの取れる座標の範囲として、 (-128,-128)から(768,608)までということになります(解像度が640x 480の場合)。 このスプライト有効エリアを変更する命令がes_area命令です。 es_area p1,p2,p3,p4 スプライト有効エリア設定 p1=有効エリアの左上X座標 p2=有効エリアの左上Y座標 p3=有効エリアの右下X座標 p4=有効エリアの右下Y座標 スプライトの有効エリアを設定します。 スプライト座標が(p1,p2)-(p3,p4)の範囲内にないものは、自動的に 削除されます。 スプライトの表示範囲が設定されると(es_window命令)自動的に、 スプライト有効エリアも再設定されます。 スプライトに設定された情報を読み出したり、検索することも可能 です。以下のような命令が用意されています。 es_get p1,p2,p3 スプライト情報取得 p1=情報が代入される変数名 p2=スプライトNo.(0〜511) p3=info number(0〜15) この命令では、p1で指定した変数名に、p2のスプライトNo.の情報を 代入します。情報の種類は、p3のinfo numberで指定します。 これは以下のような値になります。 info number : 1 = flag値 3 = スプライトのX座標 5 = スプラストのY座標 7 = 1フレームに移動する距離X 9 = 1フレームに移動する距離Y 10 = プログレスカウント値(未使用) 11 = アニメーションカウント値 12 = キャラクタNo. 13 = type値 14,15 = 特殊動作情報(未使用) es_new p1,p2 新規スプライト取得 p1=新規No.が代入される変数名 p2=スプライトNo.(0〜511) この命令は、スプライトNo.の中で使われていないNo.を検索します。 p2で指定したNo.以降で空きのあるNo.を、p1で指定した変数に代入 します。 es_find p1,p2,p3 スプライト検索 p1=スプライトNo.が代入される変数名 p2=検索対象となるtype値 p3=検索を開始するスプライトNo.(0〜511) この命令は、登録されているスプライトの中で指定したtype値を持つ もののスプライトNo.を検索します。 p2のtype値には、複数のtypeを同時に指定することができます。 たとえば、type1とtype4を対象にする場合は、1+4で5を指定します。 p2の指定を省略するか、0を指定した場合にはすべてのtype値を持つ スプライトが検索の対象になります。 検索は、p3で指定されたスプライトNo.から順番に探していきます。 これを省略すると、No.0からすべてのスプライトを検索します。 該当するスプライトが見つかった時点で、p1に結果を代入して終わります。 検索の結果、該当するスプライトがなかった場合には、-1が代入され ます。 es_check p1,p2,p3 衝突判定取得 p1=結果が代入される変数名 p2=チェックの対象となるスプライトNo.(0〜511) p3=検索対象となるtype値 es_check命令はスプライト同士の衝突判定を行なう命令です。 p2で指定されたスプライトNo.と衝突している(重なっている)スプライト を検索して、p1で指定した変数に結果を代入します。 p3で衝突判定の対象となるtype値を指定することができます。 p3が省略されるか、0の場合は、すべてのスプライトとの衝突を判定 します。 p3のtype値には、複数のtypeを同時に指定することができます。 たとえば、type1とtype4を対象にする場合は、1+4で5を指定します。 衝突判定には、キャラクタパターンを登録した時に指定したヒット チェック領域(%)が使用されます。実際に画像が重なっていても、ヒット チェック領域の範囲が重ならない限りは衝突とみなされません。 結果はp1で指定した変数に代入されます。もし、衝突しているスプライト がなかった場合には-1が、衝突しているスプライトがあれば、その スプライトNo.が代入されます。衝突しているスプライトが複数あった 場合には、スプライトNo.の少ないものが優先されます。 一度設定したスプライトを消去(削除)する場合は、以下の命令を使い ます。 es_kill p1 スプライト削除 p1=スプライトNo.(0〜511) p1で指定したスプライトNo.は削除され未登録になります。 es_clear p1,p2 複数スプライト削除 p1=スプライトNo.(0〜511) p2=削除される個数 p1で指定したスプライトNo.以降のスプライトが削除され未登録になり ます。p2で削除されるスプライトの数を指定することができます。 p1とp2の指定を省略した場合は、すべてのスプライトが削除されます。 スプライトのキャラクタ・アニメーションスプライトには、通常1つのキャラクタNo.しか指定することはできません。 これは、スプライトに対して常に静止画像を貼り付けていることになります。 しかし、ゲームなど多くの場合は画像がアニメーションしていることが多い です。 HSPDX.DLLでは、キャラクタパターンを定義する時にアニメーションの設定 を行なうことが可能です。アニメーション設定されたキャラクタは、自動的 にアニメーションNo.が変わり、スプライトを登録するだけで自動的に 画像がアニメーションで表示されるようになります。 たとえば、キャラクタNo.が自動的に1→2→3→4というように変化する ように設定するには、 es_size 32,32 es_pat 1,0,0,8 es_pat 2,32,0,8 es_pat 3,64,0,8 es_pat 4,96,0 のように設定することができます。まず、es_size命令で32x32ドットの キャラクタの設定をして、es_pat命令で1から4までのキャラクタを定義します。 es_pat命令の4番目のパラメータに、1以上を指定した場合は、アニメーション するキャラクタとなり、指定した数のフレームだけ待ってから次の番号に 切り替えます。つまり、上の例ではキャラクタNo.1を表示して、その8フレーム 後に、キャラクタNo.2を表示します。そして、またその8フレーム後には、 キャラクタNo.3になります。さらに8フレーム後にキャラクタNo.4に切り替わり 以降はそのままとなります。 このように連続した番号で、アニメーション用の待ちフレーム数を指定すること で次々にキャラクタNo.を変化させることが可能になります。 しかし、上の例ではキャラクタNo.が4になった時点で止まったままになって しまいます。これを、1→2→3→4→1→2→…というように無限に繰り返して アニメーションをするように設定することも可能です。 es_link p1,p2 アニメーション設定 p1=キャラクタNo.(0〜1023) p2=ループアニメーションするキャラクタNo.(0〜1023) es_link命令は、アニメーションで次に表示するべきキャラクタNo.を指定する ための命令です。 p1で指定したキャラクタNo.が、指定されたフレームだけ表示した後に、 p2で指定したキャラクタNo.に切り替わるように設定を行ないます。 ですから、1→2→3→4→1→2→…という設定にする場合は、 es_size 32,32 es_pat 1,0,0,8 es_pat 2,32,0,8 es_pat 3,64,0,8 es_pat 4,96,0,8 es_link 4,1 このようにスクリプトを書けばOKです。 スプライトtype値の設定についてスプライトのtype値は、ゲームなどで物体の識別をする時に有効に使うこと ができます。type値は、es_type命令で設定することができます。 この値は、ユーザーの好きに設定することができる識別用の値となります。 設定できる値は、 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 の計16種類です。 es_set命令でスプライトを設定した直後は、type値は1になっています。 この値は、衝突判定やスプライトの検索対象を指定するのに使用されます。 スプライトが示す物体の種別を登録しておくのが主な利用法です。 たとえば、シューティングゲームで自機はtype1、敵はtype2、敵のミサイル はtype4、自分のミサイルはtype8、といった感じでtype値をスプライトを出す 時に設定しておきます。 こうしておけば、自機が敵か、または敵ミサイルに衝突しているかを判定 する場合にチェックがしやすくなります。es_check命令では、複数のtype値を 同時に判定できるので、この例で言うと自機のスプライトに対して、 敵(type2)と敵ミサイル(type4)が衝突しているかを調べて自分の生死を決める ことができます。 また、自分のミサイルが敵に衝突しているかを判定する場合には、まず es_find命令でtype8のスプライトだけを検索して、その1つ1つが、敵(type2) と衝突しているかを判定すればいいわけです。 このようにtype値をあらかじめ割り振っておくことで、スプライトの管理を スマートに行なうことが可能です。 ウィンドウモードについてHSPDXでは、ウィンドウモードをサポートしています。 このモードを使用することにより、デバッグをよりスムーズに行うことが できますが、フルスクリーンモードでの動作に比べていろいろと制約が あり、環境によってはパフォーマンス面でHSPの標準ウィンドウでの動作と ほとんど変わらないことがあるため、デバッグ専用のモードだと割り切って 使用した方がよいです。 ウィンドウモードでHSPDXを動作させるには、まずes_screen命令で ウィンドウモードに指定します。 es_screen p1,p2,p3,p4 画面モードの変更 p1=DirectX使用時の解像度X p2=DirectX使用時の解像度Y p3=DirectX使用時のカラーモード(bpp) p4=パレット変換モード(0=236色/1=254色/2=256色/ 3=236色ウィンドウモード) p4に3を指定することで、ウィンドウモードで動作するようになります。 後は今まで通りスクリプトを記述するだけです。 ウィンドウモードで動作するときの制約は、以下の通りです。 パレットモードで動かす場合、使用できる色数は236色までです。 ウィンドウモード時は、内部ではデスクトップの色数に合わせて動作します ので、デスクトップが256色でない場合はパレット関係の命令は無視されます。 また、RGB値が同一のパレットが2色以上ある場合、それらは全て同じ色 として扱われるため、透明色と同じ色は全て透過されてしまいます。 ハイカラー以上で動かす場合、デスクトップの色数とDirectXのカラーモードが 異なるとエラーになります。 命令リファレンスes_ini p1,p2 システムの初期化 p1=スプライトの最大数 p2=キャラクタ定義の最大数 ※各パラメータの上限=メモリの許す限り HSPDX.DLLシステムの初期化を行ないます。 パラメータを省略すると、スプライトは512個まで、キャラクタ定義数は1024個 までを最大としてスプライトを初期化します。es_ini命令は何度でも実行する ことができるので、スプライトをすべてクリアしたい時などにも使用可能です。 es_screen p1,p2,p3,p4 画面モードの変更 p1=DirectX使用時の解像度X p2=DirectX使用時の解像度Y p3=DirectX使用時のカラーモード(bpp) p4=パレット変換モード(0=236色/1=254色/2=256色/ 3=236色ウィンドウモード) 画面の解像度を変更し、DirectXが使用可能な状態にします。 (p1,p2)で解像度を指定します。通常は、(640,480)を指定します。 p3はカラーモードを指定します。パレットモードを使用する場合は8、 ハイカラー以上を使用する場合は16,24,32のいずれかを指定します。 ただし、ビデオカードによっては24または32bitの画面モードをサポートして いないものもありますので注意してください。 p4のパレット変換モードは、画面で使用するパレットの数を設定します。 通常は0を指定して下さい。パレットの数を254または、256にしたい場合に値を 変更します。ただし、236よりも多いパレット数を指定すると、フルスクリーン モード以外では動作しなくなります。また、254よりも多いパレットを指定 できないビデオカードが存在するので、なるべくパレット変換モードは、0または 1で使用してください。 また、パレット変換モード0の時に使用するパレットは0〜235までです。HSPの 通常ウィンドウとは異なりますので注意してください。 p4=3の時は、DirectXをウィンドウモードで動かします。 ウィンドウモードで動かす際の注意点などは「ウィンドウモードについて」の 項を参照してください。 es_bye システム解放 HSPDX.DLLシステムの切り離しをします。 画面モードをウインドゥモードに戻し、確保されていたメモリをすべて解放しま す。これは、クリーンアップ関数としてHSP終了時に自動的に呼び出されます。 es_sync p1,p2 画面更新とウェイト p1=ウェイト時間(ms) p2=V-BLANK待ちフラグ(0=待つ、1=待たない) 描画された画面を更新するとともに、以前のes_sync命令実行時から経過した 時間を測定して、システム変数statに返します。 p1で、最低でも何msのウェイトを取るかを指定することができます。 p1を省略するか、0を指定した場合は最低ウェイト時間はなくなります。 es_sync命令は、垂直帰線(V-BLANK)を待って画面を更新します。 つまり、最低でも以前es_sync命令が呼ばれてから、1フレーム分の時間はウェ イトが取られます。 1フレーム分の時間は、モニタに出力されている映像周波数にもよりますが、 多くの場合1/60秒程度になっています。これは、多くのビデオゲームや家庭用 ゲーム機が画面更新しているサイクルと同じです。 通常は、es_sync命令のみでウェイトの指定をしなくても、約1/60秒ごとの ウェイトとなります。プログラムの処理が多かったり、画面の書き換えに要する 時間が多くなると、更新が1フレームごとに行なわれなくなる時が出てきて、 動きがガタガタとしたぎこちない、いわゆる「処理落ち」の状態になります。 このような時は、最低ウェイト時間を入れて、画面の更新を2フレームごとに するなどして対処することができます。 また、p1にマイナスの値を入れることで前回の実行で取りすぎたウェイトを できるだけ取り戻すようにすることもできます。 FPSが安定しない場合は こちらを使うことで改善されるかもしれません。 先述の通り、es_sync命令はV-BLANKを待ってウェイトを取りますが、p2に1を 指定するとV-BLANKを待たずに画面を更新することができます。これにより リフレッシュレート以上の速度でウェイトを取ることができますが、画面が ブレたりちらつきが発生しますので、普段は指定する必要はありません。 なお、ウィンドウモードでは基本的にV-BLANKは待ちませんので、ウィンドウ モードで動かすときは必ずウェイトを設定して下さい。 es_sync命令を実行した後には、システム変数statに経過時間が代入されて います。これはプログラムの実行にかかっている時間を計測する最も簡単な 手段です。この数値がそのままベンチマークとなります。 es_caps p1,p2,p3,p4 DirectXシステム情報取得 p1=情報が代入される変数名(数値型) p2=情報ID p3=情報ビット(1〜32) p4=対象となるレイヤー( 0=HAL / 1=HEL ) DirectXのドライバが、どのような機能を持っているかを調べて、結果をp1で 指定する変数に代入します。 p2の情報IDと、p3の情報ビットについての詳細は、DDCAPS一覧を参照して ください。 es_palfade p1,p2 パレットフェード p1=フェード値(-256〜256) p2=フェードするスピード(0〜128) p1で画像の明るさを設定します。p1が0の時が通常(設定パレットのまま)です。 p1がマイナス値になるほど画像は暗くなり、プラス値になるほど明るくなります。 p1が-256で完全な黒になり、256で完全な白になります。 p2でフェードのスピードを指定することができます。p2を省略するか、0の場合は es_palfade命令が実行されるとすぐにp1の指定が反映されます。 1〜128の場合は、現在設定されている値からp1で指定した値までなめらかに変化 します。指定した数値が大きいほど変化のスピードは速くなります。 es_palset p1,p2,p3,p4 パレット変更 p1=パレット番号(0〜255) p2=設定するR値(0〜255) p3=設定するG値(0〜255) p4=設定するB値(0〜255) パレットの色を設定します。p1で指定したパレット番号に、p2,p3,p4がそれぞれ R,G,Bとなる色を設定します。 es_palset命令による設定変更は、命令実行時すぐには反映されません。 実際に設定が反映されるのは、次にes_sync命令かes_palfade命令が実行される 時になります。 es_boxf p1,p2,p3,p4 矩形塗りつぶし p1=塗りつぶし左上X座標 p2=塗りつぶし左上Y座標 p3=塗りつぶし右下X座標 p4=塗りつぶし右下Y座標 (p1,p2)-(p3,p4)の矩形範囲を現在選択されている色で塗りつぶします。 色の選択は、color命令で行ないます。 es_fill p1,p2,p3 矩形塗りつぶし p1=塗りつぶし左上X座標 p2=塗りつぶし左上Y座標 p3=塗りつぶす色のパレット番号(0〜255) es_boxf命令と同じく指定した矩形範囲を塗りつぶすための命令です。 異なる点は、es_fill命令では、塗りつぶす色をパレット番号で指定します。 塗りつぶす大きさ(サイズ)は、gmode命令で指定したサイズになります。 (p1,p2)からgmode命令で指定した矩形範囲を指定したパレットで塗りつぶし ます。es_boxf命令よりも速度の面で有利です。 es_cls p1,p2,p3 画面クリア p1=画面クリア時のR値 p2=画面クリア時のG値 p3=画面クリア時のB値 この命令は、画面全体を指定した色でクリアします。 p1,p2,p3でクリアする色をRGBコードで指定可能です。 パレットモードでは、指定したRGBに最も近い色を持つパレットでクリア されます。 p1,p2,p3の指定を省略すると、黒でクリアします。 es_fmes "str" フォント指定文字列表示 "str"=表示文字列 カレントポジション(pos命令で指定されたX,Y座標)から、指定した文字列を 表示します。文字の色は、現在選択されている色(color命令で指定)になり、 フォントはfont命令で選択されているものが使用されます。 es_mes "str" 文字列表示 "str"=表示文字列 カレントポジション(pos命令で指定されたX,Y座標)から、指定した文字列を 表示します。 es_fmes命令と似ていますが、文字の色やフォントが選べないかわりに、 こちらの方が高速に処理されます。 文字の色は、常に白(RGB=255)となり、標準フォントが使用されます。 es_copy p1,p2,p3 画像コピー p1=オフスクリーンバッファID(0〜63) p2=コピー元X座標 p3=コピー元Y座標 es_copy命令では、pos命令で指定した座標に、gmodeで指定したサイズとモードで p1で指定したIDの(p2,p3)の座標から画像がコピーされます。 HSPのcopy命令とは若干違いがありますが、ほぼ同じ記述でコピーが可能です。 gmode命令により、コピーするX,Yサイズと、コピーの際に透明色の処理をするか どうかを指定しておく必要があります。 コピーモードが0の場合は、コピー元の画像が完全にコピーされます。 コピーモードが1か2の場合は、コピー元の画像で透明色に指定された色は コピーされません。図形のまわりだけを切り抜いたようにコピーしてくる場合には 有効です。 es_zoom p1,p2,p3 拡大縮小画像コピー p1=オフスクリーンバッファID(0〜63) p2=コピー元X座標 p3=コピー元Y座標 es_zoom命令では、pos命令で指定した座標に、gmodeで指定したサイズとモードで p1で指定したIDの(p2,p3)の座標から画像がコピーされます。 ただし、コピー先のサイズはobjsize命令で指定したサイズが使われます。 これにより、コピー元とは違ったサイズでコピー先に転送してくることが可能です。 この機能は、ビデオカードのハードウェアが変倍コピーをサポートしている時は 高速に動作しますが、そうでない場合はソフトウェアで処理されるため劇的に速度 が低下するので注意してください。 es_xfer p1,p2,p3,p4 バッファ間画像コピー p1=転送先DirectXバッファID(-2〜63) p2=転送元DirectXバッファID(-2〜63) p3=コピー元X座標 p4=コピー元Y座標 es_copy命令と同じく画像イメージのコピーを行ないますが、コピー先を画面上だけ ではなく、別なバッファなども指定することができます。 p1で指定したバッファIDに、p2で指定したバッファIDのイメージを転送します。 転送先は、pos命令で指定した座標に、gmodeで指定したサイズとモードで、 (p3,p4)の座標から画像がコピーされます。 es_copy命令の頭に、転送先のバッファIDが付加されたものと考えてください。 p1とp2のバッファ指定は、0〜63までのオフスクリーンバッファIDの他にも、 以下の値が使用できます。 DirectXバッファID = -1 : 現在表示中の画面イメージ DirectXバッファID = -2 : 現在描画中の画面イメージ es_copy命令では、転送先が-2にあたります。 この命令を実行する際、コピー先のバッファはあらかじめes_buffer命令によって 確保されている必要があります(この命令でバッファを新規に作成することは できません)。 es_put p1,p2,p3 キャラクタ画面表示 p1=putする左上X座標 p2=putする左上Y座標 p3=putするキャラクタNo. スプライト用のキャラクタパターンとして登録されているデータを、指定した座標 に表示します。この命令は、スプライトとは関係なく画面にキャラクタを転送する 命令です。 es_draw p1,p2 スプライト描画 p1=描画開始スプライトNo. p2=描画するスプライトの個数 登録されているスプライトを画面に描画します。 通常は、p1,p2のパラメータを省略して使用すれば、すべてのスプライトを描画 することが可能です。 登録されているスプライトの一部だけを描画したい場合は、p1に開始スプライト No.、p2に描画する個数を指定してください。 es_window p1,p2,p3,p4 スプライト表示エリア設定 p1=スプライト表示基点X座標 p2=スプライト表示基点Y座標 p3=スプライトを表示するX方向の範囲 p4=スプライトを表示するY方向の範囲 この命令により、スプライトを画面内の限られた範囲内にのみ表示することが可能 です。指定した範囲内がスプライトの表示エリアになります。 スプライト以外の描画命令には、この範囲は適用されません。 es_area p1,p2,p3,p4 スプライト有効エリア設定 p1=有効エリアの左上X座標 p2=有効エリアの左上Y座標 p3=有効エリアの右下X座標 p4=有効エリアの右下Y座標 スプライトの有効エリアを設定します。 スプライト座標が(p1,p2)-(p3,p4)の範囲内にないものは、自動的に 削除されます。 スプライトの表示範囲が設定されると(es_window命令)自動的に、 スプライト有効エリアも再設定されます。 es_opt p1 システムオプション設定 p1=システムオプション値1 拡張機能のオプション値を設定する命令です。 es_buffer p1,p2,p3 VRAMイメージ転送 p1=オフスクリーンバッファID(0〜63) p2=属性スイッチ(0〜2) p3=透明色(パレットモード時:-1〜255 ハイカラー以上:0〜$ffffff) 属性スイッチ=0 : オフスクリーンバッファをVRAMに取る、 失敗した場合は、メインメモリに取る 属性スイッチ=1 : オフスクリーンバッファをメインメモリに取る 属性スイッチ=2 : オフスクリーンバッファをVRAMに取る 現在gsel命令で選択されているHSPのバッファ内容を、DirectXのオフ スクリーンバッファにすべて転送します。 この時、パレットも読み出されDirectX側のパレットに転送されます。 オフスクリーンバッファに転送できる最大画像サイズは、ビデオカードに よって異なり、主に 1.縦横ともに画面解像度以上のサイズで作成できる 2.横は画面解像度と同サイズまで、縦はそれ以上のサイズで作成できる 3.縦横ともに画面解像度と同サイズまで の3通りとなっています。現存するビデオカードは2.に該当するものが多く、 3.に該当するものはほとんどないと思われます。よって、あらゆる環境で 確実に動くことを期待するなら画面解像度まで、大きなバッファを扱いたい なら縦に長くバッファを確保することをおすすめします。 p3にはes_copy命令などで透明色として使う色を指定します。 パレットモードでは0〜255までのパレット番号を直接指定するか、-1を 指定することで完全な黒(RGB=0)でパレット番号が一番若いパレットを 自動的に透明色に設定します。 ハイカラー以上では透明色に指定するRGB値を$rrggbbの16進数6桁で 設定します。たとえば、$00ff00と指定することでRGB=(0,255,0)の色が 透明色になります。 HSP側のバッファは、DirectXがパレットモードの時は同じくパレット モードで初期化されていないと正常に転送されませんが、ハイカラー以上 の場合はパレット・フルカラーモードどちらでも転送されます。 オフスクリーンバッファへの転送が成功した場合には、システム変数 statの値は0になります。転送に失敗すると、statの値は1になります。 転送に失敗する可能性は、転送する画像が大きすぎるか、VRAMの容量が 足りないことなどが考えられます。自分の環境では動作していても、 別のマシンではエラーになる可能性がありますので、スクリプト側で チェックをするように心がけてください。 すでに転送済みのオフスクリーンバッファIDを指定した場合には、 一度その内容が削除され、新しいものに上書きされます。 es_getbuf p1 VRAMイメージ読み出し p1=DirectXバッファID(-2〜63) DirectXが管理する画像バッファの内容を、HSPのウインドゥに読み出し コピーします。読み出しは、現在gsel命令で選択されているHSPの ウインドゥIDに対して行なわれます。 p1で、DirectXのバッファIDを指定します。これは、es_buffer命令など で使用するオフスクリーンバッファIDの他に以下の値が使用できます。 DirectXバッファID = -1 : 現在表示中の画面イメージ DirectXバッファID = -2 : 現在描画中の画面イメージ es_getbuf命令は、主にバッファの内容確認のためや、実行中の画面を キャプチャして保存したい場合など、テスト的な用途に使用できます。 DirectXの使用中は、通常のHSPウインドゥ上に対しての描画処理を行なう ことができないので、用途は限られてしまいます。 たとえば、現在表示中の画面イメージをbmpファイルにセーブする場合 などは、以下のようなスクリプトになります。 es_getbuf -1 bmpsave "capture.bmp" HSPウィンドウ側のバッファのモードやサイズに制限はありませんが、 転送元よりバッファのサイズが小さい場合は右下が切れて転送されます。 es_size p1,p2,p3 キャラクタサイズ指定 p1=キャラクタのXサイズ p2=キャラクタのYサイズ p3=ヒットチェック領域(%) p4=不透明フラグ( 0=透明 / 1=不透明 ) スプライトのキャラクタパターンを定義する際の、サイズを指定します。 (p1,p2)がキャラクタのX,Yサイズになります。 p3は当たり判定を行なう際のヒットチェック領域が、何%になるかを指定します。 100を指定すると、(p1,p2)で指定したサイズいっぱいにヒットチェックを行ない ます。p4は、0ならば透明色を透過し、1ならば不透明のキャラクタパターンに なります。 キャラクタのX,Yサイズには特に制限はありませんが、オフスクリーンバッファ から、はみ出すようなキャラクタパターンの指定は無効になります。 es_size命令の設定は、以降のキャラクタ定義でずっと有効になります。 es_pat p1,p2,p3,p4 キャラクタ画像定義 p1=キャラクタNo.(0〜1023) p2=キャラクタパターンの左上X座標 p3=キャラクタパターンの左上Y座標 p4=表示フレーム数(0) スプライトのキャラクタパターンを定義します。 p1はキャラクタNo.、(p2,p3)の座標から、es_sizeで設定した大きさのキャラクタ が登録されます。ここで対象となる画像は、直前にes_buffer命令でVRAMに転送 された画像データとなります。この画像の中の一部を切り出してきてキャラクタ パターンとして登録しておきます。 es_pat命令1回で、指定したキャラクタNo.にキャラクタパターンが登録されます。 たくさんのキャラクタパターンが必要な場合は、そのぶん登録をしておく必要が あります。 p4のパラメータは、キャラクタアニメーションをするための設定です。 0ならば、アニメーションなし。1以上ならば、指定したフレーム数だけその キャラクタを表示した後、次のキャラクタ(キャラクタNo.+1)を表示するように 設定されます。 es_link p1,p2 アニメーション設定 p1=キャラクタNo.(0〜1023) p2=ループアニメーションするキャラクタNo.(0〜1023) キャラクタのループアニメーションを設定するための命令です。 p1で指定したキャラクタNo.が、指定されたフレームだけ表示した後に、 p2で指定したキャラクタNo.に戻るように設定を行ないます。 es_release p1 スクリーンバッファ削除 p1=オフスクリーンバッファID(0〜63) p1で指定されたオフスクリーンバッファを削除します。 es_set p1,p2,p3,p4 スプライト設定 p1=スプライトNo.(0〜511) p2=スプライトX座標 p3=スプライトY座標 p4=キャラクタNo.(0〜1023) スプライトを登録します。 p1は、スプライトNo.(0〜511)、(p2,p3)は画面上でのスプライトの座標になります。 この座標を左上として、p4で指定したキャラクタNo.が表示されます。 スプライト座標は、-32767〜32767までの範囲が設定可能です。 es_new p1,p2 新規スプライト取得 p1=新規No.が代入される変数名 p2=スプライトNo.(0〜511) スプライトNo.の中で使われていないNo.を検索します。 p2で指定したNo.以降で空きのあるNo.を、p1で指定した変数に代入 します。 es_get p1,p2,p3 スプライト情報取得 p1=情報が代入される変数名 p2=スプライトNo.(0〜511) p3=info number(0〜15) info number : 1 = flag値 3 = スプライトのX座標 5 = スプラストのY座標 7 = 1フレームに移動する距離X 9 = 1フレームに移動する距離Y 10 = プログレスカウント値(未使用) 11 = アニメーションカウント値 12 = キャラクタNo. 13 = type値 14,15 = 特殊動作情報(未使用) p1で指定した変数名に、p2のスプライトNo.の情報を代入します。 情報の種類は、p3のinfo numberで指定します。 es_find p1,p2,p3 スプライト検索 p1=スプライトNo.が代入される変数名 p2=検索対象となるtype値 p3=検索を開始するスプライトNo.(0〜511) 登録されているスプライトの中で指定したtype値を持つもののスプ ライトNo.を検索します。 p2のtype値には、複数のtypeを同時に指定することができます。 たとえば、type1とtype4を対象にする場合は、1+4で5を指定します。 p2の指定を省略するか、0を指定した場合にはすべてのtype値を持つ スプライトが検索の対象になります。 検索は、p3で指定されたスプライトNo.から順番に探していきます。 これを省略すると、No.0からすべてのスプライトを検索します。 該当するスプライトが見つかった時点で、p1に結果を代入して終わります。 検索の結果、該当するスプライトがなかった場合には、-1が代入され ます。 es_check p1,p2,p3 衝突判定取得 p1=結果が代入される変数名 p2=チェックの対象となるスプライトNo.(0〜511) p3=検索対象となるtype値 スプライト同士の衝突判定を行ないます。 p2で指定されたスプライトNo.と衝突している(重なっている)スプライト を検索して、p1で指定した変数に結果を代入します。 p3で衝突判定の対象となるtype値を指定することができます。 p3が省略されるか、0の場合は、すべてのスプライトとの衝突を判定 します。 p3のtype値には、複数のtypeを同時に指定することができます。 たとえば、type1とtype4を対象にする場合は、1+4で5を指定します。 衝突判定には、キャラクタパターンを登録した時に指定したヒット チェック領域(%)が使用されます。実際に画像が重なっていても、ヒット チェック領域の範囲が重ならない限りは衝突とみなされません。 結果はp1で指定した変数に代入されます。もし、衝突しているスプライト がなかった場合には-1が、衝突しているスプライトがあれば、その スプライトNo.が代入されます。衝突しているスプライトが複数あった 場合には、スプライトNo.の少ないものが優先されます。 es_offset p1,p2 オフセット座標設定 p1=オフセットX値 p2=オフセットY値 すべてのスプライトの表示を、オフセット値で指定した数だけずらして 表示します。この命令で設定したオフセット値は、es_draw命令で描画を 行なった時に反映されます。 es_flag p1,p2 flag値設定 p1=スプライトNo.(0〜511) p2=flag値 flag値= 0 : スプライト未登録 bit 0-6 : 1〜127 カウントダウンタイマー bit 7 : カウントダウン消失SWITCH bit 8 : $100 スプライト表示ON bit 9 : $200 スプライト移動ON bit10 : $400 自由落下移動ON bit11 : $800 BGとリンクして移動(未実装) bit12 : $1000 ボーダー消去無効ON bit13 : $2000 ボーダーXで反転SWITCH bit14 : $4000 ボーダーYで反転SWITCH bit15 : $8000 カウントダウンタイマー時点滅SWITCH p1で指定したスプライトのflag値を変更します。 flag値は、スプライトが有効になっている場合は、$100(256) が自動的に設定されています。通常は特にいじる必要はありません。 es_chr p1,p2 chr値設定 p1=スプライトNo.(0〜511) p2=キャラクタNo.(0〜1023) p1で指定したスプライトのキャラクタNo.を変更します。 es_type p1,p2 type値設定 p1=スプライトNo.(0〜511) p2=type値 p1で指定したスプライトのtype値を変更します。 type値についての詳細は、「type値の設定について」を参照して ください。 es_kill p1 スプライト削除 p1=スプライトNo.(0〜511) p1で指定したスプライトNo.を削除します。 es_clear p1,p2 複数スプライト削除 p1=スプライトNo.(0〜511) p2=削除される個数 p1で指定したスプライトNo.以降のスプライトが削除され未登録になり ます。p2で削除されるスプライトの数を指定することができます。 p1とp2の指定を省略した場合は、すべてのスプライトが削除されます。 es_pos p1,p2,p3 スプライト座標設定 p1=スプライトNo.(0〜511) p2=スプライトX座標 p3=スプライトY座標 スプライトの座標を変更します。 p1でスプライトNo.を指定して、(p2,p3)でX,Y座標を設定します。 es_posは、設定済みのスプライトの座標だけを変更する命令です。 es_apos p1,p2,p3 スプライト移動設定 p1=スプライトNo.(0〜511) p2=1フレームにX方向に移動するドット数 p3=1フレームにY方向に移動するドット数 p4=移動スピード(%) スプライトを自動的に移動させるための設定をします。 p1でスプライトNo.、p2,p3でX,Y方向の増分を指定します。 p4で移動スピードを%で指定します。p4を省略するか、100を 指定した場合は、100%のスピードとなり、1フレームに(p2,p3) で指定した増分だけ移動し続けます。もし、移動スピードを 50(%)にして、増分が(+4,-2)に指定された場合は、実際には、 (+2,-1)の増分になります。増分の単位は、1ドット以下になった 場合でも正確に移動を行ないます。たとえば、1フレームに、 (1,0)の移動を10%で行なった場合でも、10フレーム後に1ドット 移動するように計算されます。 es_adir p1,p2,p3 スプライト移動方向設定 p1=スプライトNo.(0〜511) p2=移動する方向(0〜63) p3=移動スピード(%) スプライトを自動的に移動させるための設定をします。 p1でスプライトNo.、p2で方向を指定します。方向は、0〜63までの 数値で指定します。0が真下となり、反時計回りに増加していきます。 p3で移動スピードを%で指定します。p3を省略するか、100(%)を指定 した場合には、指定した方向に1フレームにつき1ドットの距離を 移動します。 p4で移動スピードを%で指定します。p4を省略するか、100を 指定した場合は、100%のスピードとなり、1フレームに1ドットの速度 で移動し続けます。 es_aim p1,p2,p3,p4 スプライト参照座標設定 p1=スプライトNo.(0〜511) p2=移動先のX座標 p3=移動先のY座標 p4=移動スピード(%) es_aim命令は、es_adir命令と同じく指定した方向にスプライトを 移動させるためのものです。es_aim命令では、方向の替わりに移動 する目標となるX,Y座標を指定します。スプライトは、現在の座標 から、目標となる座標への方向を計算し移動を開始します。 この命令は、たとえば敵から発射されるミサイルがプレイヤーを狙っ て移動するようにしたい時などに役立ちます。 p4で移動スピードを%で指定します。p3を省略するか、100(%)を指定 した場合には、指定した方向に1フレームにつき1ドットの距離を 移動します。 この命令を実行するとシステム変数statに移動方向が返ります。 これを利用して自機を狙う3方向弾などを作成することができます。 es_ang p1,p2,p3,p4 角度取得 p1=基準点のX座標 p2=基準点のY座標 p3=目的点のX座標 p4=目的点のY座標 システム変数statに(p1,p2)から見た(p3,p4)の方向が返ります。 es_aimを使っても方向を得ることはできますが、この命令を使えば スプライトを使わずに方向を得ることができます。 es_timer p1 タイマー取得 p1=結果が代入される変数名 Windowsを起動してからの経過時間をミリ秒単位で、p1に指定した変数に 代入します。精度は環境に依存します。 es_getfps p1 FPS取得 p1=結果が代入される変数名 1秒間にes_sync命令が実行された回数を、p1で指定した変数に代入します。 DDCAPS一覧以下の表は、es_caps命令で取得するためのID一覧です。 それぞれの数値の詳細については、DirectXのSDKマニュアルおよび、 解説書などを参照してください。 es_caps p1,p2,p3,p4 DirectXシステム情報取得 p1=情報が代入される変数名(数値型) p2=情報ID p3=情報ビット(1〜32) p4=対象となるレイヤー( 0=HAL / 1=HEL ) 情報ID一覧: 0 DWORD dwSize; 1 DWORD dwCaps; 2 DWORD dwCaps2; 3 DWORD dwCKeyCaps; 4 DWORD dwFXCaps; 5 DWORD dwFXAlphaCaps; 6 DWORD dwPalCaps; 7 DWORD dwSVCaps; 8 DWORD dwAlphaBltConstBitDepths; 9 DWORD dwAlphaBltPixelBitDepths; 10 DWORD dwAlphaBltSurfaceBitDepths; 11 DWORD dwAlphaOverlayConstBitDepths; 12 DWORD dwAlphaOverlayPixelBitDepths; 13 DWORD dwAlphaOverlaySurfaceBitDepths; 14 DWORD dwZBufferBitDepths; 15 DWORD dwVidMemTotal; 16 DWORD dwVidMemFree; 17 DWORD dwMaxVisibleOverlays; 18 DWORD dwCurrVisibleOverlays; 19 DWORD dwNumFourCCCodes; 20 DWORD dwAlignBoundarySrc; 21 DWORD dwAlignSizeSrc; 22 DWORD dwAlignBoundaryDest; 23 DWORD dwAlignSizeDest; 24 DWORD dwAlignStrideAlign; 25 DWORD dwRops[DD_ROP_SPACE]; 26 DDSCAPS ddsCaps; 27 DWORD dwMinOverlayStretch; 28 DWORD dwMaxOverlayStretch; 29 DWORD dwMinLiveVideoStretch; 30 DWORD dwMaxLiveVideoStretch; 31 DWORD dwMinHwCodecStretch; 32 DWORD dwMaxHwCodecStretch; 33 DWORD dwReserved1; 34 DWORD dwReserved2; 35 DWORD dwReserved3; 36 DWORD dwSVBCaps; 37 DWORD dwSVBCKeyCaps; 38 DWORD dwSVBFXCaps; 39 DWORD dwSVBRops[DD_ROP_SPACE]; 40 DWORD dwVSBCaps; 41 DWORD dwVSBCKeyCaps; 42 DWORD dwVSBFXCaps; 43 DWORD dwVSBRops[DD_ROP_SPACE]; 44 DWORD dwSSBCaps; 45 DWORD dwSSBCKeyCaps; 46 DWORD dwSSBCFXCaps; 47 DWORD dwSSBRops[DD_ROP_SPACE]; 48 DWORD dwReserved4; 49 DWORD dwReserved5; 50 DWORD dwReserved6; ID1(caps)の情報ビット: /**************************************************************************** * DIRECTDRAW DRIVER CAPABILITY FLAGS ****************************************************************************/ 1 DDCAPS_3D 2 DDCAPS_ALIGNBOUNDARYDEST 3 DDCAPS_ALIGNSIZEDEST 4 DDCAPS_ALIGNBOUNDARYSRC 5 DDCAPS_ALIGNSIZESRC 6 DDCAPS_ALIGNSTRIDE 7 DDCAPS_BLT 8 DDCAPS_BLTQUEUE 9 DDCAPS_BLTFOURCC 10 DDCAPS_BLTSTRETCH 11 DDCAPS_GDI 12 DDCAPS_OVERLAY 13 DDCAPS_OVERLAYCANTCLIP 14 DDCAPS_OVERLAYFOURCC 15 DDCAPS_OVERLAYSTRETCH 16 DDCAPS_PALETTE 17 DDCAPS_PALETTEVSYNC 18 DDCAPS_READSCANLINE 19 DDCAPS_STEREOVIEW 20 DDCAPS_VBI 21 DDCAPS_ZBLTS 22 DDCAPS_ZOVERLAYS 23 DDCAPS_COLORKEY 24 DDCAPS_ALPHA 25 DDCAPS_COLORKEYHWASSIST 26 DDCAPS_NOHARDWARE 27 DDCAPS_BLTCOLORFILL 28 DDCAPS_BANKSWITCHED 29 DDCAPS_BLTDEPTHFILL 30 DDCAPS_CANCLIP 31 DDCAPS_CANCLIPSTRETCHED 32 DDCAPS_CANBLTSYSMEM ID2(caps2)の情報ビット: /**************************************************************************** * MORE DIRECTDRAW DRIVER CAPABILITY FLAGS (dwCaps2) ****************************************************************************/ 1 DDCAPS2_CERTIFIED 2 DDCAPS2_NO2DDURING3DSCENE 3 DDCAPS2_VIDEOPORT 4 DDCAPS2_AUTOFLIPOVERLAY 5 DDCAPS2_CANBOBINTERLEAVED 6 DDCAPS2_CANBOBNONINTERLEAVED 7 DDCAPS2_COLORCONTROLOVERLAY 8 DDCAPS2_COLORCONTROLPRIMARY 9 DDCAPS2_CANDROPZ16BIT 10 DDCAPS2_NONLOCALVIDMEM 11 DDCAPS2_NONLOCALVIDMEMCAPS 12 DDCAPS2_NOPAGELOCKREQUIRED 13 DDCAPS2_WIDESURFACES 14 DDCAPS2_CANFLIPODDEVEN ID3(ckeycaps)の情報ビット: /**************************************************************************** * DIRECTDRAW COLOR KEY CAPABILITY FLAGS ****************************************************************************/ 1 DDCKEYCAPS_DESTBLT 2 DDCKEYCAPS_DESTBLTCLRSPACE 3 DDCKEYCAPS_DESTBLTCLRSPACEYUV 4 DDCKEYCAPS_DESTBLTYUV 5 DDCKEYCAPS_DESTOVERLAY 6 DDCKEYCAPS_DESTOVERLAYCLRSPACE 7 DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV 8 DDCKEYCAPS_DESTOVERLAYONEACTIVE 9 DDCKEYCAPS_DESTOVERLAYYUV 10 DDCKEYCAPS_SRCBLT 11 DDCKEYCAPS_SRCBLTCLRSPACE 12 DDCKEYCAPS_SRCBLTCLRSPACEYUV 13 DDCKEYCAPS_SRCBLTYUV 14 DDCKEYCAPS_SRCOVERLAY 15 DDCKEYCAPS_SRCOVERLAYCLRSPACE 16 DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV 17 DDCKEYCAPS_SRCOVERLAYONEACTIVE 18 DDCKEYCAPS_SRCOVERLAYYUV 19 DDCKEYCAPS_NOCOSTOVERLAY HSP users manual / end of file |