test5.hsp

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