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画像にしてから、本プログラムでは画像を読み込んで使う。
それじゃあ、完成したのをスマホに入れて動作確認するかな。
まあ、大丈夫かな。
という訳でタイムロック機能実装はこれで終わり、ちょっと時間がかかったけど仕事止めてからペースを取り戻すのにいつも時間がかかります。