# 08 sample_vpad-jujikey-noimg.hsp

sample\ 08 sample_vpad-jujikey-noimg.hsp

    #include "hsp3dish.as"

    #include "mod_layerbutton.hsp"

    #packopt xsize 480
    #packopt ysize 800

    	screen 0,480,800

    	pxConL = 80  ; コントローラ表示位置の中心X座標
    	pyConL = ginfo_sy-90  ; コントローラ表示位置の中心Y座標
    	szConL = 1.0  ; コントローラのサイズ倍率
    	opConL = 0  ; タッチエリア範囲確認フラグ
    	gosub *create_jujiCon

    	pxConR = ginfo_sx-60
    	pyConR = ginfo_sy-70
    	szConR = 1.0
    	gosub *create_btnCon

    repeat
    	redraw 0 : color 255,255,255 : boxf : color : pos 10,0 : font msgothic,17
    	mes "左を押したフレーム数: "+hidari
    	mes "上を押したフレーム数: "+ue
    	mes "右を押したフレーム数: "+migi
    	mes "下を押したフレーム数: "+shita
    	mes "Aを押したフレーム数: "+aaa
    	mes "Bを押したフレーム数: "+bbb
    	mes "メニューを押した回数: "+mmm
    	redraw 1
    	await 1000/60
    loop

    // 十字キー作成
    *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 {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
    			swend
    			boxfao 0,0, szConL*32,szConL*64,  objlayer_axis_x, objlayer_axis_y
    			trianglefao szConL*32,0, szConL*64,szConL*32, szConL*32,szConL*64,  objlayer_axis_x, objlayer_axis_y
    			if opConL {  ; タッチエリア表示
    				arr = 0,0, int(szConL*32),int(szConL*-32), int(szConL*56),int(szConL*32), int(szConL*32),int(szConL*96), 0,int(szConL*64), 0,0
    				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
    			}
    			if layerbtn_stat == LAYBTN_PRESS_IN {
    				hidari++
    			}
    		}
    		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 {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
    			swend
    			boxfao 0,0, szConL*64,szConL*32,  objlayer_axis_x, objlayer_axis_y
    			trianglefao szConL*64,szConL*32, szConL*32,szConL*64, 0,szConL*32,  objlayer_axis_x, objlayer_axis_y
    			if opConL {  ; タッチエリア表示
    				arr = 0,0, int(szConL*64),0, int(szConL*96),int(szConL*32), int(szConL*32),int(szConL*56), int(szConL*-32),int(szConL*32), 0,0
    				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
    			}
    			if layerbtn_stat == LAYBTN_PRESS_IN {
    				ue++
    			}
    		}
    		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 {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
    			swend
    			boxfao szConL*32,0, szConL*64,szConL*64,  objlayer_axis_x, objlayer_axis_y
    			trianglefao szConL*32,szConL*64, 0,szConL*32, szConL*32,0,  objlayer_axis_x, objlayer_axis_y
    			if opConL {  ; タッチエリア表示
    				arr = int(szConL*8),int(szConL*32), int(szConL*32),int(szConL*-32), int(szConL*64),0, int(szConL*64),int(szConL*64), int(szConL*32),int(szConL*96), int(szConL*8),int(szConL*32)
    				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
    			}
    			if layerbtn_stat == LAYBTN_PRESS_IN {
    				migi++
    			}
    		}
    		return
    	}
    	; 下
    	pos pxConL-(szConL*32), pyConL+(szConL*4)
    	layerbutton szConL*64,szConL*64, 3,1 {
    		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 {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
    			swend
    			boxfao 0,szConL*32, szConL*64,szConL*64,  objlayer_axis_x, objlayer_axis_y
    			trianglefao 0,szConL*32, szConL*32,0, szConL*64,szConL*32,  objlayer_axis_x, objlayer_axis_y
    			if opConL {  ; タッチエリア表示
    				arr = int(szConL*32),int(szConL*8), int(szConL*96),int(szConL*32), int(szConL*64),int(szConL*64), 0,int(szConL*64), int(szConL*-32),int(szConL*32), int(szConL*32),int(szConL*8)
    				color ginfo_r-20,ginfo_g-20,ginfo_b-20 : lineArray arr,6, objlayer_axis_x,objlayer_axis_y
    			}
    			if layerbtn_stat == LAYBTN_PRESS_IN {
    				shita++
    			}
    		}
    		return
    	}
    	return

    // ボタン作成
    *create_btnCon
    	; A
    	pos pxConR-(szConR*48), pyConR-(szConR*48)
    	layerbutton szConR*96,szConR*96, 0,1 {
    		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x  ; 円形ヒットエリア
    		if lparam == objlayer_cmddraw {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : objcolor 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : objcolor 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : objcolor 250,190, 70 : swbreak
    			swend
    			circlefao objlayer_axis_x, objlayer_axis_y, objlayer_axis_x+objlayer_size_x, objlayer_axis_y+objlayer_size_y, 8
    			font msgothic,20,1 : laybtn_mes "Ａ",4+16, 1,1
    			if layerbtn_stat == LAYBTN_PRESS_IN {
    				aaa++
    			}
    		}
    		return
    	}
    	; B
    	pos pxConR-(szConR*124), pyConR-(szConR*16)
    	layerbutton szConR*64,szConR*64, 1,1 {
    		laybtn_settings 0,4,1+4  ; 設定 : ボタン外からスライドしてもクリック + ボタンを押しても消さない
    		laybtn_hitarea -1, objlayer_size_x/2,objlayer_size_y/2, objlayer_size_x  ; 円形ヒットエリア
    		if lparam == objlayer_cmddraw {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : objcolor 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : objcolor 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : objcolor 250,190, 70 : swbreak
    			swend
    			circlefao objlayer_axis_x, objlayer_axis_y, objlayer_axis_x+objlayer_size_x, objlayer_axis_y+objlayer_size_y, 6
    			font msgothic,20,1 : laybtn_mes "Ｂ",4+16, 1,1
    			if layerbtn_stat == LAYBTN_PRESS_IN {
    				bbb++
    			}
    		}
    		return
    	}
    	; menu
    	pos pxConR+(szConR*-13), pyConR-(szConR*95)
    	layerbutton szConR*67,szConR*50, 2,1 {
    		laybtn_settings 0,0,5
    		laybtn_hitarea 6, szConR*2,szConR*34, szConR*10,szConR*1, szConR*42,szConR*6, szConR*65,szConR*19, szConR*55,szConR*51, szConR*33,szConR*39  ; ヒットエリア
    		if lparam == objlayer_cmddraw {
    			gmode 3,,,150
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN : color 190,175,230 : swbreak
    			case LAYBTN_PRESS_IN : color 250,190, 70 : swbreak
    			swend
    			arr = szConR*6,szConR*35, szConR*3,szConR*31, szConR*9,szConR*4, szConR*12,szConR*2, szConR*42,szConR*6, szConR*62,szConR*17, szConR*64,szConR*21, szConR*56,szConR*47, szConR*52,szConR*49, szConR*33,szConR*39, szConR*6,szConR*35
    			lineArray arr,11, objlayer_axis_x,objlayer_axis_y
    			font msgothic,20,1 : laybtn_mes "≡",16, 1,1, 3,-1
    			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    				laybtn_enable 0, 0  ; バーチャルパッドを操作無効にする
    				laybtn_enable 1, 0  ;
    				gosub *create_pausemenu  ; ポーズメニュー画面の作成
    				mmm++
    			}
    		}
    		return
    	}
    	return

    // ポーズメニュー画面作成
    *create_pausemenu
    	; メニュー画面全体 (グループ:2)
    	pos 0,0
    	layerbutton ginfo_sx,ginfo_sy, 0,2 {
    		laybtn_settings 1,1,0  ; 設定 : キー/マウス操作無効
    		if lparam == objlayer_cmddraw {
    			font msgothic,20,1 : color 255,255,255
    			laybtn_ezbox $AA000000,$AA000000,$AA000000, "Pause Menu",0, 0,-150,,,0  ; 半透明黒で画面全体を覆う(角丸なし長方形)
    		}
    		return
    	}
    	; タッチエリア表示 (グループ:3)
    	pos 100, 370
    	layerbutton 320,40, 0,3 {
    		laybtn_settings 0,2,1  ; 設定 : 押しても消さない
    		if lparam == objlayer_cmddraw {
    			color 200,200,200
    			font msgothic,18,0 : laybtn_mes "十字キーのタッチエリア表示 :　",1, 0,1
    			gmode 3,,,256
    			switch (layerbtn_stat|1^1)  ; _SELECTED状態を除去して分岐 [(layerbtn_stat & $FFFE)でもOK]
    			case LAYBTN_SHOW_IN  : color 200,200,220 : swbreak
    			case LAYBTN_FOCUS_IN :
    			case LAYBTN_PRESS_IN : color 190,175,230 : swbreak  ; FOCUSもPRESSも同じ色にする
    			swend
    			boxfao ginfo_cx,objlayer_axis_y, ginfo_cx+objlayer_size_y,objlayer_axis_y2  ; laybtn_mesで書いた文字の隣に描画
    			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {
    				opConL = 1 - opConL  ; タッチエリア表示オプションのON/OFF
    			}
    			if opConL {
    				font msgothic,20,1 : color : objcolor 0,0,0
    				pos ginfo_cx+10, : mes "レ",4  ; 簡易的にレ点でチェックマーク
    			}
    		}
    		return
    	}
    	; 閉じる (グループ:3)
    	pos 140, 470
    	layerbutton 200,40, 1,3 {
    		if lparam == objlayer_cmddraw {
    			font msgothic,20,1 : color
    			laybtn_ezbox $C8C8DC, $BEAFE6, $FABE46, "閉じる"
    			if layerbtn_stat & LAYBTN_COMPLETE {
    				laybtn_enable 0, 1  ; バーチャルパッドの操作を有効にする
    				laybtn_enable 1, 1
    				laybtn_hide 2  ; グループ2のオブジェクトを非表示処理 (閉じるボタン[グループ3]は押したら消える)
    			}
    		}
    		return
    	}
    	return

    // 描画モジュール
    #module
    #deffunc lineArray array arr, int p1, int ox, int oy
    	pos ox+arr(0),oy+arr(1)
    	repeat limit(p1-1,0,length(arr)/2-1),1
    		line ox+arr(cnt*2),oy+arr(cnt*2+1)
    	loop
    	return
    #deffunc boxfao int ax, int ay, int bx, int by, int ox, int oy
    	pdx=ax+ox,bx+ox,bx+ox,ax+ox
    	pdy=ay+oy,ay+oy,by+oy,by+oy
    	gsquare -1,pdx,pdy
    	return
    #deffunc trianglefao int ax, int ay, int bx, int by, int cx, int cy, int ox, int oy
    	pdx=ax+ox,bx+ox,cx+ox,ax+ox
    	pdy=ay+oy,by+oy,cy+oy,ay+oy
    	gsquare -1,pdx,pdy
    	return
    #deffunc quadfao int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy, int ox, int oy
    	pdx=ax+ox,bx+ox,cx+ox,dx+ox
    	pdy=ay+oy,by+oy,cy+oy,dy+oy
    	gsquare -1,pdx,pdy
    	return
    #deffunc circlefao int x1, int y1, int x2, int y2, int thick, int div, int ox, int oy
        dcx = double(x1 + x2) / 2.0 + ox
        dcy = double(y1 + y2) / 2.0 + oy
        rx = absf(x2 - x1) / 2.0
        ry = absf(y2 - y1) / 2.0
        if rx < 1 || ry < 1 : return
    	div_ = div : if div_ <= 0 : div_ = limit((rx+ry)/4, 12, 128)
    	if thick == 1 {
    		repeat div_
    			ang1 = 2.0 * M_PI * cnt / div_
    			ang2 = 2.0 * M_PI * (cnt+1) / div_
    			x3 = dcx + cos(ang1) * rx
    			y3 = dcy + sin(ang1) * ry
    			x4 = dcx + cos(ang2) * rx
    			y4 = dcy + sin(ang2) * ry
    			trianglefao dcx, dcy, x3, y3, x4, y4
    		loop
    		return
    	}
    	thick_ = double(thick)
        if thick_ < 1 : thick_ = 1.0
        rx1 = rx - thick_/2.0
        ry1 = ry - thick_/2.0
        rx2 = rx + thick_/2.0
        ry2 = ry + thick_/2.0
        if rx1 < 0 : rx1 = 0
        if ry1 < 0 : ry1 = 0
        repeat div_
            ang1 = 2.0 * M_PI * cnt / div_
            ang2 = 2.0 * M_PI * (cnt+1) / div_
            ox1 = dcx + cos(ang1) * rx2
            oy1 = dcy + sin(ang1) * ry2
            ox2 = dcx + cos(ang2) * rx2
            oy2 = dcy + sin(ang2) * ry2
            ix2 = dcx + cos(ang2) * rx1
            iy2 = dcy + sin(ang2) * ry1
            ix1 = dcx + cos(ang1) * rx1
            iy1 = dcy + sin(ang1) * ry1
            quadfao ox1,oy1, ox2,oy2, ix2,iy2, ix1,iy1
        loop
    	return
    #deffunc rboxfao int x1, int y1, int x2, int y2, int r, int div, int ox, int oy
    	div_ = div : if div_ <= 0 : div_ = limit(6+(r-5)*(12-6)/(25-5), 6,12)
    	boxfao x1+r, y1, x2-r, y2, ox,oy
    	boxfao x1, y1+r, x1+r, y2-r, ox,oy
    	boxfao x2-r, y1+r, x2, y2-r, ox,oy
    	repeat 4
    		if cnt=0 : cx=x1+r : cy=y1+r : ang0=180.0
    		if cnt=1 : cx=x2-r : cy=y1+r : ang0=270.0
    		if cnt=2 : cx=x2-r : cy=y2-r : ang0=0.0
    		if cnt=3 : cx=x1+r : cy=y2-r : ang0=90.0
    		repeat div_
    			ang1 = ang0 + 90.0 * cnt/div_
    			ang2 = ang0 + 90.0 * (cnt+1)/div_
    			x3 = cx + cos(ang1/180.0*M_PI)*r
    			y3 = cy + sin(ang1/180.0*M_PI)*r
    			x4 = cx + cos(ang2/180.0*M_PI)*r
    			y4 = cy + sin(ang2/180.0*M_PI)*r
    			trianglefao cx,cy, x3,y3, x4,y4, ox,oy
    		loop
    	loop
    	return
    #deffunc rboxfao_auto int x1, int y1, int x2, int y2, int ox, int oy
    	w = abs(x2 - x1)
    	h = abs(y2 - y1)
    	r = (w+h)/40
    	if r > w/2 : r = w/2
    	if r > h/2 : r = h/2
    	if r < 1 : r = 1
    	rboxfao x1,y1,x2,y2, r,0, ox,oy
    	return
    #global