電子書籍の厳選無料作品が豊富!

以前、No.974758,989128,1002130,1019966で質問させて頂いた「ムービークリップ」に関する質問です。

以前は、外部のJPEGを複数ダイナミックに読込んでマスクレイヤー内に表示し、選択されたら別の場所に拡大画像を表示するというものでした。
今回、同様の仕様なのですが表示するJPEGは決まっているので先にライブラリに格納しておきたいのですが、選択されたら拡大表示するロジックをそのまま適用したく、外部から読込むロジックを内部のライブライにしたいのですが、どのようにしたら良いのでしょうか?。

どうぞ宜しく御願い致します。

A 回答 (1件)

ライブラリに読み込んだ画像は、グラフィックというタイプのシンボルになっています。


この状態では ActionScript で制御できません。まずは、ムービークリップの属性を持つように加工しましょう。
グラフィックシンボルのインスタンスを一旦ステージに置き、これをムービークリップに変換すると、内部にグラフィックインスタンスを持つムービークリップシンボルになります。または、空のムービークリップシンボルを新規に作り、その中にグラフィックインスタンスを配置しても作れます。


読み込む画像がライブラリの中にあるのですから、最初から画像ムービークリップを配置した、サムネイル画面のムービークリップを作った方が簡単ですが、ActionScript で作成する方法もあります。もっとも、ActionScript で作れば、万が一画像が増えるようなことがあっても、簡単な変更で対応できるという利点はあります。
今回は読み込み終了を待つ処理は必要ありません。以前は7フレームも使って作っていたサムネイル画面のムービークリップも、なんと1フレームだけで済んでしまいます。
ロジックは次のように考えます。
ActionScript で空のムービークリップを1つ作り、そこにライブラリにある画像を挿入します。
つまり、前回はシンボルとして作っていた sheet ムービークリップを、今回は何もない状態からスクリプトだけで作り出します。
あとは、配置した画像をボタンにし、更にスクロールバーで動かせるようにして、出来上がりです。

画像を外部から読み込む時は、受け皿となるムービークリップが必要でした。前回はムービークリップをコピーして受け皿を作成するため、そのコピー元になるムービークリップを1つだけ配置した、sheet というムービークリップシンボルを作り、ステージに配置していました。
画像を読み込まないのであれば、受け皿としてのムービークリップは必要ありません。従って、sheet に最初から配置しておかなければならないムービークリップは何もなく、sheet 自体も最初は空っぽでいいということです。
そこで、今回は sheet のシンボルを作らず、ActionScript で空のムービークリップとして動的に生成することにします。
空のムービークリップは、MovieClip クラスの createEmptyMovieClip メソッドで作成できます。

ライブラリにあるムービークリップを動的に挿入するには、attachMovie メソッドを使います。このメソッドで、sheet に画像のムービークリップを挿入していきます。
attachMovie では、リンケージという名前が必要です。
リンケージとは、ActionScript で識別するためのシンボル名のようなものです。
ライブラリで画像のムービークリップシンボルを選んで、右クリックでメニューを出し、「リンケージ...」を選択してください。「リンケージプロパティ」のダイアログが開きますから、「 ActionScript に書き出し」と「最初のフレームに書き出し」にチェックを入れ、「識別子」に名前を入力します。
ループで処理できるように、「識別子」は固有の名前+通し番号で付けるといいでしょう。ここでは仮に、pic +番号とします。
attachMovie で追加したものでも普通のインスタンスと同じで、リンケージとは別にインスタンス名も必要です。下記のスクリプトでは、clip +番号というインスタンス名を付けています。

マスクは ActionScript でも制御できます。
マスクレイヤーに配置したオブジェクトでは制御できないのですが、普通のレイヤーに配置したムービークリップであれば、setMask というメソッドで、ムービークリップをマスクとして使えるようになります。
マスクとして定義されても、それは普通のムービークリップであって ActionScript でも制御できるため、スクリプトで動いたり変形したりするなどの複雑なマスクも作成できます。
sheet は最初はステージに存在していないので、マスクレイヤーを使ってのマスキングができません。今回は setMask を利用してマスクをかけます。
マスク画像をムービークリップに変換し、インスタンス名を付けます。ここでは mask_clip とします。
それから、「マスク」のレイヤーを普通のレイヤーに戻します。レイヤーを選んで右クリックでメニューを出し、「マスク」のチェックを外してください。
sheet を置いていたレイヤーは不要になります。削除しても構いません。

サムネイルシンボルのレイヤー構成をまとめますと。

 アクション  :スクリプトを書きます。
 マスク    :マスクを配置しますが、タイプは普通のレイヤーです。
 スクロールバー:スクロールバー(インスタンス名: sc_bar )を配置します。


スクリプトは、大体、次のようになります。
スクロールバーの考え方・クリックされた時の処理の考え方は、以前のものと全く同じです。一部は省略しますので、今までの作例をもとに適宜追加してください。
(以下のスクリプトでは、画像の幅を 100px としています)


 //画像の枚数
 image_max = 5;

 // sheet を空のムービークリップとして作成し、原点に配置する
 this.createEmptyMovieClip( "sheet" , 0 );
 sheet._x = 0;
 sheet._y = 0;

 // sheet をマスク画像でマスキング
 sheet.setMask( mask_clip );

 // sheet に画像を配置
 for( i = 1 ; i <= image_max ; i++ )
 {
  //ライブラリからムービークリップを挿入
  sheet.attachMovie( "pic"+ i , "clip" + i , i );

  //位置を決め、30%に縮小して表示
  with( sheet[ "clip" + i ] )
  {
   _x = 100 * ( i - 1 );
   _y = 0;
   _xscale = 30;
   _yscale = 30;
  }

  //管理番号とクリックされた時の処理を定義
  sheet[ "clip" + i ][ "image_no" ] = i;
  sheet[ "clip" + i ].onPress = function ()
  {
   /*ここにクリックされた時の処理を書く*/
  };
 }

 //スクロールバーの設定
 sc_bar.setScrollProperties( 0 , 0 , 100 * image_max - mask_clip._width );


ライブラリに画像を多数格納するとムービーの容量が大きくなり、ムービー全体の Now Loading 画面を付けるなどの配慮が必要になります。
この作り方はこのサイトでも何度か質問で出ていますし、様々な解説サイトで取り上げられていることも多いほどポピュラーな技法ですから、そちらを参考になさってください。
ライブラリにあるシンボルを使うのであれば、ムービー中で何度使ってもムービーの容量は増えません。例えば、サムネイルはオリジナルを縮小して表示し、クリックされたら原寸のままで表示しても、ムービーに書き出されるのはオリジナルの画像の分だけです。
ただ、オリジナル画像が容量が大きかったり、枚数が多い場合、これをライブラリに格納するとなると、ムービー自体が肥大してしまいます。その場合は、ライブラリにはサムネイル用の小さな画像を格納し、拡大表示の時だけ loadMovie などで読み込むようにするといいでしょう。
    • good
    • 0
この回答へのお礼

連絡が遅くなって申し訳ありません。

ちょっと他に問題があって、そちらに手を取られています。
お教え頂いた内容でトライしてみます。


これからもどうぞ宜しく御願いします。

お礼日時:2004/11/09 09:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!