2006年07月12日

Uncoupleの怪

 VRM入道の「編成を解結する話・その3」を読んで、自分も記事に載っていたスクリプトをコピペして試してみました。

 この記事の内容は大まかには、Uncouple命令を含むメソッドをSetEventAfter命令で一度実行するようにスクリプトを書くと、そのメソッドが一度でなく繰り返し実行されてしまう、というお話です。

 記事中のスクリプトでは、編成AおよびBの両数とUncouple命令における切り離し位置が明示されていないので、自分は編成Aを1両、Bを3両とし、切り離し位置は1両目と2両目の間としました。
 ghostさんは、両数は同じでAが1両、Bが3両ですが、切り離し位置は2両目と3両目の間に設定したとのことです。

 以下に、ghostさんと自分の設定した条件での実験結果をそれぞれ図示しますが、はじめの編成Aと編成Bの連結作業は省略し、編成Bが編成Aを吸収して4両となった時点から示しています。

 というのも、はじめから編成Bだけを用意し、SetEventCoupleの代わりにSetEventKeyを用いてキー押下でメソッド「分割準備」を呼んでもやはりメソッド「分割」は繰り返し実行されてしまい、はじめの連結作業は結果に影響を及ぼしていないことがわかったからです。

 さて、まずghostさんが設定した条件ではこうなります。

[B][B][B][B]

↓3秒後↓

[B][B]←分割←[B_1][B_1]

↓3秒後↓

「分割します」が表示される


 一方自分の設定した条件では、

[B][B][B][B]

↓3秒後↓

[B]←分割←[B_1][B_1][B_1]

↓3秒後↓

[B] [B_1]←分割←[B_2][B_2]

↓3秒後↓

[B] [B_1] [B_2]←分割←[B_3]

↓3秒後↓

「分割します」が表示される


 違いがお分かりでしょうか。前者ではghostさんが解説されている通り、2回目の切り離しでは切り離し位置以降に車両が無いために切り離しに失敗し、メッセージ表示だけが実行されて止まります。

 しかし後者では、1回目の切り離しが行われた後も次々と1両ずつ切り離され、最終的に全車両がバラバラになった4回目でようやく切り離しに失敗し、メッセージ表示だけが実行されて止まります。

 ここからわかるのは、2回目に切り離しが行われる編成は[B]ではなく[B_1]のほうであり、同様に3回目は[B_1]ではなく[B_2]だ、ということです(ghostさんの設定した条件では、2回目に切り離しに失敗した編成が[B]か[B_1]か判然としません)。

 ghostさんの仮説の通り、もしSetEventAfterがUncoupleの完遂を見失ってしまうために再度メソッド「分割」を実行してしまうのだとしたら、2回目の切り離しが試みられる編成は[B_1]ではなく、1回目と同じ[B]のはずです(よね?)。そして後者の例でも[B]はすでに[B_1]と分割して1両になっていますから、切り離しに失敗してスクリプトは止まるはずです。

 しかし実際には2回目にメソッド「分割」が実行されるのは[B_1]のほうで、以下同様に分割が繰り返されます。
 [B]のほうのメソッド「分割」は実行されません。もし[B]と[B_1]両方のメソッド「分割」が実行されるとしたら、ログウィンドウには「分割します」というメッセージが2行同時に出るはずですが、1行しか出ないからです。

 以上です。なぜこうなるのかは見当も付かないっす。


posted by 45-50s at 23:39| Comment(0) | TrackBack(1) | V4スクリプト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

編成を解結する話・追補
Excerpt: 結論から言うと、SetEventAfter命令(おそらくは、オブジェクト指定可能なSetEvent系命令すべて)の仕様について、誤解していたらしいことに気づいたので報告しておきます。 ×誤解・Set..
Weblog: VRM入道
Tracked: 2006-07-18 19:04
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。