投稿
おちゃめ ochame_nako
初心者の質問によく出てくる「Aボタンを押したら次の画面に進む」というのが、簡単にできるAWAIT命令を作りました。 AWAIT 60とするだけでAボタンが押されるか60フレーム(1秒)経つまで待ちます。 時間制限はしない場合はAWAIT 0とすればAボタンが押されるまでひたすら待ちます。
10そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
初心者向けに動作の解説をしておきます。 REPEAT~UNTILのループの中にWAIT(WAIT 1)を挟むことでその引数の回数ほどループしているというだけです。 ループの終了条件は「BUTTON(2)AND 16が0以外の値」もしくは「Tの値が0」となっています。(!Tとすることで「Tの値が0の時」という条件になる) 「BUTTON(2)AND 16が0以外の値」というのは、Aボタンを押した場合に限られます。 Tの値が0の時というのはTの値をデクリメント(1ずつ減算)したときに初期のTの回数だけループを実行することになります。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
ここで問題は時間設定をしない場合はAボタンを押すまでひたすら待つようにするため無限ループにしたいということです。 AWAIT 0とするとループに入る前のTの初期値は0で1回目のループ内でTの値は-1になり、ループを繰り返せばどんどん小さな値になるため0になることは決してありません。 したがって、AWAIT 0で無限ループができるわけです。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
REPEAT~UNTILではなくWHILE~WENDではダメなのかと思う人もいるでしょう。 AWAIT命令をWHILE~WENDを使って記述したら次のようになります。 終了条件は「BUTTON(2)AND 16が0以外」もしくは「Tの値が0」で同じです。 DEF AWAIT T  WHILE !(BUTTON(2)AND 16)&& T   DEC T   WAIT  WEND END REPEAT~UNTILとWHILE~WENDは似たような命令ですが、初期段階で終了条件を満たしているか否かでループ内を1回実行するかスキップされるかという違いがあります。 その1回でこの場合は0フレームのウェイトと無限のウェイトという大きな差が発生しています。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
あと細かい部分を言えばWHILE~WENDだとWAITやVSYNCを挟まずにAWAIT命令が複数連続する場合には正しくAボタン待ちができない場合があります。 REPEAT~UNTILだとループ内が最低1回実行されるのが保証されるためWAIT 1の実行によってそのような誤動作の心配はありません。(WHILE~WENDの場合は別途WAITかVSYNCが必要) したがって、WHILE~WENDかREPEAT~UNTILかはループ終了条件を最初から満たしているときループ内を実行して欲しいか欲しくないかで選ぶのが良いと思います。 ループ内を実行しない方が良い場合はWHILE~WENDを使用しましょう。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
このように書くとこのAWAITのループ処理はWHILE~WENDではなくREPEAT~UNTILを使用するのが正解と感じる人もいるかもしれないけどそんなことはないです。 DEF AWAIT T  WHILE 1   DEC T   WAIT   IF BUTTON(2)AND 16 || !T THEN BREAK  WEND END WHILE 1~WENDという無限ループの間を作りWENDの前の行(DEC TやWAITより後の行)に終了条件を記述してBREAKすればREPEAT~UNTILと同じ動作をします。
0そうだね
プレイ済み