緊急企画DirectXを使おうの巻・その1
今回は、「緊急企画」としてHSPでDirectXを使う方法について触れます。まあ別に緊急である意味はないですけど、いきなり飛んでDirectXの使い方だからね。それに最近ちっとも新しいことやっていないし。・・・いいのッ! 緊急なのッ!(←急な逆ギレ)
2001/06/02追記:いい加減情報が古くなってきたり変なことが書いてあったりするので一部HSPDXFIXと絡めて書き直すことにします。
●準備しよう
つうことで、DirectXなのです。まず、マシンとかOSとかHSP本体以外に以下のものを用意してください。
はーい、順に説明しましょう。まずプラグインは、HSP
ver2.4g以降を使っているならダウンロードしたときに入ってるはずだから、問題ないよね。「DIRECTX」ってフォルダにあると思うよ。HSPDXFIX.DLLってのはHSPDXのバグ取り改良品のこと。ウチのダウンロードページより落としてね。詳細は追って説明するよ。
じゃー次。DirectXは今の環境なら必ず入っているので問題ないでしょう。最新のバージョンを入れた方がいいとかってことは有りません(たぶん)。ヘッダはHSPDX(FIX).DLLと一緒に入っているはずなので、これも問題なし。ちなみにヘッダファイルとは外部命令の情報などをまとめたファイルのことです。
●プログラミングの手順
これってマニュアルにも書いてあるから、なんか手抜きっぽくて申し訳ないけど、プログラムは以下のような手順で組むのだ。なお、どういう命令を使えばよいかは下の方にあるスクリプトと照合してね。
2.メイン処理
3.終了処理
まあどちらでもよいのですが、最後に後始末を行っておきましょう。このとき、一瞬パレットが化けるのが気になる人は画面消去と更新を2回行うと効果的です。
●組み方
以上簡単に手順を説明しましたが、ではどんな命令を使えばいいのかとか、そういう部分に突っ込んでいきたいと思います。
●画面描画の方法
HSPのDirectXには点や線、丸といった図形を描画する命令はほとんどありませんので、ここでは「画像をコピーする方法」について触れます。
異なるサイズの画像をコピーする場合、es_copy命令でコピーする画像サイズを指定することができないのでそのつど変更する必要がありますことと、objsizeの意味がウィンドウ描画のときと異なることを注意すれば、従来のウィンドウ描画とほぼ同じ間隔で使えます。
●透明色について
画像を転送する際に色を抜く「透明色」ですが、HSPDXではバグでパレット0番の色しか使えません(黒である必要はありません。ビデオボードに依存するかもしれませんが)。HSPDXFIXではes_bufferの第3パラメータで任意の色を透明色に指定したり、黒を自動的に探し出したりできます。
●やってみよう
てことで、簡単なサンプルを組んでみました。ランダムに「HOT
SOUP PROCESSOR」という文字列を表示するというものです。DirectX使用版と未使用版の二つを用意しました。全部大文字で組んであるので、見づらいスクリプトですいません(^^;。
DirectX未使用 | DirectX使用 |
RANDOMIZE SCREEN 0,640,480,1 BUFFER 2,256,64,1 PICLOAD "FONT.BMP" GSEL 0 CLS 4 GMODE 1,16,16 PALCOPY 2 COLOR 0,0,0 *MAIN ;REDRAW 2 STICK S,0 IF (S&128) : END RND MOJIX,79 RND MOJIY,30 MOJI="HOT SOUP PROCESSOR" GOSUB *FPUT ;REDRAW 1 AWAIT 0 GOTO *MAIN *FPUT STRLEN LNG,MOJI REPEAT LNG,0 PEEK PMOJI,MOJI,CNT PMOJI-=32 CPX=(PMOJI\16)*16 CPY=(PMOJI/16)*16 POS MOJIX*8,MOJIY*16 GCOPY 2,CPX,CPY,16,16 MOJIX+=2 IF MOJIX>78 : MOJIX=0:MOJIY=(MOJIY+1)\30 LOOP RETURN |
#include "HSPDX.AS" RANDOMIZE ES_INI ES_SCREEN 640,480,8,0 IF STAT : GOTO *DDERR1 GOTO *START *DDERR1 END *START BUFFER 2,256,64,1 PICLOAD "FONT.BMP" ES_BUFFER 0,2 IF STAT : GOTO *DDERR1 GSEL 0 ES_CLS ES_SYNC WAIT 100 GMODE 0,16,16 COLOR 0,0,0 *MAIN STICK S,0 IF (S&128) : GOTO *FINISH RND MOJIX,79 RND MOJIY,30 MOJI="HOT SOUP PROCESSOR" GOSUB *FPUT MOJIX=0 MOJIY=0 MOJI=TM STR MOJI GOSUB *FPUT ES_SYNC TM=STAT AWAIT 0 GOTO *MAIN *FINISH REPEAT 2 ES_CLS ES_SYNC AWAIT 0 LOOP ES_BYE END *FPUT STRLEN LNG,MOJI REPEAT LNG,0 PEEK PMOJI,MOJI,CNT PMOJI-=32 CPX=(PMOJI\16)*16 CPY=(PMOJI/16)*16 XX=MOJIX*8 YY=MOJIY*16 POS MOJIX*8,MOJIY*16 ES_COPY 0,CPX,CPY MOJIX+=2 IF MOJIX>78 : MOJIX=0:MOJIY=(MOJIY+1)\30 LOOP RETURN |
処理ごとに色分けをしてあるので、照らし合わせて変更点を探してみましょう。
結論をいうと、そんなに変更点はありません(当たり前といえば、当たり前かもしれないけど)。マニュアルを読むとファーストインプレッションで投げ出したくなるかもしれませんが、サンプルプログラムをいじったりしてみれば意外と簡単だって事がわかるかと思いますので色々試してみましょう。
なお、このスクリプトはフォントデータが無いのでこのままでは実行できません。ここに載せたスクリプトともう一つ別のスクリプトの2種類と一緒にフォントデータ(拙作「MZ味」の流用ですが)を同梱したものを用意しましたのでダウンロードして確認してみてください。
で、実行してみるとわかりますが、バックバッファが2画面存在するせいで(多分)画面がチラチラします。同じ事を2回書き込めばちらつきはなくなりますが、処理が秒間30フレーム以下になってしまいDirectXを使う意味がなくなりますよね。ってことで画面は1フレームごとにes_clsで消しましょう。そして、こういう処理を行わないようにしましょう。っつうかダメなプログラム示してどうするって感じもしますが(^^;。
●オフスクリーンバッファについて
オフスクリーンバッファというのはDirectXを使うときに画像を保存しておくバッファのことですが、このバッファのサイズはどれだけ割り当てられるのかということなどはキチンと把握しておかないとスプライトなどを使うときに誤動作の原因にもなりますので、ここにいろいろ書いておこうと思います。
#include"hspdxfix.as" es_ini resox=320 resoy=240 es_screen resox,resoy,8,0 if stat : end buffer 2,resox*2,resoy*2,1 es_buffer 0,2 wait 100 if stat=0 : result="画面解像度以上のバッファを作成可能":goto *finish buffer 2,resox,resoy*2,1 es_buffer 0,2 wait 100 if stat=0 : result="縦に長いバッファを作成可能":goto *finish result="画面解像度以上のバッファは作成不可能" *finish es_bye wait 100 dialog result,1 end |
●es_xferの使い方
なんだか上の文章よくわかりませんね(^^;。この文章とあわせることでes_xferを使うときにこういうことに気をつけないと誤動作しちゃうよーっていうネタフリになるわけですが、es_xferの使い方を簡単に触れておきます。
buffer 2,640,480,1 cls 4 es_buffer 0,2 |
gmode 0,160,120 objsize 640,480 pos 0,0 es_xfer 0,-2,0,0 pos 0,0 es_zoom 0,0,0 |
スプライトの使い方は第2回で。