スプライト

前回のサンプルでしたら標準命令で十分できるものですね。

DXで使用する目的はウィンドウモードよりも高速に画面描画できるだけでしょうか?

実はスプライト機能を利用してゲームを作る上で欠かせない機能も利用できます(というかこっちがメイン?)。

アニメーションや当たり判定をもっと簡単にしたいというのでしたらhspdx.dllを使用しましょう。

スプライト機能を使用するにはまずスプライトに画像を登録しなければなりません。

スプライトの数とキャラクターの数は前章したes_iniで最大数の変更ができますので

やったことないのでわかりませんが最大数を後から変更はできないと思います(^^;

あらかじめDXを初めに突入するときにes_iniで決めておくようにしましょう。

 

で、まず画像を登録する前にes_sizeにてキャラクターの大きさ、当たり判定大きさ、透過設定を設定しましょう。

p3の当たり判定大きさというのは他キャラと接触する自キャラ内の大きさです。

これにより自キャラの中心座標からp3で指定した%以内に他キャラの当たり判定が重なると、

当たったということを判定することができます(判定する命令は後で)。

例として自キャラの大きさが100*100で当たり判定が70(%)だと画像の中心の70*70があたり部分となります。

p4の透過設定は0で完全な黒(RGBが0)の色を透過、1だと不透過になります。

es_sizeをすると他のキャラクターもこの設定を使用しますので同じでよいならもう一度する必要はありません。

 

次にes_patでキャラクター画像の左上位置、アニメーション設定をします。

p1にはキャラクターナンバーを指定します。

座標(p2,p3)からes_sizeで指定した大きさを表示するときのキャラクターの大きさとなります。

p4にはアニメーションするときの次の画像(+1したキャラクターナンバー)までのフレーム数を指定します。

 

次にes_linkで○○のアニメーション画像が表示されたら××にジャンプすると言った設定をします。

別にアニメーションが最後まで行ったらストップすると言うのでしたらそのままでいいですけど(^^;

p1に「○○のアニメーション画像が来たら」の部分を指定します。

p2に「××にジャンプする」の部分を指定します。

アニメーションしない画像ならes_patのp4に0を指定します。とりあえずコレで登録をする準備は整いました。

 

es_setでスプライトの登録をしましょう。

p1にスプライト番号、p2,p3に貼り付ける位置、p4にキャラクターナンバーを指定します。

 

ココまで設定できたらes_drawにてスプライトを表示してみましょう。

es_drawはスプライトを表示させるものでコレをするまではredrawの0か2をしている様なもので

es_syncをしても表示されません。

	buffer 2,,,1
	picload "char2.bmp"
	es_buffer 2,0,-1
	if stat : es_bye : dialog "転送に失敗しました" : end
	es_size 32,32,100,0
	es_pat 0,0,96,8
	es_pat 1,64,96,8
	es_link 1,0
	es_set 0,310,230,0
	gsel 0
	repeat
		es_cls 255,255,255
		es_draw 0
		es_sync 50
		stick k
		if k=128 : end
		await
	loop

前章で書き忘れていましたがループの中にes_syncがあるのにawaitが入っているのは、

WINDOWSにタスクをまわすためのもので、これがないとDXモード中にctrl+alt+deleteができなくなり

alt+F4で終了はできるものの危険な状態に陥ってしまいます(^^;

前章のキャラクターを動かすサンプルもついでに動かしてみましょうか。

#include"hspdx.as"
#define SIZEX 32
#define SIZEY 32
	es_ini
	es_screen 640,480,8
	if stat==1 : dialog "DirectXの初期化に失敗しました" : end
	if stat==2 : dialog "スクリーンの初期化に失敗しました" : end
	buffer 2,,,1
	picload "char2.bmp"
	es_buffer 2,0,-1
	if stat : es_bye : dialog "転送に失敗しました" : end
	es_size 32,32,100,0
	es_pat 0,0,0,3 : es_pat 1,32,0,3 : es_pat 2,64,0,3 : es_pat 3,32,0,3
	es_pat 4,0,32,3 : es_pat 5,32,32,3 : es_pat 6,64,32,3 : es_pat 7,32,32,3
	es_pat 8,0,64,3 : es_pat 9,32,64,3 : es_pat 10,64,64,3 : es_pat 11,32,64,3
	es_pat 12,0,96,3 : es_pat 13,32,96,3 : es_pat 14,64,96,3 : es_pat 15,32,96,3
	es_link 3,0 ; 左向きアニメーション設定
	es_link 7,4 ; 上向きアニメーション設定
	es_link 11,8 ; 右向きアニメーション設定
	es_link 15,12 ; 下向きアニメーション設定
	gsel 0
	es_window 0,0,640,480
	es_area -SIZEX,-SIZEY,640,480
	direction.1=3
	x=10 : y=2
	repeat
		stick k,15
		if k==128 : end
		if k==1 : x- : direction.1=0 : if x<0 : x=0
		if k==2 : y- : direction.1=1 : if y<0 : y=0
		if k==4 : x+ : direction.1=2 : if x>19 : x=19
		if k==8 : y+ : direction.1=3 : if y>14 : y=14
		es_cls 255,255,255
		es_pos 0,x*32,y*32
		if direction!=direction.1 : direction=direction.1 : es_set 0,x*32,y*32,direction.1*4
		es_draw
		es_sync 100
		await
	loop

スクリプトが長くなって面倒くさそうと思いましたか?

確かに前章のものよりも長くなってしまいましたがループの中をご覧ください。

キャラクターのアニメーション表示処理が短くなっています。

プログラマーが処理を書かなくてもコンピュータが勝手にやってくれているんですね。

 

ということで(どういうこと?)内容の説明していきましょう。

今まで説明してきた命令以外にes_windowes_areaes_posが新しく入っていますね。

es_windowes_areaは別にこのサンプルではなくても普通に動きますが一応付けています。

シューティングなどで自キャラ以外は画面外に出て行くものがよくあります(敵以外にも玉も該当します)。

es_windowは範囲内にあるキャラクターだけを表示します。

試しに上のサンプルの「es_window 0,0,640,480」の640を370くらいに変えて実行してみてください。

そして右に1歩くらい行ってみるとキャラクタが欠けてしまうと思います。

 

es_areaは範囲外にあるキャラクターを削除してしまいます。

ですのでコレを利用すれば敵や弾丸が出て行くと自動で削除するようにできるわけですね。

範囲外というのはキャラクターの左上座標が範囲外に出たらと言うことです。

ですので完全にウィンドウ外に出たら消したいと言うのであれば、

「0-キャラ画像サイズ」座標以下だと全部消えた段階でキャラクターを削除することができます。

 

es_posというのはキャラクターを表示する位置です(pos命令のスプライト専用版だと思ってください)。

一つ前のサンプルではes_setで位置を決めていましたね。

今回もとりあえずその方法で初めに表示していますがその方法だけでは実現できません。

なぜかと言うとループするたびにes_setをするとキャラクターがアニメーション出来ないからです。

でもコレがないと方向転換したときに横向き画像とかに変更できませんね。

つまりes_pos(通常時使用)とes_set(初期描画時,方向転換時のみ使用)どっちも外せないわけです・・・。