スプライト移動

この章ではスプライトの移動について解説していきたいと思います。

初めにこの章で使用する画像「shoot2.bmp」をダウンロードしてください。

「移動って前章の移動じゃないの?」そんな声が聞こえてきそうなので軽く説明しておくと、

弾丸など一定の方向・場所に一定の速度で移動するものは、

表示位置を変更する変数を書いてループで増減させなくてもhspdx.dllには移動させる命令が用意されており

ソレを1回記述しておくだけで後は勝手に移動してくれます。

移動させる命令には、es_adires_aimes_aposの3種類あります。

es_adirは決められた方角(64方向中)に決められた速度で移動させることができます。

es_aimは決められた位置(終着点)に決められた速度で移動させることができます。

es_aposes_adirに少し似ていて決められた方角に移動させることができます。

どう違うのかと言うと、es_aposはX・Y方向にどれだけずつ移動させるかを決めることができるため、

es_adirのように64方向の中から選択するとかいう決まりはありません。

今回はes_adirを使用してサンプルを作成してみました。

#include"hspdx.as"
	es_ini
	es_screen 640,480,8
	if stat==1 : dialog "DirectXの初期化に失敗しました" : end
	if stat==2 : dialog "スクリーンの初期化に失敗しました" : end
	buffer 2,,,1
	picload "shoot2.bmp"
	es_buffer 2,0,-1
	if stat : es_bye : dialog "転送に失敗しました" : end
	es_size 80,60,60,0
	es_pat 0,80,0,0 ; 通常
	es_pat 1,0,0,0 ; 左移動時
	es_pat 2,160,0,0 ; 右移動時
	es_size 8,20,0,0
	es_pat 3,140,100,5 ; 炎1
	es_pat 4,148,100,5 ; 炎2
	es_pat 5,156,100,5 ; 炎3
	es_pat 6,148,100,5 ; 炎2
	es_size 20,20,100,0
	es_pat 7,80,100,0 ; 弾
	es_link 6,3
	gsel 0
	es_window 0,0,640,480
	es_area -80,-60,640,480
	x=70 : y=90
	es_set 0,x*4,y*4,0
	es_set 1,x*4+37,y*4+58,3
	repeat
		es_cls 0,0,50
		es_pos 0,x*4,y*4
		es_pos 1,x*4+37,y*4+58
		es_draw
		es_sync 1
		stick k,15
		if k==128 : end
		if k&1 {
			if bend=0 : bend=1 : es_set 0,x*4,y*4,1
			x- : if x<0 : x=0
		} else {
			if bend=1 : bend=0 : es_set 0,x*4,y*4,0
		}
		if k&2 : y- : if y<0 : y=0
		if k&4 {
			if bend.1=0 : bend.1=1 : es_set 0,x*4,y*4,2
			x+ : if x>139 : x=139
		} else {
			if bend.1=1 : bend.1=0 : es_set 0,x*4,y*4,0
		}
		if k&8 : y+ : if y>104 : y=104
		if k&16 : gosub *cartridge
		await
	loop

*cartridge
	es_new generation,0
	if generation<7{
		es_set generation,x*4+30,y*4-20,7
		es_adir generation,32,800
	}
	return

では上記のスクリプトを簡単に解説していきます。

前半部分は前章までと一緒なので飛ばします。

この章になって初めて自分以外のキャラクター(弾と炎だけど)が出てきましたね。

スプライト1つで1キャラクターしか扱えないようですね(扱えるかもしれませんが)。

同じスプライトナンバーでes_setにてもうひとつキャラクターを表示させてみたらわかると思います。

複数のスプライトではスプライトが重なったときに優先順位というものにより

どちらが手前に表示されるかが決まっているのですが次章で説明します(この章では関係ないので)。

es_newですが、これはヘルプの通り使われていないスプライトナンバーを探しp1に返してくれるものです。

何をしているのかと言うと(実際は「書く」ですが…。)、変数generationに6以下が入ればとありますが、

0と1は既に使用されていますので2〜6の内の一番若い数字が返ってくればOKです。

もし6以下だとes_setにて取得したスプライトナンバーで弾を生成します。

この弾がes_area外に出るまでは使用されたままになるので、そのナンバーも使用できなくなります。

その様にして弾を撃つたびに使用できるスプライトが減っていき、

es_areaに弾が5個になれば次のスプライトは7になるので弾の生成が行われません。

es_adirは先ほど述べたようにスプライトの方角と速度を指定して移動させるものです。

p2の32というのは、0を下方向として反時計回りに1から順番に63まで決められています。

403224
4816
560008
それぞれの数字は★から見た角度

その中で32というのは真上を指すことになります。

p3の800というのはes_sizeの当たり判定と同じく%で指定しますので

「1フレームで1ドット進む」の800%、つまり1フレームで8ドット進ませるということです。

ついでですのでes_angについてもお話しておきましょう。

(p1,p2)座標から見て(p3,p4)座標はどの方角になるのかがシステム変数statに入ります。

statに入る方角を示す値はes_adirと同じく0〜63の中の1つが入ります。

当然ですがes_adirと同じで真下が0で反時計回りに1ずつ増えていきます。