#use hsp3dish ; ; 疑似3D sprite sample 3 ; ; 2Dスプライトを使った疑似3Dの表示を行うサンプルです ; 水面と雲を表示してカメラも移動させています ; カーソルキーで上下左右、[A][D]キーでZ方向に移動します ; 320×224画面を4倍のドットで表示しています ; #const ZMUL 128 ; 3D座標計算の基準値 #const ZNEAR 30 ; 一番手前のZ値 #const ZFAR 320 ; 一番奥のZ値 #const ZSIZE 30 ; スプライト基準サイズ #define G_SHIP (3) ; 画像を読み込むバッファID(自機) #define G_KUMO (4) ; 画像を読み込むバッファID(雲) #define G_SEA (5) ; 画像を読み込むバッファID(水面) #define CHR_SHIP (1) ; キャラクタNo.(自機) #define CHR_KUMO (2) ; キャラクタNo.(雲) #define CHR_SEA (3) ; キャラクタNo.(水面) randomize goto *start #deffunc set3dsprcam int _p1, int _p2, int _p3 ; 3Dスプライトのカメラを設定 ; (_p1,_p2,_p3) X,Y,Z座標 ; camx=_p1:camy=_p2:camz=_p3 return #deffunc start3dspr ; 3Dスプライトの表示開始 ; _ent_3dspr=16 _totalobj=0 es_clear _ent_3dspr return #deffunc put3dspr int _p1, int _p2, int _p3, int _p4, int _p5, int _p6 ; 3Dスプライトを表示 ; (_p1,_p2,_p3) X,Y,Z座標 ; _p4 : CHR No. ; _p5 : angle ; _p6 : size ; z=_p3-camz if zZFAR : return x=(_p1-camx)*ZMUL/z px=_p6:if px<=0 : px=ZSIZE px=px*ZMUL/z y=(_p2-camy)*ZMUL/z es_set _ent_3dspr, x,y, _p4,,ZFAR-z es_setrot _ent_3dspr,_p5,px,px es_flag _ent_3dspr,ESSPFLAG_NOWIPE,1 _ent_3dspr++ _totalobj++ return #const OBJ_MAX (256) ; ゲームオブジェクト最大数 ; フラグ #const OBJ_FLAG_NONE (0) ; 無効 #const OBJ_FLAG_OK (1) ; プレイヤー #deffunc obj_init ; ゲームオブジェクト初期化 ; dim obj_flag,OBJ_MAX dim obj_id,OBJ_MAX dim obj_size,OBJ_MAX dim obj_x,OBJ_MAX dim obj_y,OBJ_MAX dim obj_z,OBJ_MAX dim obj_pz,OBJ_MAX return #deffunc obj_reg int _p1, int _p2, int _p3, int _p4, int _p5, int _p6 ; ゲームオブジェクト登録 ; (_p1,_p2,_p3) X,Y,Z座標 ; _p4 : キャラクタNo. ; _p5 : size ; _p6 : flag (0=npc) id=-1 repeat OBJ_MAX if obj_flag(cnt)=0 : id =cnt : break loop if id<0 : return i=_p6:if i=0 : i=OBJ_FLAG_OK obj_flag(id)=i obj_id(id)=_p4 obj_size(id)=_p5 obj_x(id)=_p1 obj_y(id)=_p2 obj_z(id)=_p3 obj_pz(id)=-1 ; 少しずつZ方向に移動する return #deffunc obj_exec ; ゲームオブジェクト表示 ; totalobj=0 repeat OBJ_MAX if obj_flag(cnt)=0 : continue id=cnt dup _x,obj_x(cnt) dup _y,obj_y(cnt) dup _z,obj_z(cnt) dup _id,obj_id(cnt) dup _pz,obj_pz(cnt) _z+=_pz if _z>ZFAR : _z=0 if _z