LoginSignup
4
0

More than 3 years have passed since last update.

Scratchでダブルクリックによる二重送信を防止する

Posted at

やりたいこと

①問題文・解答の選択肢を表示
②選択肢をクリック
③正誤判定
④次の問題に遷移
というのを作る際に、②でダブルクリックをしてしまっても
次の問題に移れないor2回目のクリックを次の問題の解答として判断されてしまう
ということが無いようにしたい。

↓画面イメージ
test.png

答えだけ欲しいとき
→「できた!」の項目の2枚目の画像

問題点

Scratchには既存のイベントや制御にダブルクリック判定が存在しないため
自分でなんとか組む必要がある。
onClickはあるけどonDblClickは無いという状態。

NG①

選択肢のスプライトをダブルクリックすると、次の問題に移れなくなる。
改めてクリックしても問題遷移できず、最初からやり直すしかなくなる。

image.png
1秒待っている間に次のクリックが来てしまい、
「次の背景にする」と「statusを0にする」が動いていないっぽい。
ダブルクリック後、statusは1になっていた。

NG②

NG①で1秒待つのがダメそうだったので、待たないようにしてみた。
すると今度は、2回目のクリックが次の問題の解答として扱われてしまい、2問一気に進んでしまう。

image.png

改善

NG①のelse側に問題遷移とstatusを0にする処理を入れたところ、少しやりたいことに近づいた。

image.png

この時点でのNG

  • ダブルクリック後に問題遷移が不可能になることはなくなったが、もう一度クリックする必要がある。
  • ダブルクリックしたときに、たまに音が2回再生されて1つの問題で2回解答したことになることがある。

これ以上このソースは改善の仕方が分からなくなったので
設計からやり直し。

できた!

①問題文・解答の選択肢を表示
②選択肢をクリック
③正誤判定
④次の問題に遷移

②と③、③と④の間でクリックが割り込んだ場合に、そのイベントを無視すると成功するはず。
ということで、ステータス管理を2種類(問題遷移したか・正誤判定完了したか)にして、
一気に正誤判定や問題遷移をしていたところをメッセージのやり取りに変更してみたら成功した。
image.png

というところで、このコードだとisCheckFinishedの存在意義が無いことに気づいたので、isCheckedFinishedを削除。
動きました。

image.png

画像だけだと説明が足りないとこを補完

  • sendAnswarを送ると別のスプライトがそれを受け取って正誤判定を行い、完了すればcheckFinishedを送ってくれる
  • readyを送ると別のスプライトがそれを受け取って問題遷移の処理を行い、ページ変更を送ってくれる

これで、問題遷移が完了するまではいくらクリックしても問題なしのはず。

NGの何がNGだったのか(理解できたら追記)

NGがそもそもなんで動かなかったのか、改善したやつの改善の何が不十分だったのか。。。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0