Flash ActionScript(アクションスクリプト)の挙動が
思うようにならず困っています。
●使用ツール
Macromedia Flash MX
●やりたいこと
ムービークリップ【mc_4_0】【mc_4_1】【mc_4_2】が配置されている。
各ムービークリップにマウスが乗っているかを毎フレーム判定し、
乗っていればx/yscaleを1.5倍に、乗っていなければ1倍に戻す。
●現在の処理
○メインタイムラインの処理
----------------------------
//最初のシーンを設定
_global.scene = SceneMcSelect
//毎フレーム、シーン関数を呼ぶ
onEnterFrame = function() {
//現在シーンを呼ぶ
eval( _global.scene )();
}
----------------------------
○SceneMcSelect関数の定義
----------------------------
function SceneMcSelect(){
for( count = 0 ; count < 3 ; count++ ){
//マウスが乗ったか?
eval("mc_4_" + count).onRollOver = function(){
trace(count);
eval("mc_4_" + count)._xscale = 150;
eval("mc_4_" + count)._yscale = 150;
}
//マウスが離れたか?
eval("mc_4_" + count).onRollOut = function(){
trace(count);
eval("mc_4_" + count)._xscale = 100;
eval("mc_4_" + count)._yscale = 100;
}
}
}
----------------------------
●現在の挙動
onRollOverやonRollOutの判定は正しく行われているようですが、
x/yscaleの変更処理が行われません。
traceでcountの値を確認すると、なぜか【3】になっています。
難しい処理をしているわけではないと思うのですが、
思うとおりの挙動にならず困っています。
何か間違いや見落とし等ございましたら、ご指摘お願いいたします。
No.2ベストアンサー
- 回答日時:
大きな問題点が3点ありますが,
そのうちの2点はとりあえず無視します。
trace(count); の出力結果が 3 になるのは
単純に次のようなスクリプトを書けば理解できると思います。
------------------------------
for (count=0; count<3; count++) {
trace(count);
}
trace(count);
trace(count);
trace(count);
------------------------------
もし for文を動作的に理解するのが難しければ,
while文 にすればわかりやすいかもしれません。
上記 for文 使用のスクリプトと全く同値なものです↓。
------------------------------
count = 0;
while (count<3) {
trace(count);
count++;
}
trace(count);
trace(count);
trace(count);
------------------------------
for文にしても,while文 にしても,
結局 count の値は 3 になってループを抜けます。
したがって次のような出力結果になります↓。
-------
0
1
2
3
3
3
-------
たとえば,
このまま 10秒後 に trace(count); を実行したとしても結果は同じ。
count は 3 のままです。
このまま 1分後 に trace(count); を実行したとしても結果は同じ。
count は 3 のままです。
つまり,
このまま MCにロールオーバーしたときに trace(count); が実行されても結果は同じ。
count は 3 のままです。
したがって,
eval("mc_4_" + count)._xscale = 150;
はいつ実行しても
mc_4_3._xscale = 150;
を実行することと同じになります。
というわけで,
単純にこれで良いのではないでしょうか↓。
(#1の方と同じ)
------------------------------
// ユーザ定義関数 SceneMcSelect の定義
function SceneMcSelect() {
for (count=0; count<3; count++) {
//マウスが乗ったら実行する関数を定義
eval("mc_4_"+count).onRollOver = function() {
this._xscale = 150;
this._yscale = 150;
};
//マウスが離れたら実行する関数を定義
eval("mc_4_"+count).onRollOut = function() {
this._xscale = 100;
this._yscale = 100;
};
}
}
// ユーザ定義関数 SceneMcSelect の実行
SceneMcSelect();
------------------------------
本題ではない残りの2つの問題ですが。
> //毎フレーム、シーン関数を呼ぶ
> onEnterFrame = function() {
> //現在シーンを呼ぶ
> eval( _global.scene )();
> }
なせ onEnterFrame で
毎フレーム毎フレーム onRollOver や onRollOut を定義しなければならないのか,
不可解で意味が理解できません。
上に書いたスクリプトのように SceneMcSelect(); は1回で良いはずです。
何度も定義しなおす必要があることがあったとしても,
その都度ごとに1回で良いはずで,
毎フレーム毎フレーム(コンマ数秒ごとに)再定義し続ける必要は普通ないと思います。
この理由を補足要求しているわけではありませんよ。
本題とは関係の無い部分なのでどうでも良いのですが,
この変な部分は一考の余地があると思いましたので書かせていただきました。
もう1つは eval関数 です。
これを色々なときに使い続けると無事に動作しない場合などが出てきますよ。
eval は主に Flash 4 までで使用されていた古い関数で,Adobe もあまり推奨していません。
完全に非推奨(使用を避ける機能)にはなっていませんが,ほぼ非推奨です。
携帯の Flash Lite 1.x 用のSWFをパブリッシュするなど特別な理由がない限り,
eval は使わずに 配列アクセス演算子 を使うのが一般的です。
Google検索 「配列アクセス演算子 eval」
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D …
ご丁寧にありがとうございます!
>trace(count); の出力結果が 3 になるのは
>単純に次のようなスクリプトを書けば理解できると思います
いやはや、まったくその通りです。失礼いたしました。
MovieClip.onRollOver = function() {}を関数の定義と正しく認識しておらず、
「ユーザ定義関数【SceneMcSelect】が呼び出された時に【MovieClip】の【onRollOver】をチェック」
→「条件を満たしていればその中身を実行」
という処理をするものと勝手に想定していたのが勘違いの元だったようです。
2つ目の問題点としてご指摘いただいたのもまさにこの点が原因でして、
【_global.scene == SceneMcSelect】の時のみ、
常時【onRollOver】【onRollOut】をチェックして処理を実行する、というのが本来やりたかったことです。
(つまり、【_global.scene != SceneMcSelect】のときは【onRollOver】【onRollOut】をチェックをして欲しくない)
これを実現するには、MovieClip.onRollOver = function() {}以外の手段を使うしかないでしょうか?
3つ目のご指摘の、evalに代わる配列アクセス演算子の使用について、大変勉強になりました。
これまでevalを多用していたため、この機会に差し替えたいと思います。
重ね重ね、ご丁寧なご解答ありがとうございます!
No.1
- 回答日時:
function の中身は、
eval("mc_4_" + count)._xscale = 150;
でなくて、this._xscale = 150; じゃないでしょか?
ロールオーバーした時点ではcountは生きてないと思う。
お早い回答ありがとうございます!
>eval("mc_4_" + count)._xscale = 150;
>でなくて、this._xscale = 150; じゃないでしょか?
これでうまくいきました! 助かりました。
>ロールオーバーした時点ではcountは生きてないと思う。
まさにその通りですね、お恥ずかしい……。
onRollOver処理を、関数としてではなく
SceneMcSelectが呼び出された際にのみチェックするコマンドとして使おうとしていたのが勘違いの原因だったようです。
ご解答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Visual Basic(VBA) vba シートコピーの不具合 1 2022/06/25 17:48
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) 1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読 4 2022/10/17 20:52
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
potplayerについて質問です
-
ダウンロードしたデジブックはa...
-
Form内のselectを連動させるに...
-
FLASHでゲームを作っていた人は...
-
この曲はなんでしょう?
-
laptop go2からの買い替え、lap...
-
スクリップト
-
私のコンピューター上のファイ...
-
arduino プログラムについて
-
chrome flash
-
FLASHの再生はできないのでしょ...
-
フラッシュゲームアーカイブ2
-
ウェブサイトで Flash が事実上...
-
Flashコンテンツを使ったWebサイト
-
Flash Playerのサポートが終了
-
Flashをブロックしないで
-
ad or script について
-
Flashplayerの運用について
-
VBAのコンボボックスの年月表示...
-
Adobe Flash Player
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
actionscript3.0で親階層にある...
-
Flash ActionScript(アクショ...
-
イメージギャラリーの最後まで...
-
ActionScriptで、押したボタン...
-
オンマウスでモーションを停止...
-
Flash lite 1.1で待受け作成
-
別ウィンドウ表示時の挙動
-
FLASH LITE1.1 制限時間を任意...
-
フレーム内に移動したい
-
phpで音を鳴らす
-
フレーム内のオプションボタン...
-
Access2010でサブフォームのフ...
-
車の運転時のメガネ 縁なし(...
-
ドロップフレームの計算をエク...
-
フレーム内でのリダイレクトに...
-
フレームでのResponse.Redirect
-
GetPrivateProfileString変値
-
#1009: null のオブジェクト参...
-
エクセルVBA フレーム内のイベ...
-
VB6のスクロールバー付きフレー...
おすすめ情報