トピック
beans taku-binzu

質問です。

頭を捻ってもプログラムが思い付かなかったので、質問させて頂きます。 今、キッチンタイマーみたいに、1秒ずつ時間が減っていくプログラムを作りたいと思っています。 ですが、1秒ずつ時間を減らす方法が分かりません。回答お願いします。
0そうだね
プレイ済み
返信[1]
親投稿
ケイン KEIN.HORGAN
メインループの始めか終わりかで現在の時刻を取得して(TIME$)、前回取得時から1秒経過していたら表示を更新すればいいと思います。
0そうだね
プレイ済み
返信[2]
親投稿
ヒント:VSYNCやWAITで時間を調節できる
0そうだね
プレイ済み
返信[3]
親投稿
beans taku-binzu
あ、ヒントのお陰でプログラムが出来ました。ありがとうございました!
0そうだね
プレイ済み
返信[4]
親投稿
beans taku-binzu
[追記] 追加の質問です。すいません。 例えばゲームとかである、「5秒経ったらメニュー画面に戻る」みたいな事をしたい時も、あまさとさんの様に、VSYNCやWAITを使うのでしょうか? それとも、ケインさんの様にTIME$を使うのですか?
0そうだね
プレイ済み
返信[5]
親投稿
beans taku-binzu
[追記] プログラムの写真の貼り直しです。
0そうだね
プレイ済み
返信[6]
親投稿
みむ*mim hidemimtp
やり方は何通りかあると思いますが、単純に1秒単位なら、メインループ内に「VSYNC 60」と書いておけば、ループ1回転が約1秒になるので、それが一番簡単かな?
0そうだね
プレイ済み
返信[7]
親投稿
ケイン KEIN.HORGAN
自分のやりやすいようにやったらいいと思います。
1そうだね
プレイ済み
返信[8]
親投稿
みむ*mim hidemimtp
あ、回答書いている間にもう終わってた(笑)
0そうだね
プレイ済み
返信[9]
親投稿
あんど AND1GOUKI
プログラムの動作がどのような状況でカウントダウンするのか・・・それが重要な気がしますが。。。 私がカウントダウンタイマー機能をプログラムした時は、最初のケインさんの方法に近い方法を採用していたりします。
0そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
「1秒待つプログラム」ならば個人的にはVSYNC 60よりもWAIT 60をオススメします。 VSYNC 60は前回のVSYNCからの経過時間となるため前回VSYNCもしくはWAITを実行してから1秒以上経っていればVSYNCはスルーされるのに対してWAIT 60は確実に約1秒待ってくれるからです。 「5秒経ったら○○する」というのはWAIT 300の後に○○に相当する処理を書けば簡単に出来ますが、5秒以内であってもAボタンを押せばスキップ可能にしたいというのであればWAIT 1をループで最大300回実行(Aボタンを押したらループを抜ける)というのがベターだと思います。 とはいえ、どんな処理をするかによってTIME$、WAIT、MAINCNTのどれがベターかが変わると思います。
0そうだね
プレイ済み
返信[11]
親投稿
KU kerorinU
・waitやvsyncで待つ方法 ・time$で測る方法 ・maincntで測る方法 これら以外にもいろいろあります。測る方法も、modを使う方法や計測用変数を使う方法など様々だし。
0そうだね
プレイ済み
返信[12]
親投稿
MAINCNTというのがあります。プチコンを起動してからどれだけ経ったかを調べる変数です。 これは1/60でカウントされますので M=MAINCNT @L IF M+6<=MAINCNT THEN @E GOTO @L @E END これで0.1秒しか数えませんがこの@Eにまた命令を加えるなどでお望みの物が作れるかと。
0そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
maincnt は符号付き 32bit 整数かな? だとしたら、みけらんジェロさんのコードは無限ループする場合があります。 wrap する値を比較する場合は、加算使っちゃだめです。 M+6 <= maincnt ではなく 6 <= maincnt-m としないとダメです。 ∵たまたま m = 2^31-1 になった場合 m+6 は 2^31+5 になりますが、maincnt は 2^31-1 の次は -2^31 になるので、絶対に m+6 <= maincnt は真になりません。
0そうだね
プレイ済み
返信[14]
親投稿
れい rei-nntnd
vsyncやwaitは1/60から結構ずれてるので、長い間待つ必要があるときは要注意。 これらは垂直同期を待つ関数で一定時間をまつ関数じゃない。 時刻を正確に知るにはTIME。
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
確かにWAITやVSYNCは実時間と比較して0.3%くらいずれているので正確な時間は計測できないですね。 タイマーとして使用する場合に5分で約0.8秒ずれるのでこれが実用になるかどうかで判断すれば良いと思います。
0そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
有用な情報が色々出てるので勝手ながら整理してみようと思います。 (間違ってましたらどなたかツッコミをば) ・TIME$変数を見る  ○時間は正確  ×1秒単位でしか計れない  ×一定時間の判定が地味に面倒 ・WAIT命令を使う(=MAINCNT)  ○お手軽  ×5分で0.8秒の誤差がある  ×待ちながら他に何かする時はWAIT 1でループ回す必要ある MAINCNTを見るのは実質WAIT命令と全く同じという事でまとめさせてもらいました。 あとMMLの変数だか使って正確でかつ1秒未満の細かい時間計れるとか聞いた気がするのですがすみません私は全くわかりません(´ω`)
0そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
BGMVARやMICPOSを使えば1ミリ秒単位での計測も可能ですが、誤差もそれなりにあるため用途はかなり限られそうです。 あとMAINCNTとTIME$を併用すれば長時間を正確に計測、かつ、1フレーム単位での計測も可能です。
0そうだね
プレイ済み
返信[18]
親投稿
beans taku-binzu
[追記] 返信が遅れてしまいました。すいません。コメントをして下さった皆様、ありがとうございました。 なお、このコメントをもちまして受付を終了させて頂きます。
0そうだね
プレイ済み