# 07 sample_vpad-jujikey.hsp

sample\ 07 sample_vpad-jujikey.hsp

    #include "hsp3dish.as"

    #include "mod_layerbutton.hsp"

    #packopt xsize 480
    #packopt ysize 800

    	screen 0,480,800
    	// HSP3Dish.js用データフォルダ設定
    	info_os = sysinfo(0)
    	if instr(info_os,0,"Emscripten")>=0 : mm_dir="" : else : mm_dir="data/"

    	// 画像読み込み
    	celload mm_dir+"jujikey.png", -1
    	cel_juji = stat : celdiv cel_juji,64,64
    	celload mm_dir+"btn.png", -1
    	cel_btn = stat : celdiv cel_btn,64,64
    	celload mm_dir+"btn2x.png", -1
    	cel_btn2x = stat : celdiv cel_btn2x,128,128
    	celload mm_dir+"bean.png", -1
    	cel_bean = stat : celdiv cel_bean,64,42, 32,21

    	pxConL = 80            ; コントローラ表示位置の中心X座標
    	pyConL = ginfo_sy-90   ; コントローラ表示位置の中心Y座標
    	szConL = 1.0           ; コントローラのサイズ倍率
    	gosub *create_jujiCon  ; 十字キー作成

    	pxConR = ginfo_sx-60
    	pyConR = ginfo_sy-70
    	szConR = 1.0
    	gosub *create_btnCon   ; ボタン作成

    	myPx = ginfo_sx/2 : myPy = ginfo_sy/2  ; 自機位置
    // メインループ
    repeat
    	redraw 0 : color 255,255,255 : boxf : color : font msgothic,16
    	pos myPx, myPy : mes "●"  ; 自機
    	if shPy>0 : pos shPx, shPy : mes "▲" : shPy-=16  ; 弾
    	if bmSz>0 : bmSz+=50 : boxf bmPx-bmSz,bmPy-bmSz,bmPx+bmSz,bmPy+bmSz : if bmSz>800 : bmSz=0  ; ボム
    	if gamePause : gmode 3,,,100 : laybtn_boxfb 0,0,480,800 : color 255 : pos (ginfo_sx-pmx)/2*(-1+(pmx>0)*2),350 : mes "Pause" : pmx=ginfo_mesx
    	redraw 1
    	await 1000/60
    loop
    stop

    // 十字キー作成
    *create_jujiCon
    	; 左
    	pos pxConL-(szConL*68), pyConL-(szConL*32)
    	layerbutton szConL*64,szConL*64, 0,0 {
    		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea 5, 0,0, szConL*32,szConL*-32, szConL*56,szConL*32, szConL*32,szConL*96, 0,szConL*64  ; ヒットエリア調整 : 斜め入力できるように
    		if lparam == objlayer_cmddraw {
    			laybtn_ezcel cel_juji,0  ; ボタン描画
    			if gamePause : return  ; ポーズ中は操作させない
    			if layerbtn_stat & LAYBTN_PRESS_IN {
    				myPx -= 3
    			}
    		}
    		return
    	}
    	; 上
    	pos pxConL-(szConL*32), pyConL-(szConL*68)
    	layerbutton szConL*64,szConL*64, 1,0 {
    		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea 5, 0,0, szConL*64,0, szConL*96,szConL*32, szConL*32,szConL*56, szConL*-32,szConL*32  ; ヒットエリア調整 : 斜め入力できるように
    		if lparam == objlayer_cmddraw {
    			laybtn_ezcel cel_juji,3
    			if gamePause : return  ; ポーズ中は操作させない
    			if layerbtn_stat & LAYBTN_PRESS_IN {
    				myPy -= 3
    			}
    		}
    		return
    	}
    	; 右
    	pos pxConL+(szConL*4), pyConL-(szConL*32)
    	layerbutton szConL*64,szConL*64, 2,0 {
    		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea 5, szConL*8,szConL*32, szConL*32,szConL*-32, szConL*64,0, szConL*64,szConL*64, szConL*32,szConL*96  ; ヒットエリア調整 : 斜め入力できるように
    		if lparam == objlayer_cmddraw {
    			laybtn_ezcel cel_juji,6
    			if gamePause : return  ; ポーズ中は操作させない
    			if layerbtn_stat & LAYBTN_PRESS_IN {
    				myPx += 3
    			}
    		}
    		return
    	}
    	; 下
    	pos pxConL-(szConL*32), pyConL+(szConL*4)
    	layerbutton szConL*64,szConL*64, 3,0 {
    		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea 5, szConL*32,szConL*8, szConL*96,szConL*32, szConL*64,szConL*64, 0,szConL*64, szConL*-32,szConL*32  ; ヒットエリア調整 : 斜め入力できるように
    		if lparam == objlayer_cmddraw {
    			laybtn_ezcel cel_juji,9
    			if gamePause : return  ; ポーズ中は操作させない
    			if layerbtn_stat & LAYBTN_PRESS_IN {
    				myPy += 3
    			}
    		}
    		return
    	}
    	return

    // ボタン作成
    *create_btnCon
    	; A (shot)
    	pos pxConR-(szConR*48), pyConR-(szConR*48)
    	layerbutton szConR*96,szConR*96, 0,1 {
    		laybtn_settings 0,4+8,1+4  ; 設定 : 同グループ押下中ならボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x  ; 円形ヒットエリア
    		if lparam == objlayer_cmddraw {
    			font msgothic,24,1 : color 200,200,200
    			laybtn_ezcel cel_btn2x,0, "Shot"
    			if gamePause : return  ; ポーズ中は操作させない
    			if (layerbtn_stat & LAYBTN_PRESS_IN)!=0 && layerbtn_cnt == 0 {
    				if shPy <= 0 : shPx = myPx : shPy = myPy  ; 弾の座標設定 (弾は画面内に一発だけ)
    			}
    		}
    		return
    	}
    	; B (bomb)
    	pos pxConR-(szConR*120), pyConR-(szConR*16)
    	layerbutton szConR*64,szConR*64, 1,1 {
    		laybtn_settings 0,4+8,1+4  ; 設定 : 同グループ押下中ならボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x  ; 円形ヒットエリア
    		if lparam == objlayer_cmddraw {
    			font msgothic,16,1 : color 200,200,200
    			laybtn_ezcel cel_btn,0, "Bomb"
    			if gamePause : return  ; ポーズ中は操作させない
    			if (layerbtn_stat & LAYBTN_PRESS_IN)!=0 && layerbtn_cnt == 0 {
    				if bmSz <= 0 : bmPx = myPx : bmPy = myPy : bmSz = 50  ; ボムの座標サイズを設定 (ボム中は変えない[サイズが0より大きいとき])
    			}
    		}
    		return
    	}
    	; menu
    	pos pxConR+(szConR*-5), pyConR-(szConR*90)
    	layerbutton szConR*64,szConR*42, 2,1 {
    		laybtn_settings 0,2,1+4  ; 設定 : マウスクリックで即決定 + ボタンを押しても消さない
    		laybtn_hitarea -3, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x,objlayer_size_y, 20.0/180.0*M_PI  ; ヒットエリア
    		if lparam == objlayer_cmddraw {
    			font msgothic,20 : color 200,200,200
    			pos objlayer_axis_x+objlayer_size_x/2, objlayer_axis_y+objlayer_size_y/2
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_FOCUS_IN : id_celdiv = 1 : swbreak
    			case LAYBTN_PRESS_IN : id_celdiv = 2 : swbreak
    			default : id_celdiv = 0
    			swend
    			celput cel_bean, id_celdiv, szConR,szConR, 20.0/180.0*M_PI
    			laybtn_mes "≡",0, 1,1
    			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    				gamePause = 1 - gamePause  ; ポーズ切り替え
    			}
    		}
    		return
    	}
    	return