作りかけのDISH用擬似3Dスプライトモジュールから、でかすぎるので
必要最小限の切り貼りソースですみませんがこんな感じ。
ファイナルファイトタイプならY座標の比較ソートで十分でしょう。
透明色がうまくいってませんが1行目コメントアウトすればwin版では有効に。
png画像使えばgmode3でdish版でも透明色使えます。
#include "hsp3dish.as"
#define SP_MAX 256
#module
#deffunc eds_init int _p1 ,int _p2 ,int _p3 //初期化
max=_p1 ;スプライト最大数
dim spFlg,max ;スプライト存在フラグ
dim spChr,max ;スプライトパターン
dim bufNo,max ;所属バッファ
ddim hitSize,max ;ヒットサイズ
ddim spX,max ;スプライトX座標
ddim spY,max ;スプライトY座標
ddim moveX,max ;オート移動X
ddim moveY,max ;オート移動Y
ddim ar2,max ;ソート用一時バッファ
ddim drawOrder,max ;描画オーダー
dim bufPartX,8:dim bufPartY,8 ;バッファ毎のスプライトサイズ保存(とりあえず8)
zoomReg=_p3 ;標準ズーム倍率
rotDiv=_p2 ;周の分割数
rotRad=M_PI*2/_p2 ;1分割あたりのラジアン値
return
//バッファの初期化 バッファID、x分割、y分割、基本座標
#deffunc eds_init_pat int id, int _p1, int _p2, int _p3
spBuf=id
bufPartX.id=_p1:bufPartY.id=_p2
celdiv spBuf,_p1,_p2,_p1/2*limit(_p3,0,1),_p2/2*_p3
return
//新規スプライトをセット
#deffunc eds_set int id, double _p1, double _p2, int _p3 ,int _p4
spFlg.id=1
spX.id=_p1
spY.id=_p2
spChr.id=_p3
bufNo.id=spBuf
return
#deffunc eds_calc //アニメ、オート移動計算
repeat max
if spFlg.cnt==0:continue
num=cnt
spX.num+=moveX.num
spY.num+=moveY.num
loop
return
#deffunc eds_adir int id, int _p1,int _p2 //オート移動セットdir
moveX.id=sin(rotRad*_p1)*_p2/100
moveY.id=-cos(rotRad*_p1)*_p2/100
return
#defcfunc eds_newsp int _p1,int _p2 //未使用スプライトを返す関数
sp_no=-1
repeat _p2-_p1+1,_p1
if spFlg.cnt==0{sp_no=cnt:break}
loop
return sp_no
#deffunc eds_draw //スプライト描画
edsZ_sort
repeat max
num=drawOrder.cnt
if num!=-1{
pos spX.num,spY.num
celput bufNo.num,spChr.num,zoomReg,zoomReg,0
}
loop
return
#deffunc edsZ_sort //描画順ソート(Y座標比較)
memcpy ar2,spY,max*8 ;spYを壊さないようコピー作る
repeat max ;描画スプライト番号をつける。未使用は-1にしておく
if spFlg.cnt==1{drawOrder.cnt=cnt} ;
else:drawOrder.cnt=-1
loop
repeat
n=1<<cnt ; マージサイズ
m=n*2 ; セグメント サイズ
repeat
p=m*cnt ; セグメント開始点
p1=p ; パート 1 開始点
e1=p1+n ; パート 1 終了点
p2=e1 ; パート 2 開始点
e2=limit(p2+n,0,max) ; パート 2 終了点 (clipping)
s=e2-p1 ; セグメント サイズ
if s<=n:break ; セグメント サイズが閾値以下なら マージしない
repeat s
if p2>=e2{ ; p2 領域外
tr.cnt==ar2.p1:tr2.cnt=drawOrder.p1:p1++
} else:if p1>=e1{ ; p1 領域外
tr.cnt==ar2.p2:tr2.cnt=drawOrder.p2:p2++
} else:if ar2.p1<ar2.p2{ ; 比較 & マージ ここ>か<で昇降変更★
tr.cnt==ar2.p1:tr2.cnt=drawOrder.p1:p1++
} else {
tr.cnt==ar2.p2:tr2.cnt=drawOrder.p2:p2++
}
loop
memcpy ar2.p,tr,s*8 ;マージされた配列をコピー
memcpy drawOrder.p,tr2,s*4 ;描画オーダーコピー
loop
if n>=max:break ;ソート 完了
loop
return
#global
/////////////////////////////////////////////////////メイン(終了はXで)
gmode 2
celload dirinfo (1)+"/sample/game/face.bmp",1
eds_init SP_MAX,64,1 ;スプライト初期化
eds_init_pat 1,64,64,1 ;バッファ初期化
repeat SP_MAX ;スプライトセット
newsp=eds_newsp(0,SP_MAX-1)
if newsp==-1:end
eds_set newsp,rnd(320),rnd(480),0,100
eds_adir newsp,rnd(64),80+rnd(40)
loop
repeat
redraw 0
color 0,0,0:boxf ;画面クリア
eds_calc ;オート移動計算
eds_draw ;スプライト描画
await 16
redraw 1
loop