デーカーを段階的に動かす

デーカーを動かすには、デーカーに命令すればよいことはわかった。
ではデーカーを右に移動させて、右への移動が終わったら下に移動させるといったように、
デーカーを段階的に動かすにはどうすればいいだろうか。

命令文は上から順番に実行されるわけだから…
右に移動させるMove命令を書いた後に、
下に移動するMove命令を書けばよさそうな気がする。


method Main()
{
  CreateImage(name="画像", image="画像.png", x=50, y=50);
  Enter(to="画像");
  Move(to="画像", time=1000, x=200, y=50);
  Move(to="画像", time=1000, x=200, y=200);
}

これでデーカーが1秒かけて右に移動し、
さらに1秒かけて下に移動するようになりそうだ。
では実行してみよう。

Fooo_SerialMove_Exec1

デーカーは1秒かけて斜めに移動して止まった。
………Move命令を追加する前と変わらない動きだ。

バグか!?

いや、これはバグではない。
Foooの仕組み上必然的に起こる現象である。

Move命令がデーカーに移動しろと指示する命令であると説明したことを思い出して欲しい。
Move命令は『デーカーを移動する』命令ではなく、『デーカーに移動を指示する』命令なのである。
この違いは非常に重要だ。

このことは対象を指定するパラメータ名がtoという名前であることにも現れている。
デーカーの名前を指定するのだからパラメータ名はnameでもよさそうなものだ。

だが敢えてパラメータ名をto…「~へ」という名前にしているのは、
このパラメータが『命令の発行先』を意味するパラメータだからである。
そう、つまり

文字通り「~へ」なのだ。

(最もよく使うパラメータなので、できるだけ短い名前にしたかった…という理由もある)

つまり先のスクリプトは右に移動しろという命令を発行した後すぐに、
斜め下に移動しろという命令を発行しているということになる。
すなわち移動命令を重複して発行してしまっているわけだ。

デーカーは命令を重複して受け取ると、先に受け取った命令を中断して新しい命令に従う。
よって最初のMove命令は無視され、
後の命令だけが実行されて斜めに移動してしまうというわけである。

ではデーカーを段階的に動かすにはどうすればよいのだろうか。
答えは簡単だ。

待てばいい。

命令が重複してしまうのが問題なのだから、
最初のMove命令の動作が終わるのを待ってから
次のMove命令を発行すればよいのだ。

wait文

デーカーの動作を待つにはwait文を使用する。
wait文は指定時間だけ動作を待つことを意味する文だ。
命令文とは表記がやや異なる。
使い方は非常に簡単。


method Main()
{
  CreateImage(name="画像", image="画像.png", x=50, y=50);
  Enter(to="画像");
  Move(to="画像", time=1000, x=200, y=50);
  wait 1000;
  Move(to="画像", time=1000, x=200, y=200);
}

これで最初のMove命令を発行して1秒待ってから、次のMove命令を発行するという意味になる。
実行してみよう。

Fooo_SerialMove_Exec2

期待通りの動きになった!

このようにwait文を使ってデーカーに命令を発行するタイミングをはかることで
デーカーにより複雑な動きをさせることが可能になるのである。


Leave a Reply

*