- ベストアンサー
時間が変わるたびに動くキャラ
FLASHで時計のスクリーンセーバを作っています。 バージョンは8です。 00:00という風な時計は作りました。 数字ごとに、4つにMCを分けて作っています。 時間が変わるたびにキャラがその数字を押し出すMCが動き、 下から新しい(次の)数字が浮き出るというものです。 そこの部分のスクリプトがよく分からないので教えていただけますでしょうか。 文章が下手で伝わらなかったら申し訳ありません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
文字ばかりでわかりにくい説明だとは思いますが, 以下は1つの案です。 ステージ上に, 9 改行 改行 0 改行 改行 1 改行 改行 … 改行 改行 9 のようなテキストを用意します。 9 0 1 2 3 4 5 6 7 8 9 各数字の間にはキャラクターが入るような充分で均等な隙間を開けておきます(改行を入れておきます)。 これを グラフィックシンボル に変換して, さらに ムービークリップシンボル に変換します。 つまりインスタンスの構造を _root └ムービークリップ └グラフィック └90123456789 にするということです。 その _root のムービークリップをダブルクリックするなどして, ムービークリップ内の編集に入り, レイヤー1 に キーフレーム を追加して,ムービークリップ内部を2フレームにします。 レイヤー1 ・・・|●|●| そして, フレーム1 の上側の 9 と, フレーム2 の下側の 9 とがピッタリ同じ位置に来るように フレーム2 の 90123456789 グラフィックを上に移動させます。 ↓フレーム2 9 0 1 2 3 4 5 6 7 8 9 9 <…ピッタリ同じ位置 0 1 2 3 4 5 6 7 8 9 ↑フレーム1 そして,フレーム2 のキーフレームを右にドラッグして, (10の倍数+1)フレームに移動させます。 例えば 51 や 81 や 101 や 201 などが (10の倍数+1)フレーム です。 この説明では フレーム101 に移動させることとします。 キーフレームをフレーム101 に移動させた後, フレーム1 のキーフレームを選択して モーショントゥイーン をかけます。 すると, 0 や 1 や 2 や … 8 が, 9を配置した場所と同じ位置に来るフレームが必ずできるはずです。 仮にフレーム1~フレーム101 までのモーショントゥイーンにした場合, フレーム11 では 0, フレーム21 では 1, フレーム31 では 2, フレーム41 では 3, フレーム51 では 4, フレーム61 では 5, フレーム71 では 6, フレーム81 では 7, フレーム91 では 8, フレーム101 では 9 が 最初の 9 と同じ位置に来るはずです。 レイヤーを新規で追加して, その空白レイヤーの 0 が来るフレーム, 1 が来るフレーム, 2 が来るフレーム,…,9 が来るフレームを それぞれ空白キーフレームにして, 各空白キーフレームに, stop(); を書きます。 stop stop stop □レイヤー2 ・・・|○ []|○| … []|○| []|○| □レイヤー1 ・・・|●>-------- … -------->|●| レイヤー1 を選択して,さらにレイヤーをもう1つ追加します。 その新規で追加したレイヤー(レイヤー3)を選択して, 右クリックなどより,マスク にチェックを入れてマスクレイヤーにします。 □レイヤー2 ・・・|○ []|○| … []|○| []|○| ■レイヤー3 ・・・|○ []| ■レイヤー1・・・|●>-------- … -------->|●| そうすると, レイヤー1 にマスクがかかるようになりますから, マスクレイヤー(レイヤー3) のフレーム1のステージ上に最初の 9 をつつみかぶせるように四角い塗りの長方形を描きます。 キャラクターは下から出てくるのですから, 9 の下に大きくはみだすような塗りの方が良いような気がします。 ┌-┐ │9│ │ │←下に長い塗り └-┘ これで,とりあえず一度ムービークリップ内の編集は終えておき, 何も無いところをダブルクリックするなどして, メインのタイムライン(_root)の編集に戻ります。 メインのタイムライン(_root)は, 1レイヤー1フレームで,[9] だけが見えるムービークリップが1つあるだけだと思います。 その [9] だけが見えるムービークリップを横にコピペで4つ並べます。 [9] [9] [9] [9] そして左のムービークリップから順に 「h_mc1」 「h_mc2」 「m_mc1」 「m_mc2」 というインスタンス名を付けます。 そして, メインのタイムライン(_root)にレイヤーを1つ追加して, その空白キーフレームに次のように書きます。 ----------------------------------------- // 変数 h○_1 に -1 を代入 h1_1 = -1; h2_1 = -1; // 変数 m○_1 に -1 を代入 m1_1 = -1; m2_1 = -1; this.onEnterFrame = function() { // 現在の時刻オブジェクト myDate を作成 myDate = new Date(); // 変数 h に時刻を取得 h = myDate.getHours(); // 変数 m に分を取得 m = myDate.getMinutes(); // // 変数 h1_2 に時刻の上1桁を取得 h1_2 = Number(("0"+h).substr(-2, 1)); //trace(h1_2); // 変数 h2_2 に時刻の上2桁を取得 h2_2 = Number(("0"+h).substr(-1, 1)); // 変数 m1_2 に分の上1桁を取得 m1_2 = Number(("0"+m).substr(-2, 1)); // 変数 m2_2 に分の上2桁を取得 m2_2 = Number(("0"+m).substr(-1, 1)); // // もし h1_1 と h1_2 が等しくなければ if (h1_1 != h1_2) { // ムービークリップ h_mc1 を h1_2×10+2 フレームから再生 // (つまり フレーム2,12,22,…,92 から再生) h_mc1.gotoAndPlay(h1_2*10+2); } // // もし h2_1 と h2_2 が等しくないとき if (h2_1 != h2_2) { // ムービークリップ h_mc2 を h2_2×10+2 フレームから再生 h_mc2.gotoAndPlay(h2_2*10+2); } // // もし m1_1 と m1_2 が等しくないとき if (m1_1 != m1_2) { // ムービークリップ m_mc1 を m1_2×10+2 フレームから再生 m_mc1.gotoAndPlay(m1_2*10+2); } // // もし m2_1 と m2_2 が等しくないとき if (m2_1 != m2_2) { // ムービークリップ m_mc2 を m2_2×10+2 フレームから再生 m_mc2.gotoAndPlay(m2_2*10+2); } // // h○_2 の値を h○_1 に記録 h1_1 = h1_2; h2_1 = h2_2; // m○_2 の値を m○_1 に記録 m1_1 = m1_2; m2_1 = m2_2; }; ------------------------------------------ これでパブリッシュやムービープレビューなどをしてみると, 一応の動作確認ができると思います。 仮に 0 を表示する場合は 9→→→0 仮に 1 を表示する場合は 1→→→2 仮に 9 を表示する場合は 8→→→9 のようなアニメーションで各数字が変更表示されると思います。 ここまでできましたら, また [9] だけが見えるムービークリップ内の編集に戻って, ムービークリップ内 レイヤー1 を選択してさらにレイヤーを追加し, そのレイヤーの フレーム2~フレーム10 でキャラクターが 0 を持ちあげるアニメ フレーム12~フレーム20 でキャラクターが 1 を持ちあげるアニメ フレーム22~フレーム30 でキャラクターが 2 を持ちあげるアニメ フレーム32~フレーム40 でキャラクターが 3 を持ちあげるアニメ … … … フレーム92~フレーム100 でキャラクターが 9 を持ちあげるアニメ を作成すれば良いということになります。 stop() を書いた フレーム11 や 21 や 31 や … 101 は, 空白キーフレームにするか, もしくは,キャラクターが消えていく(退場する)ようなアニメ入りムービークリップを配置すれば良いと思います。 ActionScript1.0 , Flash MX 以降(Flash 8 も入ります)のバージョンで使用可能なスクリプトです。
お礼
事細かに説明してくださって、ありがとうございます! いろんなやり方があるのですね。 エラー出てまだ完成してないですが、 ものすごく参考になりました!!