5/27 回答が連続投稿される不具合が発生しております

Flashムービーを、Flash4形式で作成しています。

あるムービークリップに、loadMovieで、JPEG画像を読み込んでいます。
ロードが完了すると、うまく表示されます。

この、ロードが完了したタイミングを知りたいのですが、可能でしょうか?
MovieClipLoaderクラスや、getBytesLoaded()メソッド、fscommand2は、
Flash4では使えないようなので、困っています。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

「Flash4」 と,「書かれいるアクション」 は矛盾しています。


ご使用のバージョンは Flash 5 以降で,
Flash Player 4 用のSWFをパブリッシュしたいというご質問なのでしょうね。

しかし何でまた???
Flash Lite 1.0 だと,そもそも loadMovie 自体ができないでしょう。
ですから携帯用 SWF も有り得ないような気がしますし。

それにそもそも Flash Player 4 では,JPEGのロードはできませんよ。
Flash Player 4 では SWF(ムービー)のロードしかできません。
また SWF(ムービー) をロードする関数だから loadMovie なのです。

Flash Player が進化して,外部JPEGがロード表示可能になったのは,
Flash Player 6 以降です(Flash MX 以降)。
オーサリングツール Flash 4 や Flash 5 で作成した SWF であっても,
閲覧する Flash Player が 6 以上であればJPEGのロード表示は可能ですが,
どのバージョンで作成しようとも,
Flash Player的にはFlash Player 5 以下では JPEG のロード表示はできません。


Flash Player 5 以下で,
JPEG をロードする場合は,一度 Flash のステージ上に JPEG を読み込んで,
SWF としてパブリッシュしたものをロードしなければなりません。


そういう前提で一応回答します。

=================

今だと MovieClipLoaderクラス というのがあって,
その MovieClipLoaderクラス のインスタンスを作成して,ロードを監視しますよね。
根本原理はそれと同じでできると言えばできます。
MovieClipLoaderインスタンスモドキ を ムービークリップで自作するわけです。


上述の通り,Flash Player 4 では,JPEGのロードはできません。
ですからまず,
外部SWFの準備からです。

JPEG と同じステージサイズのドキュメントを作成し,
JPEG をステージ上に読み込みます。
そして,次が仕込みのポイントですが,
フレームを 2フレーム にします。
そして,フレーム1 でも フレーム2 でもどちらでも良いので,

---------------
stop();
---------------

を書いて無駄な動きをさせないようにしておきます。
stop() は必ずしも必要ではありませんが,
"フレーム2 まで作成する" ということは必須です。

そして,SWF をパブリッシュします。
「swf_jpeg.swf」というファイル名でパブリッシュしたとしておきます。
当然,この SWF 自体をパブリッシュする設定も,
Flash Player 4 の SWF をパブリッシュする設定にしてください。

実験検証のため私も作成しましたが,
20.2 KB (20,755 バイト) のJPEGをステージに読み込んで
何も設定せずに SWF をパブリッシュすると 20.3 KB (20,872 バイト) になりました。
容量的にもそんなに増えるわけではないので問題ないと思います。


次に,
本題の読み込む側の Flash の作成です。
ロードするムービークリップと,ロードを監視するムービークリップの2つが必要です。

まずロードするムービークリップを作成して,
このムービークリップにインスタンス名を付けます。
「load_mc」 というインスタンス名を付けたとしておきます。
この 「load_mc」 内のフレーム数は 1フレーム のみにしておいてください。


そして,
この load_mc に外部 SWF がロードされたかどうかを監視するムービークリップを作成します。
まずステージ上に小さなもしくは空のムービークリップを作成します。

そして,
その小さなもしくは空のムービークリップをダブルクリックして,
ムービークリップ内のタイムラインの編集に入ります。

このムービークリップ内のフレームは 3フレーム にして,
それぞれをキーフレームにします。
ここまでを階層図にすると

 _root
  ├ load_mc(内部フレームは 1フレーム)
  └無名のMC(内部フレームは 3フレーム)

となるということです。

そして,
3フレームある無名のMCの フレーム1 には次のようなスクリプトを書きます。

--------------------------------
// swf_jpeg.swf を _root.load_mc にロード
loadMovie("swf_jpeg.swf", "/load_mc");
--------------------------------

ドットシンタックスによるパスではなく,
スラッシュシンタックスパスでターゲットを表記します。

フレーム2 には次のようなスクリプトを書きます。
--------------------------------
// ロードされたフレームが2であれば
if (getProperty("/load_mc", _framesloaded) == 2) {
// 実際は何かを動作させる
trace("ロード完了");
// そして ストップ
stop();
}
--------------------------------

上のスクリプトの1行目
if (getProperty("/load_mc", _framesloaded) == 2)
の部分は,
if (/load_mc/:_framesloaded == 2)
としても一応は動作します。
そういう変な書き方は私はあまり好きではないので,
順当に getProperty 関数を使用しています。
またなぜか,
if (_root.load_mc._framesloaded == 2)
でも動作しますが,
スラッシュシンタックスとドットシンタックスの混在は混乱の元となりますから,
やはり無難で順当な
if (getProperty("/load_mc", _framesloaded) == 2)
が良いと思います(私は)。


フレーム3 には次のようなスクリプトを書きます。
--------------------------------
gotoAndPlay(2);
--------------------------------

