- ベストアンサー
スライドショーの制御
過去ログの http://oshiete1.goo.ne.jp/kotaeru.php3?q=1690465 の方法を参照させていただき、スライドショーを作成しましたが、 これに「戻る」「進む」「一時停止/再生」のボタンを付け加える事は 可能でしょうか?よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1です。 >> 補足で書いていただいた写真番号を示す >> phot_noのダイナミックテキストですが何故か写真番号が >> 1つ先のカウントになってしまいます。 何をしているのか,スクリプトの流れを理解してください。 表示 ↓ロード 表示 MCaアルファ 100~→ 0 --→ 0 ~→100--→100 MCbアルファ 0 ~→100--→100~→ 0 --→ 0 ↑ロード 表示 ↑ロード 上の図のように,表示されているもののアルファが100パーセントで, 表示されていないもののアルファが0パーセントのときに,表示されていないムービークリップの方にJPEGをロードさせています。 そうしないと変ですよね。 表示されている物に,新たに loadMovie すれば,全然クロスフェード(というのか?)をしません。 カクッとかわります。 アルファ0のときに,phot_no の画像を前もってロードさせておいて,それをフェードインさせているのです。 だから,当然,phot_no は表示されているものより先の番号になっています。 というよりわざわざそうしているのです。 そうするしくみを考える部分が一番大変だったのですよ。 >> 戻ると進むはフェードイン~アウトなしにパッパッと写真が切り替わっていくかんじです。 元からそういうことは前提にしていないので,少々ややこしいですし, 上記のとおり, phot_no は表示されているものとはズレているため, クリックするタイミングによっては,1つ飛ばしてしまったりするかもしれませんが,一応考えてみました。 本当はメインムービーの _root のタイムラインのスクリプトを使いたくなかったのですが, フラグを立てる場所が,他にいい場所がなかったので _root のタイムラインを使います。 まず,タイムラインのフレーム1に次の1行を書いてください。 -------------------- //変数フラグ flag の値を "play"に設定 flag = "play" -------------------- これはフラグです。 フラグとは,それ自体には何の意味もない単なる旗印です。 「次へ」ボタンのスクリプトは以下のようになります。 ※ スクリプトの各行の前には,全角空白文字をたくさん入れています。 コピペをする場合は,全角空白を ""(何もなし) で置換するなどして, 全角空白を削除してください。 ------------------------------------ on (release) { //phot_no が 最終JPEGナンバーであったとき if(_root.scriptMC.phot_no == _root.scriptMC.photo_all){ //phot_no を 1 にする _root.scriptMC.phot_no = 1; //phot_no がそれ以外の場合は }else{ //phot_no に 1 をプラスする _root.scriptMC.phot_no++; } //変数フラグ flag の値を "stop"に設定 _root.flag = "stop"; //その他の値は以下で固定 _root.MCa._alpha = 101; _root.MCb._alpha = -1; //MCa に phot_no+".jpg" をロード _root.MCa.loadMovie(_root.scriptMC.phot_no+".jpg"); //前進とアルファの変化を停止 _root.scriptMC.zensin = 0; _root.scriptMC.flg_alp = 0; } ------------------------------------ 「戻る」ボタンのスクリプトは次のようになります。 ※コピペをする場合は,全角空白を削除してください。 ------------------------------------ on (release) { //phot_no が 1 であったとき if(_root.scriptMC.phot_no == 1){ //phot_no を 最終JPEGナンバーに設定 _root.scriptMC.phot_no = _root.scriptMC.photo_all; //phot_no が 1 以外の場合は }else{ //phot_no に 1 をマイナスする _root.scriptMC.phot_no--; } //変数フラグ flag の値を "stop"に設定 _root.flag = "stop"; //その他の値は以下で固定 _root.MCa._alpha = 101; _root.MCb._alpha = -1; //MCa に phot_no+".jpg" をロード _root.MCa.loadMovie(_root.scriptMC.phot_no+".jpg"); //前進とアルファの変化を停止 _root.scriptMC.zensin = 0; _root.scriptMC.flg_alp = 0; } ------------------------------------ 結局,読み込む _root.MCa と _root.MCb を初期設定にして, _root.MCa の方に phot_no のJPEGを読み込むスクリプトです。 そして,アルファの変化を止めて,phot_no のカウントアップを停止するスクリプトが書いてあります。 上の2つのボタンは比較的簡単ですが, 「一時停止/再生」ボタンが,かなり難しい,というか難しくはないですがややこしいです。 同じボタンをクリックしたときでも, その前段階によって,再生するときの再生のさせかたが変わるので _root のフラグを利用したりして,クリックの前段階をまず探り, フラグや値によって,条件分岐させています。 「一時停止/再生」ボタンのスクリプトは次のようになります。 ※コピペをする場合は,全角空白を削除してください。 ------------------------------------ on (release) { //変数zensin (前進)の値が 1 のとき if (_root.scriptMC.zensin == 1) { //前進するのと,アルファの変化を止める _root.scriptMC.zensin = 0; _root.scriptMC.flg_alp = 0; //それ以外で,flag が "stop" になっていれば } else if (_root.flag == "stop") { //なおかつ,phot_no が 最終JPEGナンバーであったとき if (_root.scriptMC.phot_no == _root.scriptMC.photo_all) { //phot_no を 1 にする _root.scriptMC.phot_no = 1; //phot_no が 最終JPEGナンバーでなかったとき } else { //phot_no に 1 をプラスする _root.scriptMC.phot_no++; } // flag を "play" に設定 _root.flag = "play"; //_root.MCb の方に phot_no+".jpg" をロード _root.MCb.loadMovie(_root.scriptMC.phot_no+".jpg"); //前進とアルファの変化を開始 _root.scriptMC.zensin = 1; _root.scriptMC.flg_alp = 1; //変数zensin 1 ではなく,flag が "stop" でない場合 } else { //前進とアルファの変化を開始 _root.scriptMC.zensin = 1; _root.scriptMC.flg_alp = 1; } } ------------------------------------ ちなみに,「一時停止/再生」ボタンを2つに分ける場合 「一時停止」ボタンのスクリプトは#1と変わらずです。 ※コピペをする場合は,全角空白を削除してください。 ------------------------------------ on (release) { //前進するのと,アルファの変化を止める _root.scriptMC.zensin = 0; _root.scriptMC.flg_alp = 0; } ------------------------------------ 「再生」ボタンのスクリプトは次のようになります。 ※コピペをする場合は,全角空白を削除してください。 ------------------------------------ on (release) { //flag が "stop" になっていれば if (_root.flag == "stop") { //なおかつ,phot_no が 最終JPEGナンバーであったとき if (_root.scriptMC.phot_no == _root.scriptMC.photo_all) { //phot_no を 1 にする _root.scriptMC.phot_no = 1; //phot_no が 最終JPEGナンバーでなかったとき } else { //phot_no に 1 をプラスする _root.scriptMC.phot_no++; } // flag を "play" に設定 _root.flag = "play"; //_root.MCb の方に phot_no+".jpg" をロード _root.MCb.loadMovie(_root.scriptMC.phot_no+".jpg"); //前進とアルファの変化を開始 _root.scriptMC.zensin = 1; _root.scriptMC.flg_alp = 1; //flag が "play" になっていれば } else { //前進とアルファの変化を開始 _root.scriptMC.zensin = 1; _root.scriptMC.flg_alp = 1; } } ------------------------------------ なお,理解しないと絶対にカスタマイズできません。 でも他人の書いたスクリプトは理解しにくいと思います。それは十分わかります。 私も,自分の書いたスクリプトですが,最初に書いた時より1ヶ月以上経っているため, 何を書いているのか理解するのに,数十分かかりました。そんな物です。 自分が書いていても,しばらくたてば他人が書いたスクリプトです。 一番良いのは,他の人の発想だけを拝借して,スクリプトは全部自分で作ることです。 これくらいの動作になると,書く人によって全く違うスクリプトになると思います。 使えそうな部品と考え方だけを使って最初から自分で作ってみることをお勧めします。 でないと,当然ですが,自分の思った通りにはできません。 だいたい引用されている前回のものも,今回#1と#2で答えた内容も, 全然特殊なスクリプトは使用していません。 SharedObject を除けば Flash5 で十分動きます。 簡単なものを組み合わせているだけです。 『部品と発想だけを盗んで,組み立てるのは自分。』 こうするほうがずっと早道です。
その他の回答 (1)
引用されているスクリプトを書いた者です。 >> ボタンを付け加える事は可能でしょうか? 可能ですよ。 そのスクリプトで行くと, 結局,コントロールは基本的に,変数phot_no を操作すれば良いわけです。 変数phot_no の値は相対的に上げて行っています。 具体的には, phot_no ++; の部分です。 ここをphot_no ++; で単純に 1 をプラスし続けるのではなくて,時には 0 をプラスしたり, -1 をプラスすれば,前進や後退します。 しかし,変数phot_no を操作しただけでは,アルファの変化が止まりませんから, 同時にアルファの変化を止めたり,再開したりさせれば良いのです。 具体的には, _root.MCa._alpha += MCa_alp; _root.MCb._alpha += MCb_alp; の部分です。 ここも単純にアルファをプラスしたりマイナスしたりするだけでなく,変化を 0 にするパターンを作れば良いのです。 引用されているスクリプトは,操作するスクリプトを書くためだけに存在させたムービークリップに書いていますよね。 ボタンを付けるとなると,そのムービークリップの外部から,ムービークリップ内の変数を操作することになります。 だから,まずそのムービークリップにインスタンス名を付けてください。 以下の例では 『scriptMC』 というインスタンス名を付けたとします。 どっちかわからなかったので,SharedObject を使った方のスクリプトを以下のように書きかえます。 ※ スクリプトの各行の前には,インデントを付けるため, 全角空白文字をたくさん入れています。 コピペをする場合は, 全角空白を ""(何もなし) で置換するなどして, 全角空白を削除してください。 -------------------------------------------- onClipEvent (load) { spd_alp = 5; stop_time = 12; photo_all = 10; //★変数zensin(前進)の初期値を設定★ zensin = 1; //★変数flg_alp(アルファのフラグ)の初期値を設定★ flg_alp = 1; count1 = 0; count2 = 0; //ローカルのsolファイルを読みに行く sol_count = SharedObject.getLocal("mySol"); //もしsolファイルにphoto_countがあれば if (sol_count.data.photo_count != undefind) { phot_no = sol_count.data.photo_count; //もしsolファイルにphoto_countがなければ } else { phot_no = 1; } _root.MCa._alpha = 101; _root.MCb._alpha = -1; _root.MCa.loadMovie(phot_no+".jpg"); } onClipEvent (enterFrame) { if (_root.MCa._alpha<0) { _root.MCa._alpha = 0; _root.MCb._alpha = 100; MCa_alp = MCb_alp=0; i = 1; //★以下6行を変えました★ phot_no += zensin; if (zensin == 1 && phot_no>photo_all) { phot_no = 1; } else if (zensin == -1 && phot_no == 1) { phot_no = photo_all; } _root.MCa.loadMovie(phot_no+".jpg"); //solファイルに photo_no-1 の値を保存 sol_count.data.photo_count = phot_no-1; } else if (_root.MCa._alpha>100) { _root.MCa._alpha = 100; _root.MCb._alpha = 0; MCa_alp = MCb_alp=0; j = 1; //★以下6行を変えました★ phot_no += zensin; if (zensin == 1 && phot_no>photo_all) { phot_no = 1; } else if (zensin == -1 && phot_no == 1) { phot_no = photo_all; } _root.MCb.loadMovie(phot_no+".jpg"); //solファイルに photo_no-1 の値を保存 sol_count.data.photo_count = phot_no-1; } if (count1>=stop_time) { i = 0; count1 = 0; MCa_alp = spd_alp; MCb_alp = -spd_alp; } else if (count2>=stop_time) { j = 0; count2 = 0; MCa_alp = -spd_alp; MCb_alp = spd_alp; } //★以下2行を変えました★ _root.MCa._alpha += MCa_alp*flg_alp; _root.MCb._alpha += MCb_alp*flg_alp; count1 += i; count2 += j; } -------------------------------------------- ★マークを付けた部分が,今回変えた部分です。 そして,ステージ上にはボタンを用意して,各ボタンには以下のようなスクリプトを書けばOKです。 「一時停止」ボタン --コピペ可-------------------------- on (release) { _root.scriptMC.zensin = 0; _root.scriptMC.flg_alp = 0; } ---------------------------------- 「再生」ボタン --コピペ可-------------------------- on (release) { _root.scriptMC.zensin = 1; _root.scriptMC.flg_alp = 1; } ---------------------------------- 上の2つを1つのボタンで済ませる場合, 「一時停止/再生」切り替えボタン --コピペ可-------------------------- on (release) { if (_root.scriptMC.zensin == 1) { _root.scriptMC.zensin = 0; _root.scriptMC.flg_alp = 0; } else { _root.scriptMC.zensin = 1; _root.scriptMC.flg_alp = 1; } } ---------------------------------- 「戻る」「進む」ボタンというのがどういうものなのか,よくわかりませんでした。 「戻る」 10→9→8→… のように写真を切り替えるつまり「逆再生」と考えると 「逆再生」ボタン --コピペ可-------------------------- on (release) { _root.scriptMC.zensin = -1; _root.scriptMC.flg_alp = 1; } ---------------------------------- となります。 「進む」がさらにどういうボタンなのか,よくわかりませんでしたが, 「5なら次は6」ではなくて,「5なら次は7」のように飛ばすボタンだと以下のようになります。 単に phot_no の値を上げてやれば良いわけです。 「進む」ボタン --コピペ可-------------------------- on (release) { _root.scriptMC.phot_no++; } ---------------------------------- スクリプトを書いた 『scriptMC』 というインスタンス名のムービークリップの中に, 「phot_no」という変数名のダイナミックテキストか,テキスト入力のテキストフィードを置いてやると, 「phot_no」がどうなっているのか観察しやすくなりますよ。 他にも,2つ飛ばしとか,2つ前の写真に戻るとか,同じような考え方で作れると思います。
お礼
sassakunさん、丁寧なご回答ありがとうございました。 一時停止/再生はうまくいったのですが、戻る、進むはこちらの説明不足でした、すいません。 戻ると進むはフェードイン~アウトなしにパッパッと写真が切り替わっていくかんじです。フェードイン~アウトと静止時間を待つのが面倒だと思う方用にサクサクと見られるようなボタンがあった方がいいのではないかという意図です。 また補足で書いていただいた写真番号を示すphot_noのダイナミックテキストですが何故か写真番号が1つ先のカウントになってしまいます。 どうかよろしくお願いいたします。
お礼
sassakunさん、的外れな質問で申し訳ありませんでした。 それにも関わらず大変丁寧にご回答下さり恐れ入ります。 Flashは始めたばかりでまだスクリプトの事はほとんど分かっておらず、 これから勉強していこうと思っている状態です。 本当にありがとうございました。