2Dセル描画
今回はHSP3.2β3で新しく追加された2Dキャラクター表示のためのセル描画命令を紹介します。
gcopy命令では、バッファ内の一部をコピーして、現在の描画対象ウィンドウに貼り付けるだけですが、
今回紹介する命令では、従来のgcopy命令と同様の描画も行えるし、
バッファを任意のサイズのセルとして分割管理することで、素材を明確に分けることができます。
また、将来的にはαチャンネルサポートやDirectX対応を見据えた、機能拡張があるようです。
現段階で実装されている具体的な使い方については追って説明していきます。
尚、この章ではアニメーション時に使用した次の画像を使用しています。


まずは、分割管理対象画像の読込を行う命令から。
celload ファイル名, ウィンドウID, 画面モード
ファイル名読み込む画像ファイル名を指定する
ウィンドウID読込先ウィンドウIDを指定する
画面モード初期化する画面モード(0:フルカラーモード 1:パレットモード)を指定する
CELlLOADの省略形であるcelload命令では、buffer命令とpicload命令を同時に使用した効果があり、 この命令の良い点は「画像を読み込んでも描画対象ウィンドウが変わらないこと」が挙げられます。 つまり、従来のbuffer命令とpicload命令による読み込みだと、
1.buffer命令で「256色限定」か「1677万色」かの画面モードを選択してバッファ初期化
2.picload命令で画像ファイルをロード
3.gsel命令で描画対象ウィンドウをメインスクリーンに変更
4.gcopy命令でバッファに読み込んだ画像の一部または全部をコピー
という4つの処理が必要でしたが、今回の命令を使うことで
1.celload命令で画面モードを選択してバッファ初期化を行い、画像ファイルをロード
2.gcopy命令でバッファに読み込んだ画像の一部または全部をコピー
と2つの処理だけで実現させられるようになります。
また、celload命令だとウィンドウIDを省略するか−1を指定することで
未使用の読込先バッファIDを指定することが出来ます。
celload命令で初期化されたウィンドウIDはstatに返る様になっているので、
下記のスクリプトのように直接指定することも当然出来ますが、
後々、読込先バッファを知る必要があることでしょうから、
未使用バッファを使用するようにした場合は別の変数に退避させるようにしましょう。
尚、現在選択しているスクリーンのウィンドウIDを指定した場合、
仮想バッファとして初期化してしまうために表示されなくなってしまいます。
コレはgsel命令で表示させようとしても表示できませんので注意が必要です。

 1
 2
 3
	celload "character.bmp"
	gmode 2
	pos 10, 10 : gcopy stat, 0, 0, 32, 32 // 新しく初期化したバッファから読み込む
続きまして、各セル情報を定義する命令について紹介します。
celdiv ウィンドウID, 分割横幅, 分割高さ, X座標, Y座標
ウィンドウIDセル分割対象ウィンドウIDを指定する
分割横幅1セルの横幅を指定する
分割高さ1セルの高さを指定する
X座標セルの描画基点X座標を指定する
Y座標セルの描画基点Y座標を指定する
CELlDIVideの省略形であるceldiv命令の大パラメータであるウィンドウIDには、 celload命令で画像の読み込みを行ったバッファを指定します。 単純に「セル分割を定義するウィンドウIDを指定する」と言う意味なので、 当然、ご自分でbuffer命令およびpicload命令で読み込んだ画像のバッファでも構いません。 分割横幅と高さは、1セルの縦横サイズを指定するパラメータで、 セル毎に個別の大きさを指定することは出来ません。






