#include "hspdx.as" #include "hsp3util.as" #include "hsp261cmp.as" ; ; HSPDX.DLL sample5 ; シューティングゲームのサンプル。 ; カーソルキーで移動、スペースで発射 ; [ESC]キーで終了 ; ;------------------------------------------------------------------ wx=640:wy=480 es_ini ; system初期化 es_screen wx,wy,8 ; スクリーン初期化 if stat=1 : goto *dderr1 if stat=2 : goto *dderr2 goto *start ; 正常に完了 *dderr1 dialog {"DirectXの初期化に失敗しました。 "},1 end *dderr2 dialog {"スクリーンの初期化に失敗しました。 "},1 end *dderr3 es_bye wait 100 dialog {"VRAMの容量が不足しています。 "},1 end ;------------------------------------------------------------------ *start chrsx=64:chrsy=64 ; キャラクタのサイズを指定 buffer 3,,,1 bmppalette "testchr.bmp" picload "testchr.bmp" es_buffer 0,2 if stat : goto *dderr3 es_size 64,64,60 repeat 5 es_pat cnt, cnt*64,64 loop ; ; マップデータの初期設定 ; mapx=10:mapy=8 ; マップのX,Yサイズ sdim map,1000 ; マップデータの領域を確保 map = "3330000000" ; Y=0のマップデータ map += "3000000000" ; Y=1のマップデータ map += "3003000033" ; Y=2のマップデータ map += "0003000000" ; Y=3のマップデータ map += "1003000011" ; Y=4のマップデータ map += "1100001111" ; Y=5のマップデータ map += "1022011111" ; Y=6のマップデータ map += "4444444444" ; Y=7のマップデータ buffer 4,wx,wy,1 ; ID4に仮想画面を作成 gosub *map_draw ; 背景マップを作成 es_buffer 1,2 if stat : goto *dderr3 gsel 0,1 es_cls es_sync wait 100 myx=100:myy=100 es_set 0,myx,myy,1 a=0 tt=0 bgx=0 gcnt=0:gres=0:gwt=0 *gmain stick ky,$1f ; キーの情報を取得 if ky&$e0 : goto *owari ; [ESC]中断チェック a=4:gosub *rollbg gosub *keychk gosub *fire gosub *enemy es_draw pos 0,0:es_mes "Bench="+tt es_sync 20 ; 1/30? ;es_sync ; 1/60? tt=stat await 0 gcnt+ if gres=0 : goto *gmain gwt++ if gwt<100 : goto *gmain *owari es_bye end *enemy ; 敵の出現 & 移動 ; rnd a,32:a+=64 es_find n,4,a:if n<0 : goto *noset ; 敵ミサイル ; es_get x,n,3:es_get y,n,5 es_new a,128 es_set a,x,y,2 es_type a,8 es_aim a,myx,myy,1200 ;rnd b,8 :es_adir a,b+44,1200 *noset if gcnt&15 : return ; 敵キャラ配置 ; es_new a,64:rnd y,300 es_set a,640,y+60,4 es_type a,4 rnd b,8 :es_adir a,b+44,400 return *fire ; 自機ミサイルHIT CHECK ; n=0 repeat es_find n,2,n:if n=-1 : break ; ミサイルのスプライトを検出 es_check a,n,4 ; 衝突チェック if a>=0 : es_kill n:es_chr a,3:es_type a,16:es_flag a,$40a n+ loop ; 自機ミサイル発射 ; if gres : return if gcnt&3 : return ; 4回に1回ごとにチェック if (ky&$10)=0 : return ; キーチェック es_new a es_set a,myx,myy,0 es_type a,2 rnd b,4 :es_adir a,b+15,2000 return *rollbg ; 背景をスクロールしながら表示routine ; (変数aにspeedを入れて呼び出す) ; bgx+=a:if bgx>=640 : bgx-=640 gmode 0,640-bgx,480 pos 0,0:es_copy 1,bgx,0 if bgx=0 : return gmode 0,bgx,480 pos 640-bgx,0:es_copy 1,0,0 return *keychk ; カーソルキー入力で自分(変数myx,myy)を動かすサブルーチン ; (カーソルキーを同時に押すことにより斜めにも移動できます) ; if gres : return ; if ky&2 : goto *go_up ; 上を押しているか? if ky&8 : goto *go_down ; 下を押しているか? goto *keychk2 ; 左右のチェックにジャンプ *go_up if myy>-32 : myy-=8 goto *keychk2 *go_down if myy<380 : myy+=8 *keychk2 if ky&1 : goto *go_left ; 左を押しているか? if ky&4 : goto *go_right ; 右を押しているか? goto *setme *go_left if myx>-32 : myx-=8 goto *setme *go_right if myx<580 : myx+=8 *setme es_pos 0,myx,myy ; スプライト座標設定 es_check a,0,12 if a<0 : return gres=1 es_flag 0,30 es_chr 0,3 return *map_draw ; マップ描画ルーチン ; a=0 gmode 1,chrsx,chrsy ; 高速モードでコピー指定 yy=0:i=0 ; 画面左上から順番に描画する repeat mapy xx=0 repeat mapx peek a,map,i:i+ ; マップデータ読み出し pos xx,yy ; 変数xx,yyが描画先の座標になる a-='0' ; 1桁数字の文字を0〜9の数値に変換 gcopy 3,a*chrsx,0 ; チップをコピー xx+=chrsx ; 1つ右にずらす loop yy+=chrsy ; 1つ下にずらす loop return