アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在Eラーニングのようなものを作っております。
HTMLからFlashVarsでswfへ変数を渡し、フレームを指定して再生したいと思っています。

具体的には、
トップページindex.htmlからリンクをはって、ch7_file.swfという
ファイルを開きます。
ch7_file.swfファイルは、39フレームあり、各フレームにstop();
を書き、nextFrame()とprevFrame()が書かれたボタンを配置
してあります。計706Kです。
そして1フレーム目には
this.gotoAndStop(fn);
delete fn;
とかいてあります。

ch7_file.swfへのリンクはトップページに2つあり、それぞれ開始
するフレームが異なります。
1つはch7_file.swfがはめこんであるch7_file.htmlへのリンクで、
1フレーム目から再生するもの。
2つ目はch7_file.swfがはめこんであるch7_file_new1.htmlへの
リンクで、7フレーム目から再生するものです。ch7_file_new1.html
ファイルには、
<param name="FlashVars" value="fn=sec3_1" />
<embed src="../flash/ch7_file_new1.swf" FlashVars="fn=sec3_1" .../>
と書きました。

2つめのリンクをクリックしても、ch7_file.swfは1フレーム目から開
始されたため、
test.text = fn;
と1フレーム目にかいてみたところ、値がテキストボックスに表示さ
れました。

そこで、似たような動きをするActionScriptとHTMLの中身が同
じswfを作ってみたところ、フレームを指定して再生することがで
きました。このswfは、7フレームあり、計4Kです。

何をどうすれば動くのか分からなくなってしまいました。
どなたか教えてください。

使用環境は:
Windows 2000
DreamWeaver MX 2004
FLASH MX 2004 version 7.2
InternetExplorer 6.0.2800.1106
Netscape 7.1
Mozilla Firefox 1.0.7

どうか宜しくお願いします。

A 回答 (2件)

#1です。



#1 の補足を拝見しました。
_root に対する onEnterFrame = function() {}; が重なっているではないですか。

例えば,次のようなスクリプトは,
bbb++; しか実行されません。

----------------------
var aaa = 5;
var bbb = 0;

this.onEnterFrame = function() {
aaa++;
};

this.onEnterFrame = function() {
bbb++;
};
----------------------

先の aaa++; の方の onEnterFrame = function() {}; は,
後の bbb++; の onEnterFrame = function() {}; に取って変わられて,
(定義しなおされて,)
bbb++; だけになります。後勝ちです。



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

ちょっと タイム... 。

話がややこしくてすみません。
都合上,少し違う話を先に書きます。

私のミスで関係のない話を書かなければいけなくなってしまったのですが,
フレーム移動しない理由とは別で,
#1 で書いたスクリプトは,1行書き忘れがあります。

----------------------
// とりあえずストップ
this.stop();
// 1フレーム進む時間ごとに随時実行
this.onEnterFrame = function() {

// swfファイルすべてが読み込まれたら
if (this.getBytesLoaded()>=this.getBytesTotal()) {
// フレームfn に
this.gotoAndStop(fn);
// そしてこの onEnterFrame を削除
delete this.onEnterFrame;
} else {
// それ以外はストップ
this.stop();
}

};
----------------------

これ↑が正解です。

 // そしてこの onEnterFrame を削除
 delete this.onEnterFrame;

これが抜けていました。
delete this.onEnterFrame; を書かなくても,
フレーム移動はすることはしますが,
これを書かないと,
その後もずっと,

 this.gotoAndStop(fn);

が繰り返し実行されます。したがって,

> nextFrame()とprevFrame()が書かれたボタンを配置
> してあります。計706Kです。

と書かれている,nextFrame() と prevFrame() のボタンが動作しなくなります。
ですから,上のように訂正します。



~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

それで,本題に "近い" 話に戻るのですが,
_root に対する onEnterFrame = function() {};
が重なっているので,
本来は1つの onEnterFrame = function() {}; 内に

> frameNo = this._currentframe;

も入れればすぐ解決するのですが,
上にも書いたように,上の onEnterFrame = function() {}; は削除しなければなりません。
したがって,

> frameNo = this._currentframe;

を同じ onEnterFrame = function() {}; 内に書けないのです。



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

というわけで,
やっと,最初の本題に戻ります。

_root に 対するonEnterFrame = function() {}; が重なっているので,
私の回答した方の ロード待ちスクリプトをムービークリップに移動させます。

フレーム1 だけに存在する透明もしくは空のムービークリップを1つ作成してください。
              1
 □ レイヤー 筆・・・|●|○  

こんな感じで,フレーム1 にだけ存在するムービークリップです。
見える必要はないので,ステージ上であれば場所はどこでもかまいません。

そして,
そのムービークリップ自体に,

------------------------------------
// このムービークリップが表示されたら
onClipEvent (load) {
// とりあえず _root をストップ
_root.stop();
}

// 1フレーム進む時間ごとに随時実行
onClipEvent (enterFrame) {

// _root がすべてが読み込まれたら
if (_root.getBytesLoaded()>=_root.getBytesTotal()) {
// _root の fn フレーム に _root の再生ヘッドを移動
_root.gotoAndStop(_root.fn);
} else {
// それ以外は_rootをストップ
_root.stop();
}

}
------------------------------------

と書けば大丈夫だと思います。
これは ムービークリップ が存在しなくなると,
実行を続けませんから,スクリプトで delete する必要はありません。



ちなみに,
FlashVars の方は大丈夫ですよね。
私の環境では,Objectタグにも

<param name=FlashVars VALUE="fn=sec3_1" />

