# sample.hsp

sample\ sample.hsp

    #include "hsp3dish.as"

    #include "ezlocal-dish-js.hsp"
    ezLocalJS

    #packopt xsize 480
    #packopt ysize 800
    	;
    	;  HSP3同梱サンプル掛け合わせ
    	;  sample\hsp3dish\ obaqtest.hsp + mtouch.hsp
    	;
    	;    一定時間ごとにオブジェクトを追加
    	;    タッチでも追加（マルチタッチ情報表示）
    	;
    	screen 0, 480, 800
    	randomize		; 乱数の初期化
    	title "OBAQ Test"

    	qreset			; OBAQの初期化
    	frame=0
    	boxmax=30
    	boxnum=0
    	dim boxids, 1
    	mtcnum=0 : mae_mtcnum=0
    	key=0 : touch=0 : touchid=0
    	my=0 : gx=0 : gy=0 : ga=0
    	data="" : dummy=""

    	pos 380,5 : objsize 80, 30       ; ボタン表示
    	button goto "終了ボタン", *quit  ; アプリの終了 ＆ データ保存

    	gosub *data_load  ; 保存したデータがあれば読み込み

    *main
    	;	メインループ
    	;
    	stick key,15              ; キーの取得
    	if key&128 : goto *quit   ; [ESC]キーで終了 ＆ データ保存

    	redraw 0                  ; 画面の更新を開始
    	gradf ,,,,1,0,128         ; 画面クリア
    	qexec                     ; OBAQによるオブジェクトの更新

    	mtlist touchid            ; マルチタッチ
    	mtcnum=stat
    	if mae_mtcnum < mtcnum {  ; タッチしたらframeのカウントをゼロにしてオブジェクト投下
    		mtinfo touch, touchid(0)
    		if touch(1) < 350 || touch(2) > 40 : frame = 0    ; ただし終了ボタン周りのタッチはカウントリセットしない
    	}
    	mae_mtcnum = mtcnum
    	;	一定時間ごとに出現
    	if boxnum<boxmax {
    		if frame\100=0 {
    			qaddpoly my, 4, 32+32*(boxnum\3),24,0	,,,0  ; 多角形を追加
    			if my >= 0 {
    				boxids(boxnum) = my
    				qspeed my,0.1*rnd(10)-0.5,0,0.01          ; ランダムな方向に飛ばす
    				boxnum++
    			}
    		}
    	}else {
    		;	ボックス最大になったらボッシュート
    		if boxnum == boxmax : qborder -54,-90,54,500 : boxnum++    ; 外壁の底を外す
    		repeat boxmax
    			qgetpos boxids(cnt), gx, gy, ga : if gy < 250 : break  ; オブジェクト全て落ち切ってるか確認
    		loop
    		if gy >= 250 : qreset : boxnum = 0  ; obaqリセット
    	}

    	qdraw			; オブジェクトの描画

    	color 255,255,255
    	pos 0,0:mes "Frame:"+frame     ; フレーム数を表示
    	mes "("+mousex+","+mousey+")"  ; マルチタッチ情報を表示
    	y=16
    	repeat mtcnum
    		id = touchid(cnt)
    		mtinfo touch,id
    		mes "T:"+id+"("+touch(1)+","+touch(2)+") "+touch(3)
    		y+=10
    	loop

    	redraw 1        ; 画面の更新を終了
    	await 12        ; 一定時間待つ
    	frame++
    	goto *main

    // 保存したデータがあれば読み込み
    *data_load
    	exist "save/frame.txt"
    	if strsize == -1 : return
    	notesel data
    	noteload "save/frame.txt"
    	frame = int(data)  ; カウントしているframeを前回の続きからにしている
    	return

    // (Escキーor終了ボタン)アプリ終了前にdata保存
    *quit
    	// ★★★ ユーザーのブラウザへのデータ保存方法について ★★★
    	// HTML調整オプション「ブラウザ上にデータ保存できるようにする」を指定するとsaveフォルダのような物が作られそこに保存できるようになる。
    	// ・「save/ファイル名」を指定してテキスト等を保存できる。
    	// ・フォルダを含めたファイルパスを指定する場合「\\」ではなく「/」を使用する。
    	// ・「chdir "save" : notesave "frame.txt"」などカレントフォルダの移動が可能。
    	// ・chdir "/save" とすると絶対パス扱いで一番親であるsaveフォルダに移動できる。
    	//   (chdir "/" でsaveフォルダの1つ上のフォルダに移動できる。起動時の初期位置)
    	// ・保存を有効にするために必ず「devcontrol "syncfs"」を実行する必要がある。
    	;dirlist dummy,"save",5 : if stat == 0 : mkdir "save"  ; ← Windowsアプリとして実行するとき用。
    	data = ""+frame
    	notesel data
    	notesave "save/frame.txt"
    	devcontrol "syncfs"
    	dialog "「ブラウザ上にデータ保存できるようにする」を選択している場合Frameが保存され次回起動時に引き継がれます"
    	end
    	// ・ブラウザに保存されているデータを確認したい場合は、ブラウザ(ここではMicrosoft Edge)の メニュー＞その他のツール＞開発者ツール を起動。
    	//   「要素」「コンソール」などの並びの後ろのほうにある「アプリケーション」タブを開き ストレージ＞IndexedDB＞/save＞FILE_DATA を確認すると
    	//   「キー」と「値」が表示され、これが「ファイル名」と「データ」に相当する。
    	//   「contents: Int8Array」のところでメモリダンプのような形で確認でき、その行の右端の方にある小さいアイコン「メモリインスペクターパネルで表示」
    	//   をクリックすると画面下部に詳細が表示される。
    	//   アルファベットなどは確認できるが日本語は表示されない。メモリを見るにUTF-8文字列で保存されている模様。ここに表示されないだけで日本語でもちゃんと取り出せる。