2008年11月8日土曜日

スクリプトの話(17)〜「旗を立てる」・状態の判定

さて、私のSL内の(一応)会社である Lifebound Records には
写真に見られるように左右にスライドして開く自動ドアがあります。
この自動ドアは私が豊島区で初めてお店を作った時に
初めて取り組んだスクリプトものでもあります。
豊島区からスタトラ、メインランドと移ってきて
再びこのお店に設置することにしたのです。



ところで、この自動ドア、
よくよく考えると不思議ですよね。
左右に開く、右側の方に焦点を当てて考えると、
開く時には元の位置から右方向に移動してしまうわけです。
そして閉まる時には開いた場所から今度は左方向に移動して
元の位置に戻ってくることになります。
左側のドアはこの逆の動きになりますね。

ということは、このドアは、右のも左のも、
今自分がどこにいて、次のイベント
(人が近づくとか遠のくとかーーセンサー・イベントですね)
が起こると、右に動いたらいいのか、左に動いたらいいのか
知っていることになります。
言い換えれば、今ドアが開いた状態なのか、閉じている状態なのかを
それぞれのドアは知っている、ということになりますね。

どうやったらこれら左右のドア・オブジェクトに
開いているとか閉じているということを教えられるでしょう?

こういう時、オブジェクトの状態を表す変数を用意してあげます。
integer(整数)型で、普通の状態、つまり閉じている時は0,
変化があった時、つまり開いた時の状態を1として、
名前は例えば isOpen、つまり「開いている」という名前にしましょう。
開いていれば isOpen = 1、
閉じていれば isOpen = 0
というわけです。

ここでドアを開くようにオブジェクトを動かす関数を openDoor() ,
閉じるように動かす関数を closeDoor() とすると、

integer isOpen = 0

if (isOpen = 0) {
  openDoor();
  isOpen = 1;
} else if (isOpen = 1) {
  closeDoor();
  isOpen = 0;
}

実際にはもっと複雑な処理になりますが、
イメージはこんな感じです。
初期状態としては、ドアは閉まっているわけですから、
isOpen には「0」が代入されています。
そして、「if文」では、
isOpen が「0」、つまり閉じている時は
ドアが開く処理をして、ここが大事なのですが、
処理した後に、isOpen に「1」を代入、
つまり、ドアが開いているという状態に変えています。
この状態で再びイベントが発生すると、
今度は isOpen = 1 となっているので、
ドアを閉じる処理が走り、
そしてその処理が終わると今度は isOpen に「0」を代入、
ドアが閉じている状態に変化させるわけです。

このように何かの状態を判断させなければならないような時、
integer型の変数を用意して「1」と「0」を代入して、
現在のその変数の値を見て処理を分岐させるのはよくあるやり方です。
ちょうどスイッチの「ON/OFF」のような働きをしているわけですね。
こういうはたらきの変数をプログラムの世界で何と言っているのか
私はよく知らないのですが、
元々データベースの世界から入った私にとっては
「フラグ」という表現がぴったりしているように感じます。

「フラグ」というのは勿論英語の「flag」、つまり「旗」のことです。
変化があった時にパッと旗を上げて注意を促すような感じで、
実際にデータベース用のブラウザでデータベースの状態を見ていると、
注意すべき項目のところに、ピコンと真っ直ぐに旗を立てたように
「1」とデータが入っているのです。

プログラムの世界でも同じで、
何か変化があった時、状態が変わった時は
この旗をピコンと上げる変数を用意してあげればいいというわけです。
状態の違いで処理を変えたい場合は
是非この旗を上げるような変数を使ってみて下さい。
きっといろんな場面で便利ですよ。w

No response to “スクリプトの話(17)〜「旗を立てる」・状態の判定”

Leave a Reply