を書かないとうまく行きませんでしたが,
この辺は大丈夫ですよね。
おそらく FlashVars の方は大丈夫だと思うので,
念のため少し書いてみただけです。



---あと,気になったこと-------------------

私は,スクリプトがどんなに長くなっても,
同じタイムライン(_root なら _root)の,同じフレーム(フレーム1 なら フレーム1)に書く場合,
レイヤーを分けません。
普通の方もだいたいそうだと思います。

1つのタイムラインでは,1つのレイヤーをスクリプト専用レイヤーにして,
そのレイヤーだけにスクリプトを書きます。
あっちこっちに書いてもややこしくなるだけだと思います。
実行されるタイミングもどっちが先かわからなくなりますし。

当然,スクリプト専用レイヤーには,
ムービークリップなどのインスタンスや,シェイプなどの絵も置かないので,
a マークの付いたフレームは必ず ○(白丸) 状態です。

タイムラインの雰囲気↓

////////////////////////////////////////////////
              a    a        a
 □ レイヤー 筆・・|○  []|○     []|○| ←Script
 □ レイヤー 筆・・|●>------>|●//// []| ←その他
 □ レイヤー 筆・・|○|●////[]|●-->|●[]| ← 〃
 □ レイヤー 筆・・|●>------->|● []|○| ← 〃

////////////////////////////////////////////////

↑絶対にこうするべきと言う意味ではありません。
 こんな感じにすることをお薦めしますということです。
    • good
    • 0
この回答へのお礼

sassakunさん

ありがとうございます。
とても丁寧なご説明ほんとに感謝します!

sassakunさんのご指示とおりにつくってみましたが、fnページ
から表示することはできませんでした。
が、しかし、ご説明いただいたことをふまえ、sassakunさんの
スクリプトでいろいろ試してみたところ、以下のスクリプトで
ページを飛ばすことができました!

this.stop();
this.onEnterFrame = function() {
frameNo = this._currentframe;
if (this.getBytesLoaded()>=this.getBytesTotal()) {
this.gotoAndStop(fn);
} else {
this.stop();
}
delete fn;
};

sb.contentPath = "load_menu";
var scroller = sb.content;
scroller.gotoAndPlay(1);

まさか他のスクリプトと指示がぶつかって無効になっているなど
夢にも思いませんでした!
スクリプトは1つのレイヤーにまとめました。これからはこのつくりで
進めていきます。
ほんとうにありがとうございました!

お礼日時:2006/08/31 11:42

Flash Vars の問題ではなく,


その swf の フレーム1 に

this.gotoAndStop("sec3_1");

と書いても,フレーム30 にはフレーム移動しないと思います。
Flash とはそういうものです。
メモリ上にまだ読み込まれていないフレーム移動出来ません。

これでいかがでしょうか↓。

-------------------------------
// とりあえずストップ
this.stop();
// 1フレーム進む時間ごとに随時実行
this.onEnterFrame = function() {

// swfファイルすべてが読み込まれたら
if (this.getBytesLoaded()>=this.getBytesTotal()) {
// フレームfn に
this.gotoAndStop(fn);
} else {
// それ以外はストップ
this.stop();
}

};
-------------------------------


フレーム1 に書いてください。
コピペでも動作すると思います。

意味は,// の付いているコメント行に書いています。

そういうフレーム移動エラーが起こる可能性があり,
なおかつ読み込み待ち処が長くなる可能性がある場合,
「読み込み中... ...」や「Now Loading ...」というような画面を用意することもあります。
Flash でたまに見かける「Now Loading...」はそういう意味です。

上のスクリプトでは,単に フレーム1 でストップし
エラーを回避しているだけで,
「Now Loading...」 などは,当然表示されません。


ちなみに,
Flash Vars で指定している値は,フレームラベルですよね。
もし,フレームラベルではなく, フレーム数を指定している場合は,
もっと合理的,なおかつ簡素なスクリプトで行けます。
ご参考までに。

-------------------------------
// とりあえずストップ
this.stop();

// 1フレーム進む時間ごとに随時実行
this.onEnterFrame = function() {

// fnフレーム 以上が読み込まれたら
if (this._framesloaded>=fn) {
// フレームfn に
this.gotoAndStop(fn);
} else {
// それ以外はストップ
this.stop();
}

};
-------------------------------
    • good
    • 0
この回答へのお礼

sassakunさん

回答ありがとうございます!
早速2通り試してみましたが、どちらもフレーム移動は行われま
せんでした。
いったい何が原因なのかわかりません・・・

「Now Loading ...」は、1秒ほどでswfファイルが表示される
ため使用していません。
HPなどを見ていると、ページを表示するまでに数秒かかる
場合がありますが、現在作成しているファイルは、アップし
て他のマシン上でも確認しましたがキャッシュを削除しても
1秒ほどで表示されています。

思い当たることとして、他に記述しているスクリプトは、
・横においてあるScrollPaneの中にあるムービーを動かすための
スクリプトを1フレーム目の違うレイヤーに:
sb.contentPath = "load_menu";
var scroller = sb.content;
scroller.gotoAndPlay(1);

・ページ数を表示するスクリプトを1フレーム目の違うレイヤーに:
this.onEnterFrame = function(){
frameNo = this._currentframe;
// totalframe = this._totalframes;
};

のみです。

ムービーは多数使用していますが全フレームにあるわけではなく、
今回表示させたい7ページ目にはムービーはありません。
ムービーは、loadMovieは使用せず、各フレーム内のレイヤーに
直接配置してしまっています。

つくりの問題かも、と思ってしまっています・・・

お礼日時:2006/08/30 11:20

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