HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0127
みそしるにあんこキー入力でループから脱出3解決


みそしるにあんこ

リンク

2021/1/27(Wed) 14:17:09|NO.92161

はじめまして、HSP(3.5.1.0)を使用している者です。

repeat-loopの繰り返しをキー押しで抜けるように設計を試みているのですが
キーを押しても反応せず、ループが繰り返される状況です。
参考にできそうな情報を発見できなかったため、質問させていただきました。

想定している事柄は以下の通りです。
・正方形を1秒間隔で3つ描画することを繰り返し、Aキーの入力によりループを抜ける。
・Aキーが入力されたタイミングではなく、入力があった周で繰り返しを終了する。
(例えば、繰り返し3回目、1つ目の正方形が描画されたタイミングでキーが押された場合、
3つ目の正方形を描画してからbreak)
・キー押しがあったタイミングで、timeGetTime()により時間を記録する。

現在のスクリプトはこのようになっています。


#const ITI 1000 #uselib "winmm.dll" #cfunc timegettime "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int timeBeginPeriod 1 bgscr 1, ginfo_dispx, ginfo_dispy await ITI repeat getkey A, 65 if A = 1 : break cls 0 await ITI boxf ginfo_dispx/2-250, ginfo_dispy/2-50, ginfo_dispx/2-150, ginfo_dispy/2+50 await ITI boxf ginfo_dispx/2-50, ginfo_dispy/2-50, ginfo_dispx/2+50, ginfo_dispy/2+50 await ITI boxf ginfo_dispx/2+150, ginfo_dispy/2-50, ginfo_dispx/2+250, ginfo_dispy/2+50 await ITI loop timeEndPeriod 1 end

どなたか知恵をお貸しいただければ幸いです。
初の投稿なので不備があるかもしれません、ご指摘お願いいたします。



この記事に返信する


沢渡

リンク

2021/1/27(Wed) 15:08:50|NO.92162

そのコードだと、Aキーを押しているかどうかの判定が4秒(=4000ms)に1回しか行われないので、
Aキーをずっと押しっぱなしにして、かつ3つめの四角形が表示されたタイミングでないと
ループから脱出されません。
こんな感じで、秒間30回の判定を行うようにすればどうでしょう。
(getkeyではなくonkeyで入力判定を行ってもよし)

#const ITI 1000 #uselib "winmm.dll" #cfunc timegettime "timeGetTime" screen 1, ginfo_dispx, ginfo_dispy //処理終了後自分でウィンドウを閉じられるようにscreenに変更しました await ITI phase=3 //フェイズ flag=0 //Aキーを押したフラグ s=timegettime() //開始時の時間 i=0 //Aキーを押した時の時間 c=s //時間がこの値以上になったらフェイズを進行 repeat getkey A, 65 if A : flag=1 : i=timegettime() if timegettime()>=c { phase++ if phase>3 : phase=0 c+=ITI if (phase=0)&flag : break switch phase case 0 cls 0 swbreak case 1 boxf ginfo_dispx/2-250, ginfo_dispy/2-50, ginfo_dispx/2-150, ginfo_dispy/2+50 swbreak case 2 boxf ginfo_dispx/2-50, ginfo_dispy/2-50, ginfo_dispx/2+50, ginfo_dispy/2+50 swbreak case 3 boxf ginfo_dispx/2+150, ginfo_dispy/2-50, ginfo_dispx/2+250, ginfo_dispy/2+50 swbreak swend } await 33 loop mes str(i-s)+"ms" //開始からAキーを押すまでの時間を表示 stop



ウンチョコレートカカオ

リンク

2021/1/27(Wed) 16:02:23|NO.92163

こんな感じでどうでチョコ?

#const ITI 1000 #uselib "winmm.dll" #cfunc timegettime "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int timeBeginPeriod 1 bgscr 1, ginfo_dispx, ginfo_dispy await ITI count=1 sdim hoge notesel hoge repeat if count=1:{ color 255,255,255 boxf color 0,0,0 } if count=ITI:{ boxf ginfo_dispx/2-250, ginfo_dispy/2-50, ginfo_dispx/2-150, ginfo_dispy/2+50 } if count=ITI*2:{ boxf ginfo_dispx/2-50, ginfo_dispy/2-50, ginfo_dispx/2+50, ginfo_dispy/2+50 } if count=ITI*3:{ boxf ginfo_dispx/2+150, ginfo_dispy/2-50, ginfo_dispx/2+250, ginfo_dispy/2+50 count=-1000 } stick A if A & 16384 : break count++ _cnt=cnt await 1 loop timeEndPeriod 1 piyo=""+double(_cnt)/1000 hoge="Aキーを押すまで: "+strf("%3.2f",piyo)+"秒" notesave "hoge.txt" end



みそしるにあんこ

リンク

2021/1/27(Wed) 19:27:55|NO.92170

お二方とも回答していただきありがとうございます。

沢渡様のスクリプトを実行してみたところ、
想定していた動きが確認できました。
スクリプトの構造に関しては勉強不足でありますゆえ、
じっくりと学ばせていただきます。

チョコ様
大変申し上げにくいのですが、チョコ様のスクリプトでは
期待していた動作が認められませんでした。
私の環境にも原因があるのかもしれませんが…
一応、実行して気づいた点を記述させていただきます。

・Aキーを押してもループを抜けることができませんでした。
・正方形描画のインターバルがやや遅いように感じました。

私が浅学であるため、スクリプト上の問題点に言及できないことを深くお詫び申し上げます。

このスレッドは解決済みとさせていただきます。
改めまして、ご協力くださりありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.