FlashCS5 ActionScript2.0で3つのボタンを制御しています。
それぞれインスタンス名はbt1,bt2,bt3です。
動きはマウスオーバーで120%大きくなり、ロールアウトで100%へと戻るものです。
しかし、ロールアウトの動作中に他のボタンに触ると、ロールアウトの動作が中断してしまいます。
なぜでしょうか?
////////////////////////////////////////
stop();
sx = 3;
var i;
//-----------
for( i = 1; i < 4; i++){
Nov = "bt" + i;
_root[Nov].onRollOver = function(){
Name = this._name;
btOverMotion(Name);
}
_root[Nov].onRollOut = function(){
Name = this._name;
btOutMotion(Name);
}
}
//-----------
function btOutMotion(eachNo){
No = eachNo;
onEnterFrame = function(){
if(_root[No]._xscale < 100){
delete this.onEnterFrame;
}else{
_root[No]._xscale -= sx*2;
_root[No]._yscale -= sx*2;
}
}
}
//-----------
function btOverMotion(eachNo){
No = eachNo;
onEnterFrame = function(){
if(_root[No]._xscale > 120){
delete this.onEnterFrame;
}else{
_root[No]._xscale += sx;
_root[No]._yscale += sx;
}
}
}
No.1ベストアンサー
- 回答日時:
書かれていらっしゃるスクリプト中にある
onEnterFrame = function(){…} は
スクリプトを書かれていらっしゃるタイムラインに対して(_rootに対して)定義している
onEnterFrameイベントハンドラメソッドです。
つまり
_root.onEnterFrame = function(){…}
と書いているのと同じことです。
1つのムービークリップ(_rootもムービークリップの一種) に対して
同じ種類のイベントハンドラメソッド は1つしか定義できません。
_root.onEnterFrame = function(){A};
_root.onEnterFrame = function(){B};
_root.onEnterFrame = function(){C};
と書いた場合,結局
_root.onEnterFrame = function(){C};
だけ書いたのと同じになります。
(同じ関数名の関数を再定義し直しているだけ)
回避策としては,
ボタンをボタンインスタンスとして用意するのではなく
ボタンをムービークリップインスタンスとして用意し
そのムービークリップに対して
各ムービークリップ.onEnterFrame = function(){…};
を定義するのが一般的です。
しかし
ボタンはボタンインスタンスでしか用意できない場合は,
onEnterFrame 定義用のムービークリップを作成しても良いと思います。
それと...
var なしで関数内に変数を作成すると
その変数はグローバルなタイムライン変数になってしまいますよ。
その点も入れてスクリプトを修正↓
=================
stop();
sx = 3;
var i;
//-----------
for (i = 1; i < 4; i++) {
Nov = "bt" + i;
//_rootの深度iにムービークリップ「bt[1~4]_mc」を作成
_root.createEmptyMovieClip(Nov + "_mc", i);
_root[Nov].onRollOver = function() {
Name = this._name;
btOverMotion(Name);
};
_root[Nov].onRollOut = function() {
Name = this._name;
btOutMotion(Name);
};
}
//-----------
function btOutMotion(eachNo) {
//↓このNoはローカルであるべき
var No = eachNo;
//各ムービークリップに対してonEnterFrameを定義
_root[No + "_mc"].onEnterFrame = function() {
if (_root[No]._xscale < 100) {
delete this.onEnterFrame;
} else {
_root[No]._xscale -= sx * 2;
_root[No]._yscale -= sx * 2;
}
};
}
//-----------
function btOverMotion(eachNo) {
//↓このNoはローカルであるべき
var No = eachNo;
//各ムービークリップに対してonEnterFrameを定義
_root[No + "_mc"].onEnterFrame = function() {
if (_root[No]._xscale > 120) {
delete this.onEnterFrame;
} else {
_root[No]._xscale += sx;
_root[No]._yscale += sx;
}
};
}
=================
このままでも動作に支障はないようですが
意味合いからすると
Nov = "bt" + i;
なども本当は
var Nov = "bt" + i;
のようにすべきだと思います。
大変ありがとうございます!!
よくわかりました。ガッデム理解です!
なるほどonEnterFrameって個々に当てられるんですね。
これで解決です。
グローバル変数についてもよくわかっていないのですが、ここではvarを当てた方が「よりベター」ということですよね。まあ、動くかもしれないけど、あとあと重複したりすることになって動かなくなるよ、ということで理解しました。
グローバル変数にすると"いつでもどこでも"使うよ、っていうものになってしまうのでうまくないわけですね。勉強になりました。ありがとうございます。
取り急ぎ御礼までです。
No.2
- 回答日時:
この場合の、onEnterFrameはいわゆる時計(タイマー)のようなものです。
同時に2つ以上の行動が起こせないのは、その時計が1つしかないからです。
たとえば、今回のロールオーバー・アウトのアクションは、「一定時間毎に大きさを3%づつ変化させ、ある大きさになったらストップする」というものですが、この一定時間を計測しているのがonEnterFrameです。ひとつのボタンからロールアウトして、時間を計測中にも関わらず、新たなロールオーバーによって計測をリセットしてしまうというのが、今回の現象です。
つまり時計の数を増やすことで、この問題は解決できます。
例の記述では、記述したタイムラインの時計を使っているので、それを各ムービークリップの時計を使用するようにすれば、よいかと思います。
具体的な方法は、BlurFiltanさんの例が参考になりますね。
おかげさまで理解できました。
なるほど、rootの時計、各ムービークリップの時計で分ければいろいろな時間を使えるっていうわけですね。
わかりやすい説明ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python ボタンを押すと複数の関...
-
flash 大きさの異なる写真のス...
-
FLASHで「かるた」を作りたいの...
-
脱出ゲームを作るときのアクシ...
-
四乗根を英語で言うと・・・
-
PythonでSetWindowPosを使うに...
-
ホイールマウスで動かす
-
オブジェクトのランダムな位置表示
-
100点でクリアする簡単なモグラ...
-
StandardMLの二分木に関する問...
-
パーセントで配置したフラッシ...
-
テキストボックスの中身をリセ...
-
VBAで改行の入ったデータの正規...
-
C言語でネットワーク範囲のIPア...
-
VB.NET メッセージボックスの表...
-
フォームの生成と破棄
-
'2465'指定した式で参照してい...
-
photoshopで書いた四角の枠の中...
-
VBAからPDFのテキストフィールド
-
切り抜いた部分が動くアニメー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python ボタンを押すと複数の関...
-
else if文の順序を変えることに...
-
四乗根を英語で言うと・・・
-
Pythonのtkinterについて
-
pythonの画像の貼り付けについて
-
PYTHONのtkinterについて
-
SNMPの標準MIBについて
-
PythonでSetWindowPosを使うに...
-
スライドショーのフェードイン...
-
ADに参加していないPCからADサ...
-
FLASHで「かるた」を作りたいの...
-
レーダーチャートの描画
-
オブジェクトのランダムな位置表示
-
100点でクリアする簡単なモグラ...
-
Excel VBAで読み込んだテキスト...
-
pythonのグローバル変数
-
SharedObjectの動作がうまくい...
-
ボタンの上にマウスを置くと虫...
-
フラッシュで、画像一枚一枚に...
-
ムービープレビューでないと動...
おすすめ情報