CC、タイムロック機能を実装するぞ


2017年 4月14日~5月1日
 
 
 よ~し、んでは再開するにあたってまず変更の柱である「タイムロック(Time Lock)機能」をつけてみるかいな、と。

 あ~ひさしぶりにプログラム触るので、何がなんだか。
 
 
 と、その前に世の中に他にタイムロックが無いか調べてみる。

 
 ああ、アプリでもタイムロックって色々あるのね。

 物理的な時間ロックの箱もあるのか「タイムロッキングコンテナ」ふ~ん。
 何々、コンセントに南京錠をかけて鍵をタイムロック箱に放り込む、なるほどよく考えるもんだな。

 ほほー親が遠隔操作で子供のスマホをロックできるアプリもあるのか「ディナータイム」
 なるほどねえ、これは LINE疲れを防止目的みたいだけど。

 ペアレンタル・コントロール、定番の「ドコモ あんしんモード」、ロックアプリ、ふむふむやはり色々やってるんだねえ。

 子供の側でロックを解除する方法とか、それを阻止するアプリ「AppLockの拡張機能 Advanced Protection」とか。

 「あんしんキッズロック」「まもるゾウ」「ミマモール」
 はあ、やっぱり色々やってるんですね。
 
 
 
それじゃあプログラム
 
 
 それでは、まず HSPで時間計測の gettimeをやってみる。

 gettime(n) の nの値で計測できる内容を変えられる。

repeat
 color 255,255,255 : boxf : color 1,1,1

 pos 100,100 : n=gettime(0) : mes "0 年 "+n
 pos 100,120 : n=gettime(1) : mes "1 月 "+n
 pos 100,140 : n=gettime(2) : mes "2 曜 "+n
 pos 100,160 : n=gettime(3) : mes "3 日 "+n
 pos 100,180 : n=gettime(4) : mes "4 時 "+n
 pos 100,200 : n=gettime(5) : mes "5 分 "+n
 pos 100,220 : n=gettime(6) : mes "6 秒 "+n
 pos 100,240 : n=gettime(7) : mes "7 微 "+n
 
 redraw 1 : redraw 0
 await 0
loop

 いつやってるか良く分かるね(笑)

 曜日の 3というのは水曜日だと思う。
 
 
 次に gettimeがスマホでも有効なのかどうか確認しないといけない。

 スマホ用のコンパイルはどうやるんだったか、もう忘れてるよ。

 という訳で自分で書いたものを参照する事にする。
 う~む、こりゃ便利。
 
 
 それじゃあ、ビルドして、スマホ(android)に転送して、スクリーンショットとって、と。

 うん、大丈夫みたい。
 
 
 
ゲームにタイムロック機能を実装してみる
 
 
 さて、どう実装しようか?

 これがメインルーチンだけど、メインルーチンの始まる前(データ読み込み前)にチェックプログラムをぶち込んでみるかな。
 う~む、増築工法でスパゲティプログラムの温床だが仕方ない。

 いや、まて、最初を mainf=8にして 8番目に書くのもアリだな、まあややこしくなるからいいか。
 
 
 まあこんな感じでいいかな。

 
 
 プログラムはこんな感じ

#deffunc time_lock ; タイムロック

	dim dtn,250

	exist "save.dat"
	 if strsize!-1 : bload "save.dat",dtn

	 tl_do=dtn(244)	; 最後の月
	 tl_dd=dtn(245)	; 最後の日
	 tl_ds=dtn(246)	; 何秒遊んだか

	tl_so=gettime(1)	; 月
	tl_sw=gettime(2)	; 曜日
	tl_sd=gettime(3)	; 日
	tl_sh=gettime(4)	; 時
	tl_sm=gettime(5)	; 分
	tl_ss=gettime(6)	; 秒

	if tl_do!tl_so or tl_dd!tl_sd : tl_ds=0	; 日が違えばプレイ時間を0にリセット

	if tl_do=tl_so and tl_dd=tl_sd and  tl_ds>=1800 : f=1 : return ; 今日の時間は終わり

	if tl_sh>=21 or tl_sh<5 : f=1 : return	; 21:00~5:00なら終わり

	repeat 1
	 if tl_sw=0 or tl_sw=6 : break		; 土日の場合はいいよ
	 if tl_sh>=8 and tl_sh<15 : f=1		; 平日の8~15時はダメよ
	loop
	if f=1 : return

	tl_s=(tl_sh*3600)+(tl_sm*60)+tl_ss	; 開始時間、合計秒

	return

 引数の dtnは CCの全データを扱ってる。
 全データに埋め込めば saveデータを消去してリセットされにくい。

 データは、月、日、プレイ時間、の 3つで大丈夫なようだ。

 今回は夜の 9時から朝の 5時まではゲームできない仕様にしたので、0時の日をまたぐ処理をしなくていい。
 もし日をまたいでゲームをするようなら、もう少し複雑になると思う。

 時間外なら f(フラグ)を 1にして戻して終了。

 計算のため時間は全部 s(秒)で換算して扱う。
  時間×3600秒 + 分×60秒 + 秒 = 合計秒
 
 
 次にプレイ中の時間計測プログラムは次の通り

#deffunc tl_check ; 終了時間判定

	tl_gh=gettime(4)	; 時
	tl_gm=gettime(5)	; 分
	tl_gs=gettime(6)	; 秒

	tl_g=(tl_gh*3600)+(tl_gm*60)+tl_gs	; 現時間。合計秒
	
	tl_n=tl_g-tl_s+tl_ds		; 遊んでいる時間


	if tl_n>=1800 : save : mainf=10	; 30分(1800秒)以上なら終わり

	if tl_gh>=21 or tl_gh<5 : save : mainf=10 : return	; 21:00~5:00なら終わり

	repeat 1
	 if tl_gw=0 or tl_gw=6 : break			; 土日の場合はいいよ
	 if tl_gh>=8 and tl_gh<15 : save : mainf=10	; 平日の8~15時はダメよ
	loop

	return

 今遊んでる時間(tl_n)は、現在時間(tl_g)- ゲーム起動時間(tl_s)+ saveされていたプレイ時間(tl_ds)で求められる。

 30分は 1800秒なので、それを越えたら終了となる。
 
 
 表示は 3分を切ったら赤色で秒のカウントダウンも表示する事にした。


 
 
 次に時間外なら TIME LOCK中である事の警告表示画面を作る。

 画面の作成は HSPを使ってベタベタな方法でやった。


 
 
 こんな感じ

 これを BMPSAVE命令を使って一度.bmp画像にしてから、本プログラムでは画像を読み込んで使う。
 
 
 それじゃあ、完成したのをスマホに入れて動作確認するかな。
 
 
 まあ、大丈夫かな。


 
 
 という訳でタイムロック機能実装はこれで終わり、ちょっと時間がかかったけど仕事止めてからペースを取り戻すのにいつも時間がかかります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です