もし、200×150ピクセルの画像で、セルサイズを60×60と設定した場合、 セル0は(0,0)から(59,59)まで、セル1は(60,0)から(119,59)まで、 セル2は(120,0)から(179,59)まで、セル3は(0,60)から(59,119)まで…と、 セル2の右側にある180ピクセル目以降はセルとして使用されません。 同様にセル5の右側も使用されず、セル3〜5の下側も高さ30ピクセルしかないので使用されません。 この第2、3パラメータの分割サイズ値を指定しなかった場合は、 バッファサイズが対象サイズとなるので、使用できるのはセル0のみとなります。 第4、5パラメータの描画基点座標は、pos命令で指定した位置にセル描画基点が来るようになるので、 例えばX側に20を設定したら、左端から20座標分右にある点がpos命令で指定した座標になります。 省略した場合は左上が基点となり、値を大きくすればするほど左または上に描画されるようになりますが、 gcopy命令で配置する場合に影響はなく、次に紹介するセル描画命令を使用する際に影響があります。 下記のスクリプトで、丁度32×32分がコピーされているのは、 gcopy命令のデフォルトコピーサイズが32×32となっているだけの話で、 celdiv命令の設定が効いているというわけではありません。
 1
 2
 3
 4
	celload "character.bmp", 1
	celdiv 1, 32, 32
	pos 10, 10 : gcopy 1
	stop
celdiv命令の設定がどうなっているかを確認する命令は用意されていませんが、 セルの分割情報はウィンドウ毎に保持する領域(BMSCR構造体)に格納されているので、 コチラにあるモジュール命令のようなやり方で取り出すことが出来ます。
セル描画命令の最後に紹介するのはgcopy命令に代わる次の命令です。
celput ウィンドウID, 分割, 横倍率, 縦倍率, 角度
ウィンドウIDコピー元のセル画像が格納されたウィンドウIDを指定する
分割左上のセルを0としたセルナンバーを指定する
横倍率貼付時の横幅表示倍率を指定する
縦倍率貼付時の縦幅表示倍率を指定する
角度2πを360度としたラジアン角度を指定する
celload命令で画像を読み込み、celdiv命令でセル分割し、 CELlPUTの省略形であるcelput命令で貼り付けてこそ初めて「セル描画機能を使った」といえるでしょう。 celput命令の第1パラメータのウィンドウIDにはセルを格納したバッファIDを指定します。 分割bノはceldiv命令で画像を分割した時に左上から順に割り振られたセルナンバーを指定します。 第3、4パラメータの倍率は定義されたセルを貼り付ける際に、 元のセルサイズからどれだけ伸縮させるかの拡大率を指定します。 指定するのは0.3倍、1.2倍、2.5倍等の実数値ですが、 2.0倍や3.0倍等の小数点以下がない場合には整数値で指定しても問題ありません。 拡大して使用する分には少し改良の余地があるようで、 元の画像を縦横共に4倍に引き伸ばしてテストしましたが、HSP3.2では正常に拡大されなかったので、 現状で拡大コピーさせる場合にはgzoom命令を使う方が良いでしょう。 第5、6パラメータの角度にはgrect命令、grotate命令同様に 2π(約6.28)を360度とするラジアン値で回転させる角度を指定します。 grect命令、grotate命令と同じ処理を行っているせいで、 等倍の回転であっても正常にはコピーされないようです。 つまり、現状で問題なくコピーできるのは、等倍で角度0の場合のみ、と言うことになります。 この機能については今後に期待しましょう。 ヘルプには記載されていないので一点補足しておきます。 コピー元の画面モードと、コピー先の画面モードが異なっている場合、 拡大も回転もさせない場合はエラーが出ませんが、 拡大または回転させてコピーするとエラーになることを確認しました。 HSP3.3以降ではどうなっているかわかりませんが、参考までに覚えておくとよいでしょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	celload "character.bmp", 1
	celdiv 1, 32, 32
	gmode 2
	color 255, 255, 255
	animation = 0, 1, 2, 1
	zoom = 2
	repeat
		redraw 0
		boxf 10, 10, zoom * 32 + 10, zoom * 32 + 10
		pos 10, 10 : celput 1, animation(cnt \ 4) + cnt / 8 \ 4 * 3, zoom, zoom
		redraw 1
		wait 20
	loop