- 汎用ゲームエディター『Multimedia Fusion2』 9
588 :名前は開発中のものです。[sage]:2011/11/13(日) 01:17:56.52 ID:6w1kgt/6 - >>586
たとえば単純な例では、フレームに ◆(アクティブ)を5つ ■(アクティブ2)を5つ ▲(アクティブ3)を5つ 作成して、イベントエディタで ================== [1.フレームが開始] ◆:デバッガに追加 ■:デバッガに追加 ▲:デバッガに追加 ---------- [2.フレームが開始] ◆:変数Aを1に変更 ■:変数Bを2に変更 "loop1"を1回ループ開始 ---------- [3."loop1"がループ実行中] ◆:変数Cを3に変更 ▲:変数Dを4に変更 ================== こういう条件とアクションを組んだときに、これを実行したら どういう結果がデバッガで見えるかということなんです。 普通であれば、 ◆:5つともすべて変数A=1,変数C=3 ■:5つともすべて変数B=2 ▲:5つともすべて変数D=4 になっているはずだと思いませんか?でも実際にはそうはならないんです。
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
589 :名前は開発中のものです。[sage]:2011/11/13(日) 01:23:49.79 ID:6w1kgt/6 - >>588の結果がどうなるかというと、
■:5つともすべて変数B=2 ▲:5つともすべて変数D=4 はそのとおりになるのですが、◆は ◆:1つだけ変数A=1,変数C=3 ◆:残り4つは変数A=0,変数C=3 になるんです。理由も大体ですが想像がつきます。 >>587 >とりあえず「通し番号と高速ループを同じ行に設定するな」というのは間違いじゃないってことかな それはそうなんですが、あえて書き込んだのは「通し番号」以外でもいろいろ問題が起こるよ、 っていう注意喚起のためでした。あの書き方では通し番号以外は大丈夫みたいな書き方でしたから・・・
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
591 :名前は開発中のものです。[sage]:2011/11/13(日) 02:04:32.52 ID:6w1kgt/6 - >>590
もともと疑問を持ったのはhttp://game-creator87.com/blog/2010/05/mmf2-9.htmlを見ていてなんですね。このページに書かれている >-------------------------------- >1:フレームが開始した時 > ・◆:0から通し番号を設定:変数A > ・"testloop"を◆の数だけの回数、ループ開始 >2:"testloop"がループ中 > かつ > ◆の変数Aの値が"testloop"のループインデックスと一致 > > ・"testloop"のループインデックス数を出力 >---- >アクティブオブジェクトが3つの時 >上のイベントを組んだ場合、 >本来なら「0」→「1」→「2」と表示されるはずなのですが、 >上のように組んだ場合だと、「0」しか表示されません。 >-------------------------------- という部分で、高速ループを呼び出した時点では変数Aには まだ通し番号が反映されていないと考えれば変数Aはすべて 0ということで納得なんです。 そこでいろいろデバッグして、高速ループ内でオブジェクトの変数に 値を書き込んだり読み出したりしてると、アクセスしてるのがまったく別の変数なのに 変数Aの通し番号が消えてしまうことがある・・・と。 それでこれは単純に通し番号と高速ループの組み合わせが原因なのではなく、 いろいろ複雑な要因が組み合わさって、よく使うオブジェクトの初期化シーケンスでは 「たまたま」値が+1されているに過ぎない(=他にもいろいろな現象として 問題が起こる)ということにたどり着いた次第です。 ただ、その「複雑な要因」というのがまたいろいろ条件があって、その条件によって難しくて・・・
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
594 :名前は開発中のものです。[sage]:2011/11/13(日) 07:22:00.33 ID:6w1kgt/6 - その後いろいろ触ってみて、驚愕の事実(みなさんには既知かもしれませんが、直観とは少し異なる動作)が
いくつかみつかったので書いておきます。 (自分にブログがあればそこへ、あるいはWikiに書けばいいのかもしれませんが、まだ体験版を触って 2、3日の状態ですので用語もよく分からず、何が既知かも分からないので今は控えておきます。) --------------------------- ★驚愕の事実1★ 同一イベント行内に書かれた高速ループ開始アクションとオブジェクトへの操作アクションは、 その並び順にかかわらず、まず高速ループが実行されてから、その後で オブジェクトへの操作が実行されるようです。 (そりゃ、通し番号のセットと高速ループの開始が意図どおりに動作しないはずです。 通し番号が+1されるからといったどころではなかったようです。) ★驚愕の事実2★ さらに!高速ループだけでなくグローバル変数への値セット(ようするに特別オブジェクトへの操作)も、 同一イベント行ではオブジェクトへの操作アクションより先に実行されるようです。つまり、 グローバル変数Aを10に変更 ◆:変数Aをグローバル変数Aに変更 グローバル変数Aに50を追加 と書いていると、◆:変数Aには10ではなく60がセットされるようです。
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
595 :名前は開発中のものです。[sage]:2011/11/13(日) 07:44:24.23 ID:6w1kgt/6 - ★驚愕の事実3★
◆を5つ作成した状態で、 ================== [1.フレームが開始] ◆:0から通し番号を設定:変数A ---------- [2.フレームが開始 & ◆:変数A>=3] ◆:10から通し番号を設定:変数B ================== を実行すると、変数Aの通し番号が0〜2の◆には変数Bがセットされず、 選択状態になっている通し番号3,4の◆の変数Bに対して、通し番号10,11が それぞれセットされます。(これは直観と照らし合わせても普通の正しい動作) ですが、 ---------- [2.フレームが開始 & ◆:変数A>=3] ◆:10から通し番号を設定:変数B "loop1"を1回ループ開始 --- [3."loop1"がループ実行中] クリップボードをクリア(←なんでもよい) ---------- に修正して、高速ループ開始を同一行に書いてしまうと、なんと通し番号0,1,2,3,4の すべての変数Bに対して通し番号11,12,13,14,15がセットされるようになってしまいます。 (★驚愕の事実1★で書いたように、まず先に高速ループが実行されるのですが、 そのときに◆の選択状態が解除され、すべての◆が操作対象に変更されてから 通し番号が振られてしまうようです。しかも+1で。)
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
596 :名前は開発中のものです。[sage]:2011/11/13(日) 07:56:58.37 ID:6w1kgt/6 - ★驚愕の事実4★
ちなみに、次のように同一の高速ループ名のイベント行を2つ作成しておいた場合、 呼び出し順序はどのようになるでしょうか? ================== [1.フレームが開始] "loop1"を5回ループ開始 ---------- [2."loop1"がループ実行中] "o"を出力する処理 ---------- [3."loop1"がループ実行中] "x"を出力する処理 ================== この場合は"oooooxxxxx"と出力されるでしょうか?"oxoxoxoxox"と出力されるでしょうか? 答えは"oxoxoxoxox"となります。 どうやらMMF2では、高速ループの呼び出しはサブルーチンやイベントハンドラのような ものではなく、純粋にイベントのリスト全体を繰り返し回数分だけ毎回一つずつ舐めながら、 条件に合うものを拾って処理していく、というスタイルのようです。
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
597 :名前は開発中のものです。[sage]:2011/11/13(日) 08:11:59.71 ID:6w1kgt/6 - ★驚愕の事実5★
通し番号の+1の件ですが、まず基本的な形として、 ----------- [フレームが開始] ◆:0から通し番号を設定:変数A "loop1"を1回ループ開始 ----------- だと+1されてしまいますが、 ----------- [フレームが開始] "loop1"を1回ループ開始 ◆:100から通し番号を設定:変数A ----------- だと+1されず、正常に通し番号がセットされます。ですが、 ----------- [フレームが開始] "loop1"を1回ループ開始 ◆:100から通し番号を設定:変数A "loop1"を1回ループ開始 ----------- だと、またまた+1でNGとなってしまいます。そこで ・・・続く
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
598 :名前は開発中のものです。[sage]:2011/11/13(日) 08:21:53.55 ID:6w1kgt/6 - (続き)
----------- [フレームが開始] "loop1"を1回ループ開始 ◆:100から通し番号を設定:変数A "loop1"を1回ループ開始 ◆:アニメーションを停止 ----------- などとすると、再び変数Aには正しい通し番号がセットされるようになります。 ★驚愕の事実1★で書いたように、同一イベント行では高速ループの呼び出しが 先に行われ、どうやらそのときに通し番号のカウントスタート値が0ではなく 1にセットされてしまうようなのですが、高速ループを拾ってすべて実行した後、 その後ろにまだオブジェクトへの操作アクションが記述されていた場合には その時点で通し番号のカウントスタート値は0にリセットされるようなのです。 ですので、イベント行の先頭に戻って今度はオブジェクトへの操作アクションを 拾って実行していく段階では正しい通し番号がセットされるようになっている、 ということのようです。 ・・・続く
|
- 汎用ゲームエディター『Multimedia Fusion2』 9
599 :名前は開発中のものです。[sage]:2011/11/13(日) 08:37:30.92 ID:6w1kgt/6 - (続き)
なお、それではイベント行で高速ループを呼び出す記述をすること自体が 通し番号のカウントスタート値を狂わせてしまうのか、ということについてですが、 これはそうではないようです。たとえば ================== [フレームが開始] "loop1"を1回ループ開始 ◆:100から通し番号を設定:変数A グローバル変数Aを1000に変更 "loop1"を1回ループ開始 ---------- ["loop1"がループ実行中 & グローバル変数 A<=500] クリップボードをクリア ================== などとすると、通し番号は+1されずに正しくセットされます。 要するに、高速ループを呼び出すときにカウントスタート値がおかしくなるのではなく、 実際に高速ループが実行されたときにはじめてカウントスタート値がおかしくなって しまうのでしょう。 (おそらくMMF2がやらかしてしまっていて、カウントスタート値が0ではなく1に初期化 されてしまっているのでしょう。通し番号のオフセット値の方が+1されているのでは 内容に思います。) いったんこれぐらいにしておきます。 他にも何かいろいろあったような気がしますが・・・ (特にMMF2で何かをしようと思って触り始めたわけではないので、次はいつになるか わかりません。) 長々と書いてすみませんでした。
|