スプライトの任意移動制御

さて、問題になってくるのがアルゴリズムを持って動くスプライトの制御です。まぁ問題、と言ってもそんなに大したことはありません。解剖記の敵の動かし方と基本は同じです。


	es_ini 1000, : es_screen 640,480,8,0

;〜中略〜
	emax=1000		;スプライトの最大数

;〜中略〜
;■ 配列定義
	dim ef,emax		;敵固さ・生死
	dim exv,emax		;敵x方向運動量
	dim eyv,emax		;敵y方向運動量
	dim et,emax		;敵出現からの時間

;〜中略〜
	es_get ex,enemy,3		; x座標取得
	es_get ey,enemy,5		; y座標取得
	es_get en,enemy,12		; キャラクタ番号取得
	if en=31 : gosub *enemy1

;〜中略〜
;■ 敵1
*enemy1
	eyv.enemy=4
	dx=mx-ex : dy=my-ey
	if dy<350 {
		if dx<0 {
			exv.enemy--
			if exv.enemy<-25 : exv.enemy=-25
		}
		else {
			exv.enemy++
			if exv.enemy>25 : exv.enemy=25
		}
	}
	if dx<0 : dx=-dx
	if dx<50 : gosub *tamaborn
	es_apos enemy,exv.enemy,eyv.enemy,100
return

まぁ要するに、配列変数を使って移動速度や配置からの時間なんかを一機一機に対して保持しておく、という形は変わらないです。ただ、es_getでスプライトの様々な情報が取得できるので、用意する配列変数は少なくて済みます。座標なんかは上記スクリプトのように簡単に取得できますしね。

後はes_aposを使ってx方向y方向の移動速度を変化させるだけです。基本的な部分は解剖記の敵の生成と移動アルゴリズム1となんら変わりありません。

ただし、注意しなければならないことがあります。それはスプライト数と用意する配列の数です。ちょっと工夫をしないと「配列の要素が大きすぎます」というエラーに悩ませられることになります(俺だけか?)。私なりのやり方なのですが、es_iniで宣言するスプライトの数だけ配列変数を用意しちゃいます。


;■ 敵生成
*enemyborn
	rnd temp,7
	if temp=0 : return
	es_new enemy,600		; 空きスプライト番号取得
	if temp=1 : ef.enemy=1 : en=31
	if temp=2 : ef.enemy=1 : en=31
	if temp=3 : ef.enemy=1 : en=31
	if temp=4 : ef.enemy=2 : en=32
	if temp=5 : ef.enemy=2 : en=32
	if temp=6 : ef.enemy=3 : en=33
				; ef:硬さ en:キャラクタ番号
	rnd ex,640			; 初期出現位置x軸
	et.enemy=0			; タイマー初期化
	es_set enemy,ex,-50,en	; スプライト登録
	es_type enemy,8		; 敵type値(8)
	es_adir enemy,0,100		; 初期移動処理
	exv.enemy=0 : eyv.enemy=10
return

すると、上記スクリプトのように、スプライト登録をするときに何も考えずにそのまま空きスプライト番号を配列の要素として使えます。なので、これは敵に限らず全てのキャラで使えるように、汎用の配列として用意しておくのがいいのかもしれません。

前へ戻る 改造記メニューへ戻る 次へ進む