• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:onPressに関する質問)

onPressに関する質問

DPEの回答

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

ActionScript はオブジェクト指向の言語、と言われます。 オブジェクトの考え方は、様々なスキル(技能)を持った人を必要なだけ連れてきて、それぞれに仕事を任せるようなものです。 ステージにムービークリップのインスタンスを置き、インスタンス名を付けると、それだけで、MovieClip というスキルを持った人を1人、雇ったことになります。 ActionScript で new 演算子を使うことで雇うタイプの人もいます。MovieClipLoader や LoadVars はこのタイプです。 今、読み込みたい画像が5つあるとします。 画像の受け皿としてムービークリップが必要ですから、ムービークリップも5つ必要になります。となると、この時点で MovieClip を5人、雇ったことになります。 MovieClip は様々なスキルを持っていますが、そのうちの1つ、loadMovie を使って画像を読み込むとします。 MovieClip.loadMovie で1度に読み込める画像は1つだけ、しかも読み込む受け皿は自分自身に固定ですので、MovieClip に頼んで5つの画像を読み込むには、MovieClip は5人ともフル稼働ということになります。 ループを利用して  for( i = 1 ; i <= 5 ; i++ )  {   this[ "clip" + i ].loadMovie( "image" + i + "jpg" , i );  } このようにすると、スクリプトは1行なのですが、実際に稼動しているのは clip1 ~ 5 の5つのオブジェクトです。 では、MovieClipLoader はどうかと言いますと。 load_obj = new MovieClipLoader(); で、MovieClipLoader を1人、雇います。 MovieClipLoader は画像や swf ファイルの読み込みのプロです。MovieClip と違い、読み込みを1件ずつしか管理できず、それも読み込み先のムービークリップが固定などという不器用な仕事はしません。 例えば、5つの画像を5つのムービークリップに読み込むなら、  for( i = 1 ; i <= 5 ; i++ )  {   load_obj.loadClip( "image" + i + "jpg" , this[ "clip" + i ] );  } この場合、稼動しているのは load_obj ただ1つだけです。 MovieClipLoader は取引台帳のようなものを持っていて、複数の読み込みを全て1人で管理する能力があると考えると、分かりやすいかも知れません。 この台帳には、受注した読み込みの進捗状況が事細かに書かれており、必要に応じて個別の情報を見せてもらうこともできます。 例えば、上記のように5件の読み込みの注文を出しておいて、  load_obj.getProgress( clip1 ); このようにすると、clip1 に読み込む総容量と読み込んだ容量を教えてくれます。(戻り値が2つあるため、戻り値を利用するには少々コツが必要です) また、それぞれの画像の読み込みが終わった時や、もしエラーが起きた時はこのようにしてほしいと、予め取り決めをしておくと、全ての読み込み作業で同じ処理をしてくれます。 なお、リスナーオブジェクトを先に登録し、イベントの情報をこちらに渡して処理させることもできます。いうなれば、MovieClipLoader の専属アシスタントを付けるようなものでしょうか。ヘルプに載っているサンプルは、リスナーオブジェクトを使った例です。 リスナーオブジェクトは普段は使い道がよく分かりませんが、例えば電子会議のように、1つのムービーに複数の閲覧者が接続していて、全ての閲覧者に同じ画像を配信したい場合などに真価を発揮します。 ------------------- 今さら何ですが。 そもそもエラーを利用してファイルの存在を確認するという発想は、フォルダに画像がいくつあるか Flash 側では把握できないものを、何とかして存在するだけ読み込みたいというところから出たはずです。 それが、ファイル名(もしくは管理番号などのヒント)を配列で与えて管理するのでしたら、いちいちエラーを利用してファイルの存在を確認したりせず、最初から、その配列の中身を元に読み込みの指示を出してはいかがでしょうか。 配列の要素がいくつあるかは、Array.length というプロパティで分かります。 例えば配列名が filename_tbl とすると、  for ( i = 0 ; i < filename_tbl.length ; i++ )  {   //ムービークリップを複製し、画像を読み込む   sheet.target.duplicateMovieClip( "b" + i , i );   sheet[ "b" + i ].loadMovie( filename_tbl[ i ] );  } 最初からファイルの数や名前が分かっていれば、for ループも利用できます。ただし、これはあくまでも読み込みの指示を出すだけですので、読み込みの完了を待って次の処理をするには、フレーム間のループも必要です。 配列のインデックスは0から始まります。ムービークリップを複製する時の番号も0から始めると、ループカウンタと管理番号がズレなくて便利です。 例えばファイルが5つなら、filename_tbl の長さである length プロパティは5ですが、インデックスの番号は0~4です。ループの終了条件を i <= filename_tbl.length と、5”以下”にしないよう、ご注意ください。 サムネイル画像でクリックを検出するには読み込みの完了を待たなければならないのは、#1で書いた通りです。 onClipEvent(data) を利用して読み込みが完了したファイルの数をカウントし、この数と filename_tbl.length を照合して全ての読み込みの完了を検出できます。 この場合はファイル名も読み込む数も先に分かっていますから、MovieClip.getBytesTotal と MovieClip.getBytesLoaded でもロード完了率を算出できると思います。 なお、読み込みが途中で失敗すると getBytesLoaded の値が狂うこともあり得ますので、getBytesTotal と getBytesLoaded の値を照合する方法はオススメしません。 ------------------- 参照しようとした変数が undefined になる理由は、大抵は階層の間違いですが。 var_product や var_menu がメインのタイムラインにあるのでしたら、サムネイル内のボタンやムービークリップから参照するには、_root までのターゲットパスが必要です。 ボタンシンボルにはタイムラインがないので、ボタンシンボルは変数や関数を保持できません。ボタンインスタンスに相対パスで変数や関数を利用するスクリプトを書くと、親の階層にある変数や関数と見なされます。ですから、ボタンインスタンスへのスクリプトでは、親の階層までのターゲットパスが省略可能です。 ムービークリップをボタンとして使う場合は通常通り、自分の階層までのターゲットパスが省略可能です。 別の疑問は、できるだけスレを分けてください。 追加の便乗質問は1つくらいなら構わないのですが、あれもこれもとなると、スレが長くなったり、質問と回答の内容がズレていったりして、ページも重くなりますし、後から見る人の迷惑になります。

teddy1014
質問者

お礼

まず、便乗質問の件は申し訳ありません。 話のつながりで、別の質問を設定するとお答え頂く方(DPEさん)が戸惑われないかなぁと思い、長々と質問する羽目になりました。 エラーハンドリングの件、おっしゃる通り最初はファイル数が分からない、ファイル名をSequencialに付け直すという発想からでしたが、あまりのファイルの多さにファイル名の付け替えに要するワークロードなどを考えた時、コントロールするテキストファイルを用意した方が得策だと思い、途中で方針変更となりました。 ご指摘のように配列に格納されている数だけループで処理すればロジックも見易くなり簡単になりますね。 それに、MovieClipLoader を使えば読み込みの完了はonLoadComplete()内のロジックで実装すればフレームのループも必要無くなりますよね。 ありがとうございます。モヤモヤはがすっきり晴れました。

関連するQ&A

  • マウス位置によって画像を切り替える

    ステージ上のマウス位置を読み取り、その座標によって画像を切り替えるFlashを作成中なのですが、上手くいきません。 流れとしては 画像のファイルを読み込む ↓ 画像のファイル分だけムービークリップを作成 ↓ マウスの座標に応じて画像(ムービークリップを切り替える) というものです。 下記のようにかいています。 ●1フレーム目 //各画像の変数読み込み jpg1 = "test1.jpg"; jpg2 = "test2.jpg"; jpg3 = "test3.jpg"; jpg4 = "test4.jpg"; //初期配置 //空のMCを作成し、その中に画像変数を読み込ませる。 _root.createEmptyMovieClip("image_mc0",4); _root.createEmptyMovieClip("image_mc1",3); _root.createEmptyMovieClip("image_mc2",2); _root.createEmptyMovieClip("image_mc3",1); _root.image_mc0.loadMovie(_root.jpg1); _root.image_mc1.loadMovie(_root.jpg2); _root.image_mc2.loadMovie(_root.jpg3); _root.image_mc3.loadMovie(_root.jpg4); //マウスが押されたときに変数MCclickをオンにする _root.mouse_mc.onPress = function() { MCclick = true; trace( "押された時の変数 " +_root.MCclick); } //マウスが離れた時に変数MCclickをオフにする _root.mouse_mc.onRelease = function() { MCclick = false; trace( "離れた時の変数 " +_root.MCclick); nowpoint = (_root._xmouse); trace( "今の位置" + nowpoint); } //マウスがボタン領域外にいった時に変数MCclickをオフにする _root.mouse_mc.dragOut = function() { MCclick = false; trace( "どっかいった時の変数 " +_root.MCclick); } stop(); ●ステージ上にかぶせている透明なMC(mouse_mc) //MCclickがオンの時変数mc_xの値をとり続ける onClipEvent (mouseMove) { if (_root.MCclick) { _root.mc_x = (_root._xmouse); trace( "押された時の変数mc_xの位置 " + _root.mc_x); trace( "マウスを押したままの変数 " + _root.MCclick); //100以下の時に画像1を表示 if((_root.mc_x >= 0) || (_root.mc_x <= 100)){ _root.image_mc0._visible = true; _root.image_mc1._visible = false; _root.image_mc2._visible = false; } else if((_root.mc_x >= 100) || (_root.mc_x <= 200)){ _root.image_mc0._visible = false; _root.image_mc1._visible = true; _root.image_mc2._visible = false; } else if((_root.mc_x >= 200) || (_root.mc_x <= 300)){ _root.image_mc0._visible = false; _root.image_mc1._visible = false; _root.image_mc2._visible = true; } } } この書き方で一応動作はするのですが、1枚目と2枚目の画像の切り返しか動作が行われなくて困っています。 画像のサイズ、ステージのサイズは両方とも 400*400です。

    • ベストアンサー
    • Flash
  • loadMovieしたムービークリップのボタン化

    ムービークリップにloadMovieで1.jpgをロードし、それをボタンにしたいのですが、下のスクリプトではうまく動作しません。 menu01_mc.loadMovie("1.jpg"); menu01_mc._xscale=10; menu01_mc._yscale=10; menu01_mc.onRelease = function(){ gotoAndStop(5); } 最初のloadMovieの部分をなくし、 menu01_mc.onRelease = function(){ gotoAndStop(5); } とするとちゃんと動作します。 loadMovieしたムービークリップはボタンにできないのでしょうか? FlashCS3、actionscript2.0で作成しています。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • クリック押下中にキーボードを押すとクリックを離したことになってしまう!

    タイトルの通りです。 まずマウスでmc1をクリックと「クリックしている」と表示されるのですが、そのままクリックした状態でなにかのキーを押すと「クリックを離した」とでてしまうのです。 _root.mc1.onPress = function(){ trace("クリックをしている") } _root.mc1.onRelease = function(){ trace("クリックを離した") } クリックを押下し続けている間は「押し続けているのだ」という情報を得る方法はないのでしょうか?

    • ベストアンサー
    • Flash
  • eval関数を利用して複数の処理を1つのfunctionで行う

    こんにちは。 困ったので質問させてください。 今、MX2004のFLASHを使ってあるゲームを作成しています。 「XXX」とリンゲージ名をつけたムービークリップを          for(i=0;i<=100;i++){     obj = _root.attachMovie("XXX", "mc"+i, i);//MCの作成     obj._x = table_x[i];//X軸の値の格納テーブル     obj._y = table_y[i];//Y軸の値の格納テーブル     } で100個のムービックリップを画面上に『mc+連番(以下「mc●●」)』と名前をつけてで作成しました。 この画面上に作成したムービークリップmc●●をクリックするとTraceで「OK」と表示したいのですが・・・     mc1.onMouseUp = function(){       Trace("OK");     }     mc2.onMouseUp = function(){       Trace("OK");     }     mc3.onMouseUp = function(){       Trace("OK");     }     ・     ・×97回     ・ この様にmc●●と同じ数だけ100回同じような文を記述する方法しかないのでしょうか? 個人的には 『eval("_root.mc"+i)』を利用して同じような構文は削除したいのですが良い方法が思いつきません。 何か良い方法がありましたらご教授ください。 お願いします。

  • ムービークリップのボタン化

    menu01_mcというムービークリップをボタンにしたいのですが、 ボタン自体に on (release) { _root.photo_mc.loadMovie("1.jpg"); } と書くと正常に動くのですが、 タイムライン上に menu01_mc.onRelease = function(){ _root.photo_mc.loadMovie("1.jpg"); } と書くと動きません。 どのようにすればいいのでしょうか? わかる方教えてください。よろしくお願いします。

  • 【action script】複数のMCを・・・

    環境:Flash8 actionscript2.0 10こ程度のムービークリップをそれぞれクリックした時に同じ動きをさせる文を1つにまとめることは可能でしょうか? ムービークリップそれぞれに mc1 mc2 mc3 …mc10 とインスタンス名をつけています。 さらにその下位層に mc1  └kai_mc mc2 └kai_mc ・ ・ ・ mc10 └kai_mc と置いています。 このそれぞれのムービークリップをクリックした際、その下位層のムービークリップを次のフレームに移動させたいと考えています。 それぞれ個別に書くと _root.mc1.onRelease=function(){ _root.mc1.kai_mc.nextFrame() } と書いていたのですが、ムービークリップの数を増やすかも知れずムービークリップの数分書くのは大変なので1つにまとめたいと考えています。 自分で以下のように書いてみました。 i=0 for(i=1; i>10; i++){ _root["mc"+i].onRelease.function(){ _root["mc"+i].kai_mc.nextFrame() } } うまくいかないので試行錯誤したりtraceで調べたりしたのですがどうもよくわかりません。 i=0 for(i=1; i>10; i++){ _root["mc"+i].onRelease.function(){ trace(i) } } で出力すると 11と表示されるのでpassが違うとは思うのですが・・・ iを1~10で指定しているのになぜ11となるのでしょうか? どうすればpass指定できるのでしょうか? そもそものやり方、考え方が違うかどうかも含め、教えて頂きたく質問しました。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ActionScript2.0のイベントについて

    親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。 親ムービークリップ自体には下記のイベントを設定しています。親ムービークリップはattachMovieで動的に配置しています。 onRollOver・・・onEnterFrameを設定 onRollOut・・・onEnterFrameを削除 子ムービークリップを配置して子ムービークリックにイベントを設定しました。onEnterFrameをは実行されますが、onReleaseが実行されず困っています。 function Parent() { this.onRollOver = function() { this.onEnterFrame = function(){・・・} } this.onRollOut = function(){ delete this.onEnterFrame; } this["child_mc"].onRelease = function() { trace('a') // 実行されない } this["child_mc"].onEnterFrame = function() { trace('b') // 実行される } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ _root.attachMovie("Parent", "parent_mc", _root.getNextHighestDepth(), new Parent()); 子ムービークリップはオーサリングで静的にParentに配置し、プロパティでchild_mcと設定しています。 onReleaseは実行できず、そこで止まっています。 なんでも良いので教えてください。

    • ベストアンサー
    • Flash
  • 複数ボタンの生成 - actionscript

    以前複数のムービークリップを作る方法を 教えていただいたのですが、そのムービークリップ をボタンにしたいのですがうまく行きません。 for (var i = 1; i<5; i++) {   _root.createEmptyMovieClip("mc"+i, i);   var load_mc = _root["mc"+i];   _root.test = load_mc;   var jpg = i+".jpg";   load_mc.loadMovie(jpg);   i = i-1;   load_mc._x = i*200;   i = i+1; } onEnterFrame = function () {   for(var t=1;t<5;t++){ var load_mct = _root["mc"+t]; load_mct.onPress = function(){ trace(t);   }  if(_xmouse>540 && _root.mc1._x<=-1) {   for (var j = 1; j<5; j++) { var load_mcj = _root["mc"+j]; load_mcj._x += 10;   }  }  if(_xmouse<10 && _root.mc1._x>=-1*((test*200)-560)) {   for (var j = 1; j<5; j++) { var load_mcj = _root["mc"+j]; load_mcj._x -= 10;   }  } } 多分EnterFrameの中に記述するのがおかしい と思うのですが、いったいどこに記述しないと いけないのがわからないので、どなたか ご教授ください。

    • ベストアンサー
    • Flash
  • Flash ActionScript(アクションスクリプト)の挙動

    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】になっています。 難しい処理をしているわけではないと思うのですが、 思うとおりの挙動にならず困っています。 何か間違いや見落とし等ございましたら、ご指摘お願いいたします。

    • ベストアンサー
    • Flash
  • FLASHでムービークリップ名を変数で持つ場合のloadmovie

    FLASHMXで空ムービークリップを作成して その中に外部SWFを読み込むスクリプトを書いています。 外部ファイルはa0.swfからa10.swfまであるのでそれを全て読み込む為に 空ムービークリップ名を変数で持ちたいのですが loadmvieの行では変数と認識してくれないようで何も表示されません。 (traceの行の2つの変数は正常に表示されますし  直接ムービークリップ名を入れれば読込もできます) おそらく下のソースの例だとpart_mcは変数名なのに そのままムービークリップ名と捕らえられてしまっているようです。 どのようにすれば変数と認識してくれるのでしょう? for (var i = 0; i<10; i++) { var part_mc = "a10" + i + "_mc"; var loadfile = "a" + i + ".swf"; _root.createEmptyMovieClip(part_mc, 100+i); _root.part_mc.loadMovie(loadfile); _root.part_mc._x = i * 10; trace(loadfile); trace(part_mc); } アドバイスをお願いします。