1. このサイトではcookie (クッキー) を使用しています。サイトの利用を継続した場合、cookieの使用に同意したものとみなさせていただきます。 詳しくはこちらをご覧ください。

(解決済み)変数とループについて

onaka01282018-12-30に開始した「ツクールMV」の中の討論

  1. onaka0128

    onaka0128 ユーザー

    いつもお世話になっております。

    制作でつまづいた箇所が複数あるのですが、いっぺんに書くと長くなり迷惑になってしまうと思ったので分けて質問させて頂きます。

    先ほど踊り子に話しかけるて踊ってもらうと踊り子が5回回転するというイベントを作っていたのですが、これを変数とループを使って動かしてみたところ、
    1度目は上手くいって無事にイベントが終わったんですが、再度話しかけてみたところ5回で終わらず、ずっと回転し続けてしまいます。

    イベント設定のスクリーンショットと練習用で作ったプロジェクトファイルを https://15.gigafile.nu/0106kbadae7f9b341cc84c90044c0db2ee85f にアップしますので、アドバイスをお願いします。

    ちなみにですが、移動ルートの設定で回転の動作を5回繰り返せば、という回答はなしでお願いします。
    変数とループに慣れておきたいというのが理由です。わがままで申し訳ないのですが、よろしくお願い致します。
     

    添付ファイル:

    #1
    たかッシュ, WTRワタベ がいいね!しています
  2. Renfred Stauchenberg

    Renfred Stauchenberg ユーザー

    ループの中断よりも後に変数1番を0に戻す為の5減算の処理を
    入れている事が原因ではないでしょうか。

    ループの中断のイベントが実行されると直ちにループの外に出てしまうため、
    内部的には変数1番が5のままループから脱出、
    2回目の実行以降は変数1番は6,7,8…と加算されてしまうことから
    5と同値になる事はない為、処理から抜け出せなくなっているものと考えられます。

    ループの中断を実行する前に、変数1番から5を差し引くように
    コマンドの並びを変更してみてください。
    もしくは「:以上繰り返し」の直下に配置しても良いでしょう。
     
    #2
    たかッシュ, WTR, onaka0128他1人 がいいね!しています
  3. たかッシュ

    たかッシュ ユーザー

    条件分岐変数=5 枠内にあるループの中断と変数-=5の順番を逆にしてください
    今の状態だと「ループの中断」が入った時点でその一帯の処理は終了させられるので
    変数-=5が入っていないということになります。
    回転用変数がリセットされてないわけです。

    ここの順番を入れ替えれば意図通りに動くと思います。

    また条件分岐設定の変数ループ箇所ですが個人的には
    変数=5ではなく変数≧5を指定にした方がいいと思います。
    この場合は変数5以上になった場合はループを中断するということになります。
    そうしておけばなんらかのミスで変数6以上などになっていてもその際は一律でリセットして中断するという流れにできるので
    永久に回転ループするというバグを誘発することは予防できます。
    ツクール制作を積み重ねて続けていると制作データが大きくなっていき
    いつの間にか把握できない箇所からワケのわからないバグが沸いてきて想定した動作と違う反応をされたりすることもあるので
    5になった瞬間にしか判定してくれない=5より≧5の方が安全かと思います。
     
    最後に編集: 2018-12-30
    #3
    WTR, onaka0128ワタベ がいいね!しています
  4. onaka0128

    onaka0128 ユーザー

    Renfred Stauchenberg様・たかッシュ様 返信ありがとうございます!

    Renfred Stauchenberg様とたかッシュ様の言うとおりに変数-=5の場所をループの中断より上に入れたら上手くいきました!
    Renfred Stauchenberg様の「:以上繰り返し」の直下に配置でもたかッシュ様の変数≧5でも上手くいきました!ありがとうございます!

    上手くいったスクリーンショットもアップしておきます!

    動作についてはお二人のおかげで解決したのですが、新たな疑問が出てきたので質問させてください。

    条件分岐で変数を使う時に=、≦、≧、<、>、≠という記号があると思いますが、それぞれどういった意味なのでしょうか?
     

    添付ファイル:

    #4
    たかッシュワタベ がいいね!しています
  5. ネコタ

    ネコタ ユーザー

    便宜上、左辺をA、右辺をBとします。

    A=B
    AとBが等しいとき(AとBが同じとき)

    A≧B
    AがB以上のとき(Bの値を含む)

    A>B
    AがBより大きいとき(Bの値を含まない)

    A≦B
    AがB以下のとき(Bの値を含む)

    A<B
    AがBより小さいとき(Bの値を含まない)

    A≠B
    AとBが等しくないとき(AとBが異なるとき)


    一定の値以上であればどんな時でも同じ処理をするのであれば≧を使うと良いですし、初期化するときは数値を減算するより0を代入(=0)した方が確実です。また、修正の手間が減る場合もあります。

    例えば、後々5回転じゃなくて8回転にしようと思ったとき、減算部分も-8に手直しが必要となりますが、=0ならここの部分に修正が不要となります。

    今回は大した手間では無いですけど、後の手間が減るようにやる癖をつけておくと、制作が楽になっていきますよ。
     
    最後に編集: 2018-12-30
    #5
    onaka0128, たかッシュワタベ がいいね!しています
  6. WTR

    WTR ユーザー

    これ、大切ですよねぇ…
    ツクールとは関係ないリアルな話ですが量産製品でやらかしてだいぶ面倒なことになったことがあります。
    幸い無限ループにはならなかったものの特定条件下で瞬時にリセットが効かない不具合を出してしまいました。

    どんな状況でも絶対に起こりえない、と思ってても可能な限り==はやめたほうがいいですね。
    リセットできないロジックは本当に怖い。
    経験に学んだ。

    ま、ツクールなら後からでも更新すればいい話なんですが。
     
    #6
    onaka0128, たかッシュワタベ がいいね!しています
  7. onaka0128

    onaka0128 ユーザー

    ネコタ様・WTR様 返信ありがとうございます!


    特にネコタ様、詳しく教えてくださってありがとうございます!早速メモに書いて保存させて頂きました!あと先ほどもありがとうございました!

    それと、変数を-で初期化するよりも0を代入すればいいと教えて下さり、実際にやってみたところ上手くいきました!これなら-でやるよりも確実に初期化できますね!
    さっきまでは何か勘違いをしていて、代入なのに+だと思っていて使うことさえ頭にありませんでした……。今回理解できたことで作れるイベントの幅が広がった気がします!

    それと、この際なのでもう一つ疑問があるのですが、=、≦、≧、≠については大体わかったのですが、<、>についてがちょっとまだ分からないというか、詳しくお聞きしてもよろしいでしょうか?
    値を含まないとはどういう事で、≦、≧との違いはなんでしょう?
     
    #7
    ネコタワタベ がいいね!しています
  8. ネコタ

    ネコタ ユーザー

    どういたしまして~。

    >と≧(大なり)、<と≦(小なり)のそれぞれの違いですが、
    具体的には、AとBの値が等しくなった時の分岐が変わってきます。

    ・A>Bの場合
    A=Bは除く(条件にBの値を含まない)ということなので、A=Bの時はまだ条件を満たせません。
    小なり(<)の場合も同様です。

    ・A≧Bの場合
    A=Bを含むので、A=Bになった時点で条件を満たします。
    小なり(≦)の場合も同様です。

    Aの値がそれよりも大きくなった場合は、A>B、A≧B、どちらも条件を満たします。
    (小なりの場合は、Aの値がそれよりも小さくなった場合どちらでも条件を満たします。)

    以上の事から、A=Bの時を条件分岐に含むか含まないかで使い分けます。

    算数・数学の用語になりますが、「以上(以下)」という言葉はその値を含む場合に使います。一方「~より大きい(~より小さい、あるいは、~未満)」はその値を含まない場合に使います。
     
    最後に編集: 2018-12-30
    #8
    onaka0128ワタベ がいいね!しています
  9. onaka0128

    onaka0128 ユーザー

    ネコタ様、返信ありがとうございます!

    なんとなく分かったような気がします!ですが、私の認識が合ってるか分からないのでもう少し付き合って頂けますか?

    つまり、違いは

    ・A>Bの場合
    Bが10の時、Aが同じ10でも条件が満たせていなくて、Aが11から上の数字だと条件が満たせている

    ・A≧Bの場合
    Bが10の時、Aが同じ10から上の数字だと条件が満たせている


    この認識で間違いないですか?
     
    #9
    ネコタワタベ がいいね!しています
  10. ぶー太

    ぶー太 ユーザー

    自分も自信ないというかただの数学の話なら教えられますが

    「以下」と「未満」の違いというか
    ≦、≧は数字がおなじ場合でも成立するんです。
    3は3と同じですが3≦3や3≧3は成り立つんです。

    でも<、>を使う場合3<3や3>3なら成り立たない。

    正の整数で言うと
    3以下の数字は3、2、1( 3≧x のxにはいる数字)
    3未満の数字は2,1です( 3>x のxにはいる数字)

    2<3は正しいけど(2は3未満。2は3より小さい)
    3<3はダメ。(3は3より小さい、は間違ってますよね。小さくはないから。)
    3≦3なら成り立ちます。(3は3以下、つまり3は3より「小さいか同じのどっちか」。これなら成り立つ)

    分かりにくかったらすいません。自分も数学詳しくないです。

    (追記:画面を更新してなかったようで今更遅かったらおせっかいですいません)
     
    #10
    onaka0128ネコタ がいいね!しています
  11. ワタベ

    ワタベ ユーザー

    ネコタさんの説明を補足。

    例)
    X>5 6,7,8,9、・・・
    X≧5 5,6,7,8、9、・・・
    X<5 4,3,2,1,0、-1、-2、-3・・・
    X≦5 5、4,3,2,1,0、-1、-2、-3・・・

    つまり『5』を『含めたい場合』には『≦』『≧』を使います。
    『5』を『含めたくない場合』には『<』『>』を使います。

    更に言うと、
    『X>5』とはつまり『X≧6』と同じ結果であり、
    『X<5』とはつまり『X≦4』と同じ結果になるということです。
     
    #11
    onaka0128ネコタ がいいね!しています
  12. ワタベ

    ワタベ ユーザー

    合ってると思います。
     
    #12
    onaka0128 がいいね!しました
  13. ネコタ

    ネコタ ユーザー

    厳密にはちょっと違いますが、概ね合ってます。

    ツクールの仕様上は小数点以下は切り捨てられるので普通は無い話になるのですが、もしプラグイン等で小数点以下を参照できるようになった場合も想定すると、A>10(A≧10)は、10.1や10.0001でも条件を満たせます。よって、厳密にはAが11より上だと~という認識は誤りということになります。なので、10を含むか否か、という解釈になるんですよね……。

    ゲーム制作って、こういう、本来まず無いけど~(でももしかしたらあり得なくもない)ってところまで考えておかないといけないから大変なんですよね。
     
    最後に編集: 2018-12-30
    #13
    ワタベonaka0128 がいいね!しています
  14. onaka0128

    onaka0128 ユーザー

    ぶー太様・ワタベ様・ネコタ様返信ありがとうございます!

    ぶー太様・ワタベ様、詳しく説明して下さりありがとうございます!
    ようやくですが、きちんと違いが理解できたと思います!後で保存したメモに書き加えさせて頂きます!

    ネコタ様、プラグイン等で拡張した場合を想定して小数点の事も考えて使っていきたいと思います!
    ちょっと難しいですが、ゲーム制作に必要な知識という事で、徐々に慣れながら理解を深めていきたいと思います!

    ここまでお付き合い頂きありがとうございました!また分からない事があったらよろしくお願い致します!
     
    #14
    ネコタワタベ がいいね!しています

このページを共有