いちばん失敗した人決定戦

つい最近、flash maker2からflash MXに乗り換えた初心者です。
くだらないことで躓いています。
フォトルバムのようなものを作成したいのですが、巧くいきません。

メインページ(デフォルトでシーン1)に2つのスクロールパネル(標準コンポーネント)を置いています。

1つは、パラメータ>contentPathに固定でシンボル(グラフィック)を指定します。
このグラフィックには複数のボタンを置いています。
このボタンをクリックすると、メインページにおいている、もう一つのスクロールパネルに全く別のシンボル(グラフィック)を表示させたいのですが、今のところボタンを押しても何も表示されません。

on(release)イベントには、
 level0.detail.setScrollContent(mc_sed0026);
と記述しています。
detailとは、メインページに置いている、contentPathを可変で指定したいオブジェクトのインスタンス名です。プロパティでrenameしました。

本当に困っています。
どなたか、ご教授ください。
よろしくお願いいたします。

A 回答 (1件)

ライブラリに読み込んだビットマップ系画像( JPEG や GIF ・ PNG など)は、グラフィックというタイプのシンボルになって登録されます。


グラフィックシンボルは鑑賞することしかできない1枚の絵のようなもので、ActionScript での制御はできません。
ビットマップ系画像をスクリプトで制御したい場合は、内部にグラフィックシンボル(のインスタンス)配置したムービークリップを作り、こちらを操作するようにします。


スクロールバー付きの表示パネル( ScrollPane コンポーネント)は、基本的には、予めライブラリに登録されているムービークリップを表示するコンポーネントです。
ですから、setScrollContent に渡すパラメータ(引数といいます)も、リンケージの識別子になっています。
通常は、ステージにムービークリップなどのインスタンスを配置してムービーを作りますが、実は、あとからスクリプトで動的にインスタンスを挿入して操作する方法もあります。
リンケージとは、インスタンスを動的に挿入する際に必要な設定のことです。

「ライブラリ」パネルでムービークリップシンボルを選び、右クリック( Mac では control +クリック)のメニューから「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。
「 ActionScript に書き出し」にチェックを入れると、「識別子」の項目が入力可能になりますので、分かりやすい名前を入力してください。日本語はトラブルの原因になりやすいので、英数字と” _ ”だけで付けるといいでしょう。
ここで設定した名前が、setScrollContent に渡す引数になります。
例えば、リンケージの識別子に mc_sed0026 と付けたのであれば、

 _level0.detail.setScrollContent( "mc_sed0026" );

で、ScrollPane コンポーネントのインスタンス” detail ”に表示できます。

なお、リンケージで「最初のフレームに書き出し」にチェックを入れると、画像がフレーム1に書き出され、フレーム1の容量が極端に大きくなります。
オフラインで見ている時は問題ないのですが、ムービーに Now Loading の表示を作っている場合は、フレーム1の容量が大きいとロード中に実行するアニメがなかなか始まらなくなってしまいます。
しかし、かといってこの項目のチェックが外れている時は、ムービークリップのデータがムービーに書き出されないため、ScrollPane に画像が表示されなくなります。

簡単な回避方法としては、ロードアニメの邪魔にならないフレームにムービークリップを仮に配置しておき、普段は非表示にしておくといった方法があります。
普段は非表示にするには、ムービークリップのインスタンスに次のようなスクリプトを書いておきます。

 onClipEvent(load)
 {
  //非表示にする
  this._visible = false;
 }

(↑各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)

-------------------------------------------

リンケージを設定し、setScrollContent で表示する場合は、全ての画像データをムービーの中に書き込んでおかなければならず、ムービーの容量がかなり重くなります。
また、ムービーに画像データを書き出すためだけに仮にムービークリップを配置しておくというのは、画像が1枚や2枚ならともかく、枚数が多くなると非常に無駄な処理となります。
ScrollPane は、外部にあるムービーや画像を読み込んで表示することもできます。
画像の枚数が多い時は、必要な時に画像を読み込む方法がオススメです。

外部から読み込む際は、loadScrollContent というスクリプト(メソッドといいます)を使います。
仮に image1.jpg という画像があるとします。
これを detail に読み込むスクリプトは、

 _level0.detail.loadScrollContent( "image1.jpg" );

となります。
ボタンが押された時の

 level0.detail.setScrollContent(mc_sed0026);

この部分の処理を、loadScrollContent に書き換えてみてください。外部から画像ファイルを読み込めるようになります。

Flash Player 6 以降は、外部からファイルを読み込む際のドメイン間のセキュリティが厳しくなりました。
画像と swf ファイルは、ネットで公開する時は同じサーバーに、ローカル環境でテストする場合は同じフォルダ内にあることが条件となります。
なお、サーバーやフォルダが同じであればいいだけですので、画像を同じサーバーまたはフォルダ内の別のフォルダに置いても問題はありません。

-------------------------------------------

ところで、あるインスタンスから別のインスタンスを操作する場合は、操作する対象が同時にステージに並んでいることが条件となります。
例えばフレーム1に ScrollPane コンポーネントのインスタンス” loader ”があり、ここにメニュー画面が表示されているとします。
メニュー画面のボタンに、同じく ScrollPane コンポーネントのインスタンス” detail ”に画像を表示する、というスクリプトが書いてあっても、この detail インスタンスが登場するのがフレーム2以降になっている場合は、detail は存在していないことになり、画像を表示するスクリプトは失敗してしまいます。
フレームをまたいで情報を伝えるには、もう少し工夫が必要になります。
一般的には、変数に情報を保存しておいて、その変数をもとに処理する、といった流れになります。


それから、画像やムービーの読み込みにはそれなりに時間がかかるので、商業用のムービーでは、画像1つだけを読み込む時でも Now Loading の表示を作っていることがあります。
Now Loading の表示というのは、要するにロードされた容量とトータルの容量が分かればいいだけです。
ScrollPane コンポーネントに読み込んだ画像やムービーでは、普通のムービーのように簡単にはいきませんが、ロード完了率を算出することは可能です。
Flash や ActionScript に慣れてきたら、こちらも研究してみてください。


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0
この回答へのお礼

こんなに丁寧に教えていただいたのに、
放置状態で申し訳ないです。
本当にすみませんでした。

_level0.detail.setScrollContent( "mc_sed0026" );
できちんと表示できるようになりました。
有難う御座いました。
プログラミングの経験はあるのですが、
ActionScriptは初めてですので難しい・・・。
基礎も分かっていないのに、
難しいことをしようとしているので。

兎に角、本当に有難う御座いました。
本当に助かりました。
また、質問することがあると思いますが、
そのときは、宜しくお願いいたします。

お礼日時:2005/04/12 23:58

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