これはいいひっかけ問題だ(・ω・)結構悩んでしまった。
このソースをそのまま上から読みます。
開始時点でlooplev==0,sublev==0とします。
("="は代入、"=="は比較として書いている)
1. ボタンの設置
2. auto_f = 1
3. repeat内へ (looplev==1,sublev==0)
4. ボタンを押すと"wait150"のタイミングで*autoへ (looplev==1,sublev==1)
(*next_へ最低一回は飛ぶ)
5. auto_f = 0
6. repeat内へ (looplev==2,sublev==1)
7. auto_f==0 なので break (looplev==1,sublev==1)
8. return (1回目のrepeat内へ)(looplev==1,sublev==0)
9. auto_f==0 なので break (looplev==0,sublev==0)
10. return あれれ?sublev==0でreturnってなーにー?
ということでエラーが出るみたいです。
このソースへの突っ込みが何点か。
・単に、ボタンを押すたびに再生と停止を切り替えたいなら、別の方法がありそう(後述)
・repeat 10000が終わると、自動的にエラー吐かれるけどいいんですか?
何も考えず(?)書き直してみたソースがこちら。
button gosub "ループ開始/停止",*auto
gosub *auto
*auto_
repeat
if (auto_f) : title "処理中" : else : break
//ここに処理をいれる gosub *next_?
wait 1
loop
repeat
if (auto_f) : break : else : title "停止中"
//なにもしない
wait 1
loop
goto *auto_
stop
*auto
auto_f ^= 1 //if auto_f=0 { auto_f=1 } else { auto_f=0 }と同意
return
正直気持ち悪いですねえ。
停止用のリピートとか置きたくないよって言われそう。
そもそも「ループの再生(停止)」の定義ってなんでしょうか。
1. ボタンを押したらループ外へ出る
2. ボタンを押したらループ内の処理が行われなくなる
とか考えられるわけですが。
上に書いたのは1.の定義に沿ったわけです。(UNGAさんはこっちを意識してると解釈した)
さて、私が組むなら2.を採用して次のようにソースを書きます。
button gosub "ループ開始/停止",*auto
button gosub "ループ解除",*rbreak
gosub *auto
repeat
if (rb) : break
title tmes
if (auto_f) {
//ここに処理をいれる gosub *next_?
}
wait 1
loop
title "ループ終了"
stop
*auto
auto_f ^= 1
if (auto_f) : tmes = "処理中" : else : tmes = "停止中"
return
*rbreak
rb = 1
return
幾分かすっきりしたようにも思えます。
ここではループを抜ける手段がないので、rbreak(repeat breakの意)なるものを用意しておきました。
以上です、参考になりましたでしょうか。
実際この構造を何に使いたのかが分からないので、役に立たなかった場合はごめんなさい(・ω・;)