つまり,
フレーム2 まである swf_jpeg.swf が最終フレームである フレーム2 まで読み込まれるまで,
このムービークリップ内のタイムラインは,
フレーム3 と フレーム2 をループするわけです。
実際にはフレーム3 が表示されることはないので フレーム2 が連続実行されます。

そして,/load_mc(_root.load_mc) のフレームがフレーム2までロードされた時点で,
trace("ロード完了"); が実行されて stop() します。

loadMovie を実行させるところまで,
このムービークリップにさせていますが,
loadMovie をボタンなどで実行する場合は,
この 外部 SWF がロードされたかどうかを監視するムービークリップ内のタイムラインは
フレーム2 までにして,
フレーム2 と フレーム3 のスクリプトを順次前フレームに移動させるなどの対処をしてください。



かなり原始的な方法だと思われるかもしれませんが,
作成がややこしいだけで,スクリプトや仕組みは単純明快でわかりやすいと思います。

結局,
この Flash 4 あたりのスクリプトが便利になったのが今のバージョンです。

極端に言うと,

 今のバージョンは
 仕組みをすべて手作りする必要がなくなっただけで
 できることは Flash 4 と大して変わらない。

と言えなくもない気がします。
全部できるわけではありませんが,工夫次第で結構なことはできます。

Flash 4 では,
なんでもかんでも自作ですから面倒は面倒ですけどね。
スクリプトだけで解決するのではなく,
ムービークリップのタイムラインと gotoAndPlay や stop を大いに活用することです。
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。

仰るとおり、Flash8 で Flash4形式のパブリッシュをしています。
再生予定のPlayerは最新を想定していますので、JPEGのloadMovieによる表示は可能という前提でした。

・こちら側の事情で、どうしてもFlash4以前の形式で書き出したかったこと。
・ドラッグをサポートしたいためにLite形式では書き出せなかったこと。

が背景にあります。


BlurFiltan様の方法、とても参考になりましたが、
読み込むJPEG画像は、サーバ側で動的に生成されるため、
JPEGを読み込んだSWFをあらかじめ作成しておく事ができません。
そのため、直接JPEG画像をロードしています。

読み込まれるMCがロード中などのプロパティを取得するなど、
なにか方法はありませんでしょうか?

お礼日時:2007/11/28 10:43

#1ですが,


ハッ???
ますます意味不明ですね。

Flash Lite は考えないのでしょう。
そして JPEG をロードする時点で Flash Player 6 以上が必要なわけです。
ですからその時点で Flash 4 などにこだわる必要がないと思うのですけど。
Flash4形式にする意味がないと思います。


~・~・~・~・~・~・~・~・~・~・~・~・~

意味がわかりませんが一応方法案。

外部JPEGのファイル名称を「my_jpeg.jpg」だということにしておきます。

JPEG をロードするムービークリップを極小さくまたは空のムービークリップとして作成します。
インスタンス名は 「load_mc」 としておきます。

そしてロードリスナー用の,
内部フレームが3フレームのムービークリップのフレーム1には次のように書きます。
------------------------------
loadMovie("my_jpeg.jpg", "/load_mc");
------------------------------


フレーム2には次のように書きます。
------------------------------
if (_root.load_mc._width>10) {
// 実際には何か違う動作をさせる
trace("ロード完了");
stop();
}
------------------------------


フレーム3には次のように書きます。
------------------------------
gotoAndPlay(2);
------------------------------

こんな感じではいかがでしょうか。
最初用意するロード用ムービークリップは,極小さいかもしくは空です。
JPEGがロードされるとそのムービークリップはJPEGの大きさになります。
おそらく横幅は 10px 以上あるでしょう。
ですから if (_root.load_mc._width>10) にしています。

書いてはみましたが,
Flash Player 4 では閲覧不可能なので実際には動作しません。
(動作しないという断言は初めてです。)

Flash Player 6 以降では無事に動作すると思います。


~・~・~・~・~・~・~・~・~・~・~・~・~

JPEG のロードは Flash Player 6 以上が必要なわけですし,
せめて Flash Player 6 以上では考えられないものでしょうか。

あとドラッグの件も,
on(release){} など onイベントハンドラは,
Flash 5 以下ではボタンにしか書けないわけです。
一方 stratDrag などはムービークリップに対するスクリプトです。
ですからムービークリップの中にボタンを入れて,
ボタンごとムービークリップをドラッグするというような妙なこともしなければならないので大変です。

Flash Player 6 までは MovieClipLoader は使えませんが,
Flash 5 以上だと onClipEvent ハンドラが使えますよね。
JPEG のロード完了くらいでしたら,
ムービークリップの
onClipEvent(load){ } で取れます。
また,
onClipEvent(data){ } で各データセクションが読み込まれるたびに何かを実行できます。
すごく楽ですけどね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

横幅を監視する方法、使えそうですね。
思いつきませんでした。試してみます。

なぜ、Flash4なのか?と疑問をお持ちになられるかと思いますが、

・flaファイル編集はFlash8
・パブリッシュ形式はFlash4
・FlashPlayerは6以降

という状態なのですが、
パブリッシュをFlash4形式にしている理由は、こちらの事情としかいいようがありません。
(作成したFlashを自作のツールに通すときにFlash4形式でないと都合が悪い。)


また、ドラッグについては、
ボタンイベントから、直接ムービークリップに対してドラッグスタートを発行し、うまく動いています。


質問内容について、うまく解決できそうです。
度々のご回答ありがとうございました。

お礼日時:2007/11/29 08:47

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


人気Q&Aランキング