sample\hspdx\TEST5.hsp » Plain Format
#include "hspdx.as"
#include "hsp3util.as"
;
; HSPDX.DLL sample5
; シューティングゲームのサンプル。
; カーソルキーで移動、スペースで発射
; [ESC]キーで終了
;
;------------------------------------------------------------------
wx=640:wy=480
es_ini ; system初期化
es_screen wx,wy,32,,1,1 ; スクリーン初期化
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
; 敵の出現 & 移動
;
a=rnd(32)+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
*noset
if gcnt&15 : return
; 敵キャラ配置
;
es_new a,64:y=rnd(300)
es_set a,640,y+60,4
es_type a,4
es_adir a,rnd(8)+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
es_adir a,rnd(4)+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
a=peek(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