D0212051 タクシーメーター
Name か〜る
Date 2002年12月05日 (木) 19時57分
Message 毎度お世話になります。以前タクシーメーターを制作していただき、ファイルをダウンロードして今も色々研究していますが、どうしてもわかりません(T_T)かなり難しそうなのでまたお暇が出来たときにでも解説よろしくお願いします。
Home or Link http://www5.ocn.ne.jp/~tcjoy/index.html
Response 01
2002年12月06日 (金) 23時40分> 憲ちゃん 
か〜るさん、お久しぶり(^^g/~~
うへ〜〜これは大変です(;^_^Aアセアセ・・・


taxi_meter.fla

ムービーも複雑なものになると、作った本人も時間が経つと分からなくなります(笑)
そのためあとで自分でもわかるように、出来るだけ「レイヤー名」に具体的な名前を付けたり、
意味が分かるような変数名にしたりしておく必要があるのですね(^^;
まして他人が作ったムービーだと、やり方にそれぞれの流儀や癖がありますから、
その全体像をイメージするだけでも至難の業です!!
そこで役に立つのが、「ムービーエクスプローラ」というものです。
※空のテキストフィールドがなぜあるのか?多分制作過程で数値チェックに使ったものの名残か?
「アクションパネル」の左側のタブをクリックすると、図のようなものがでてきます。

これは、シーン1に配置されたオブジェクトをツリー状に表示してくれるので、
ステージのオブジェクトと合わせて参照すると、構造を把握するのに便利です。
さらに図の「シンボル定義」の「+」をクリックすると・・・

さらに具体的にシンボル内の階層ごとに、そこに設定されたインスタンス名やアクションなども
一覧できます(*^-^*)
実際に「ムービーエクスプローラ」も開いて参照しながら以下の説明文を読んでいただければ
より理解しやすいかもしれませんね(^^g/~~

で、改めて「ムービーエクスプローラ」を頼りに記憶を取り戻しながら概略をご説明しますと・・

■1:動きに関係するオブジェクト(MCやボタン、文字図形などの総称)として
「シーン1」に配置しているのは、(番号は上のエクスプローラと対)

「@速度計MC」〜「E支払MC」です。
簡単に仕組みを要約すると、
「@速度計MC」の中のアクセルバーを上下することによって、スライドバーのY座標値を得ます。
その値を元に速度計の針を動かしたり、下のインジケータの速度を調節し、
「A走行キロMC」の走行キロの値をカウントアップします。
カウントアップしたキロ数を元に「BメーターMC」で料金を計算し表示します。
それを「空車」「実車」「支払」ボタンの状態でいろいろ制御するということです。

■2:ということで、このタクシーの燃料供給源は「@速度計MC」の中の右端のアクセルバーです♪
「@速度計MC」をダブルクリックして、中身を見ていただくと・・・

3つのMCが配置されていて、そこの「@−1速度バーMC」がアクセルになっています。
図の( )内はそれぞれインスタンス名(アクションで変数を指定するときに必要)です。
このMCの中心点「+」の位置に注意していただくと、バーの一番下にあり、
さらにこの「速度バーMC(accel)」の中をみると「スライダーMC(slider)」が入っていて、
それがY座標で0〜−100pxだけ上下に移動(ドラッグ)できるように作っています。
この「スライダーMC(slider)」に記載したクリップアクション・・・

 onClipEvent (enterFrame) { ←フレームレートごと毎回以下のことを繰り返す
   speed = -(_y);     ←自分のY座標値にマイナス符号を付けたものを変数speed に代入
 }               つまり、「0〜100」の正の値になります

アクセルバーを上下することにより変化する変数speed の値。
これがこのムービーのすべての動きの根源になります!!
※特定のインスタンスの中で定義された変数は、その中でのみ有効な固有の値を保ちます。
(同じ名前の変数でも、別のインスタンスの中で定義されたものは異なった変数として扱われる)
この変数を他のMCから参照するためには、その変数に至るパスを指定します。
パスは、インスタンス名を「.(ドット)」で繋ぎながら連ねていけばよいので。。。
他のMCから参照する場合のここの変数speed は、
 _root.sokudo.accel.slider.speed
元のタイムラインの中の「sokudoインスタンス」の中の「accelインスタンス」の中の
さらに「sliderインスタンス」の中の「speed」という変数(笑)
「エクスプローラ」をみればすぐわかりますね!

■3:これを元に「@−2針MC(hari)」の動きのコントロールですが・・・
これは単に「針の図形」をMCにしただけのものですが、これもMCの中心点に注意です!
針図形の根元がMCの中心になるように描いて、それを速度盤の中心と合致させます。
そのうえで、以下のクリップアクションを記載します。

 onClipEvent (load) { ←このMCを読み込んだ最初のときだけ
   speed0 = this._rotation; ←変数speed0 に最初に配置した針の回転角度を代入(初期値)
 }
 onClipEvent (enterFrame) { ←以後、フレームレートごとに毎回以下のことを繰り返す
   kakudo = speed0+_root.sokudo.accel.slider.speed*2.2; ←先のspeedに相当する回転角度※
   this._rotation += (kakudo-this._rotation)*0.1; ←現在の位置から徐々に近づける※
 }
※早速、上記2の変数speed がでてきました(笑)
ここの「_rotation」プロパティの値は、0〜360度の値です(360以上でもマイナスでも可)。
とにかくこの値によって、MCの中心を起点にして何度傾けるかを指定するものです。
変数speed0 には、ステージに配置したMCの角度(=スピード0のとき)を記録します。
それに、アクセルバーから得られた変数speed の値(0〜100)を「2.2」倍したものを加える!?
この「2.2」はスピード最大(speed=100)にして、実際に何度もムービープレビューして、
針が振り切るときがこのぐらいだろうというところから得られた経験値です。
この値を小さくすれば、振り切る位置が戻りますし大きくすれば速度盤からはみ出ます(笑)
それを変数kakudo に代入しています。
変数kakudo をそのまま針の回転角度にした「this._rotation = kakudo」とすれば、
即、その位置に移動して速度計らしくないので、
その下のアクションで、最終到達点まで徐々に近づける工夫をしています。
ここの「0.1」も大きくすれば速く到達し、小さくすればゆっくり到達します。

■4:「@−3■MC(slider)」の場合も考え方は同様で、回転が右水平方向に変わっただけですが、
ちょっと凝ったことをして残像を残す工夫を入れています!
これだけを説明するだけでかなりの量があり、本題と外れますので省略させていただきます(^^;

■5:シーン1に戻って「A走行キロMC」の仕組みですが・・・
これの中身は、背景の黒いバックと数値を表示する「ダイナミックテキスト」を配置しているだけ。
「ダイナミックテキスト」の変数を「kiro」としています。
クリップアクションは、

 onClipEvent (load) { ←このMCを読み込んだ最初のときだけ
   count = 0;    ←変数count に初期値として0を代入
 }
 onClipEvent (enterFrame) { ←以後、フレームレートごとに毎回以下のことを繰り返す
   if (_root.mater.sw == 0) { ←もし、インスタンスmaterの中の変数sw が0なら※
     count = 0;       ←変数count を0にリセットし、
     countStr = "00000";   ←変数countStr に文字列”00000”を代入
   } else if (_root.mater.sw == 1) { ←そうでなくて、変数sw が1なら※
   count += _root.sokudo.accel.slider.speed*0.0003;←countの値を例のspeed×0.0003づつ増加
   countStr = ("00000"+Math.floor(count*10)).substr(-5,5); ←※以下で説明
   }
   kiro = countStr.substr(0,4)+"."+countStr.substr(-1,1);  ←※以下で説明
 }
※変数count は、実車の際の「走行キロ」の値です。だから最初は0Kmですね。
ここのif条件文は、あとででてくる「空車」「実車」「支払」ボタンの状態によって、
「BメーターMC(mater)」の中の変数sw(スイッチ)の値が変化するようになっていて、
「空車」状態のとき「sw=0」、「実車」のとき「sw=1」、「支払」のとき「sw=2」とします。
「空車」のとき、走行キロは「0」にリセット、
「実車」のとき、アクセルバーの変数speed×0.0003づづ変数countの値を大きくしていきます。
当然、speedの値が大きいと加算度合いが大きく、小さいと小さくなるのは分かりますね。
ここの「0.0003」も実験した結果の経験値です。適当に変えてみてください。
※変数count をそのままテキストの変数kiro に代入しても構いませんが、
それでは浮動小数点表示になって、「走行メーター」らしくありません(^^;
そこで、変数countStr では、それを上位4桁、小数点以下1桁の文字列表示に変換しています。
使ってるメソッドは「変数名(又は文字列).substr(開始位置,文字数)」ですが、
以下の説明で大体の使い方がわかると思います(^^g/~~

 countStr = ("00000"+Math.floor(count*10)).substr(-5,5);

文字列”00000”に「変数count×10したものから小数点以下を切り捨てた値」を加えた文字列の
右から数えて5番目の文字から(左へ)5文字分取り出した文字列を変数countStr に代入(^^;
例えば、変数count の値が「123.4567」だったとします。
10倍すると「1234.567」、それの小数点以下切り捨てると「1234」。
”00000”+「1234」は”000001234”、,右から5番目から5文字取り出すと”01234”となります。
※変数kiro へは、変数countStr をさらに加工して、

 kiro = countStr.substr(0,4)+"."+countStr.substr(-1,1);

変数countStr の文字列の左から0番目の文字から(左へ)4文字取り出した文字列と、
変数countStr の文字列の右から1番目の文字から1文字取り出した文字列との間に
”,”を挟んで加えたものを変数kiro に代入。
変数countStr が”01234”とすると”0123.4”という文字列になり、
変数kiro =テキストフィールドに表示されます。

■6:「BメーターMC」の中身は、バックの図形と数字の電光管表示のための「数字セットMC」、
「遠割MC(enwari)」を納めています。
「数字セットMC」の仕組みは、

10フレームから19フレームに、0〜9の数字図形、20フレームに「−」図形が入っており、
フレーム番号から10をマイナスした値と「数字」が一致するように仕組んでいます。
そして、そのインスタンスを6桁分横に並べ、インスタンス名はそれぞれ「k6」〜「k1」
として、各桁に合わせています。
※6つのインスタンスを「グループ化」していますので、
もし個々にみるときは「グループの解除」をしてください。
「遠割MC(enwari)」の中身は1フレームが「黒丸」、2フレームが「点灯」です。

シーン1で「メーターMC(mater)」をクリックして、そのクリップアクション、
※各料金、距離などはか〜るさんの関協タクシーの設定です(笑)

 onClipEvent (load) { ←このMCを読み込んだ最初のときだけ
   sw = 0;     ←最初は「空車」
   kihonR = 660; ←基本料金を660円
   kasanR = 80;  ←加算料金80円
   kihonM = 2;  ←初乗りキロ2Km
   kasanM = 0.273; ←加算キロ273m
 }
 onClipEvent (enterFrame) { ←フレームレートごと毎回以下のことを繰り返す
   if (sw == 0) { ←空車のとき
     k1.gotoAndStop(20); ←1桁目の数字セットの20フレームへ(「−」の表示)
     _root.mater.enwari.gotoAndStop(1); ←「遠割」は1フレーム(「黒丸」の表示)
     for (keta = 2; keta < 7; keta++) { ←2〜6桁の数字セットを
       this["k"+keta].gotoAndStop(1);   すべて1フレームへ(表示なし)
     }
     Ryokin = kihonR; ←変数Ryokin に基本料金を代入(以下、実車計算の初期値)
     kariRyokin = Ryokin; ←変数KariRyoukin(仮料金)に変数Ryoukin を代入
     kasan = kihonM;    ←変数kasan に初乗りキロを代入
   } else if (sw == 1) { ←実車のとき
     StrRyokin = String(Ryokin); ←各桁の数字を表示させる仕組み!以下で説明※
     for (keta = 1; keta < StrRyokin.length+1; keta++) {
        this["k"+keta].gotoAndStop(Number(StrRyokin.substr(-keta,1))+10);
     }
     if (_root.soukou.count > kasan) {←「走行キロ」の変数countが変数kasanを超えたら
       kariRyokin += kasanR; ←仮料金に加算料金を加える
       if (kariRyokin > 5000) { ←もし仮料金が5000円を超えたら
         _root.mater.enwari.gotoAndStop(2); 「円割MC」の2フレームへ(「点灯」)
         Ryokin = 5000 + (kariRyokin - 5000)*0.5;←変数Ryokinに円割料金を適用
       } else {         ←そうでない(5000円を超えていない)なら
         Ryokin = kariRyokin; ←変数Ryoukinに仮料金を代入
       }
       kasan += kasanM; ←変数kasan に加算キロを加える
     }
   }
 }
※各桁の数字を表示させる仕組み
変数Ryoukinの値を、一桁づつの文字に分解して取り出したいために。。。
Ryokinの値には「数値(計算可能)」が代入されていますが、これを”文字列”に変換します。
 StrRyokin = String(Ryokin); ←文字列に変換したものを変数StrRyokin に代入。
例えば数値の「1060」なら、文字列の”1060”!
そして、その下の「for文」では「桁数」回繰り返しすることになるので、
 StrRyokin.length ←とは”1060”の文字数のことで、「数値」の「4」が返ってきます。

 for (keta = 1; keta < StrRyokin.length+1; keta++)
変数ketaの最初の値を「1」(keta = 1)として、「1」づつ増やしながら(keta++)、
変数ketaの値が「文字数(=桁数)+1」より小さいあいだ、以下の処理を繰り返す。
”1060”の場合、「4+1」より小さい間となり「1」〜「4」まで繰り返すことになります。

this["k"+keta].gotoAndStop(Number(StrRyokin.substr(-keta,1))+10);
1回目、keta=1 なので、["k"+keta]はインスタンス「k1」を指定、そこの「goto」のとび先・・・
StrRyokinは”1060”、ketaは1ですから、「”1060”.substr(-1,1)」となって、
右から1番目の文字を1文字取り出しますから、答えは”0”。
ところがこれは”文字列”なので計算ができません!!
それで、文字列を数値に変換するため「Number( )」で括ります。文字列”0”→数値「0」。
それに「+10」すると「10」となり、「gotoAndStop(10)」という結果になります。
2回目、keta=2 となりインスタンスは「k2」を指定、飛び先の結果は「gotoAndStop(16)」。
このようにして、それぞれ「数字セット」の中のフレームと対応した「数字図形」が表示されます。

■7:最後に「C空車MC(kusya)」「D実車MC(jisya)」「E支払MC(siharai)」ですが、
それぞれのMCの中は、

これは「空車MC」ですが、1フレームから順に「グラフィック(点灯)」「グラフィック(消灯)」
「ボタン(消灯)」が入っています。
「実車MC」は順に「ボタン(消灯)」「グラフィック(点灯)」「グラフィック(消灯)」。
「支払MC」は順に「グラフィック(消灯)」「ボタン(消灯)」「グラフィック(点灯)」。
それぞれボタンとして機能するのは、「空車」「実車」「支払」の順でいいいますと、
3、1、2フレームだけです。
そのおのおののボタンアクションですが・・・

「空車」(3フレーム)
 on (release) { ←クリックされたら
   _root.mater.sw = 0; ←「メータMC」の中の変数sw に0を代入
   gotoAndStop (1);   ←自分のタイムラインを1フレームに進めて停止(G点灯)
   _root.jisya.gotoAndStop(1);  ←「実車」のタイムラインを1フレームに(ボタン消灯)
   _root.siharai.gotoAndStop(1); ←「支払」のタイムラインを1フレームに(G消灯)
 }

「実車」(1フレーム)
 on (release) { ←クリックされたら
   _root.mater.sw = 1; ←「メータMC」の中の変数sw に1を代入
   gotoAndStop (2);   ←自分のタイムラインを2フレームに進めて停止(G点灯)
   _root.kusya.gotoAndStop(2);  ←「空車」のタイムラインを2フレームに(G消灯)
   _root.siharai.gotoAndStop(2); ←「支払」のタイムラインを2フレームに(ボタン消灯)
 }

「支払」(2フレーム)
 on (release) { ←クリックされたら
   _root.mater.sw = 2; ←「メータMC」の中の変数sw に2を代入
   gotoAndStop (3);   ←自分のタイムラインを3フレームに進めて停止(G点灯)
   _root.kusya.gotoAndStop(3);  ←「空車」のタイムラインを3フレームに(ボタン消灯)
   _root.jisya.gotoAndStop(3);  ←「実車」のタイムラインを3フレームに(G消灯)
 }

※空車なのに支払はありえないし、実車で支払いもなくいきなり空車はありえないし、
支払いから空車(リセット)なしで実車はありえないので、こんな風にしました(*^-^*)

すっごい量になってしまって、読むのも疲れると思いますが(笑)
か〜るさんが非番のときにジックリ腰を落ち着けて研究してみてください!
Response 02
2002年12月07日 (土) 01時04分> か〜る 
うっ!確かにすごく難しそうです…しかも詳しい解説で…いやいや本当に申し訳ないです。私があほなばかりに(T_T)
明日あさってと勤務の為に、月曜日あたりにでもじっくり腰を据えて研究してみます。その前に初歩的な質問なんですが、メーター料金のアクションに「変数keta」「StrRyokin」とかの表記があるのですが、これは自分で勝手に付けてもよい名前なんでしょうか?それとも決まった変数の表記なんでしょうか?これのヒントだけでも教えて下さい。お手数ばかりですみませんがよろしくお願いいたします。
実際のタクシーメーターでは「実車ボタン」を押さなくとも「支払いボタン」を押してしまうと「660」メーターが入ってしまい、自腹を切らなければならないという事になってしまうのです(==;)それで泣いた経験数知れず…ははっ!余談ですみません!今は憲ちゃんに作っていただいたサンプルを参考に、研究と改造で悪戦苦闘していますが、また出来上がりましたら公開させていただきます。m(_ _)m
http://www5.ocn.ne.jp/~tcjoy/index.html
Response 03
2002年12月07日 (土) 13時30分> 憲ちゃん 
変数は、以下の条件さえ満たせば大文字小文字、文字数に制限もなく自由に付けて構いません!!
@半角英数文字(a〜z,A〜Z,0〜9)であること。
A記号で使えるのは「_(アンダーバー)」のみ。
B最初の文字はアルファベットであること。
Cアクションスクリプトで使用する単語(予約語)は使えない。
※ただし、予約語を含む綴りはOK!
 例えば、「Date」というのは日付や時刻を取得するメソッド名ですから予約語ですが、
     「theDate」とすれば、変数として使えるようになります。
 だから予約語かどうか分からないときは、「the」とか「my」とかを単語の前に付ければ、
 まず、間違いありません(*^-^*)
もうひとつ大事なこと・・・
「大文字」と「小文字」はマシン自体が区別しませんから、
「theDate」と「thedate」は同じ変数になります。

これにだけ留意して、あとで自分が分かるようにできるだけ具体的なネーミングを考えてください。

実際のメーター・・・現実は厳しいのですね(笑)

このページの先頭へ