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文字列で保存されている模様。ここに表示されないだけで日本語でもちゃんと取り出せる。