ムービクリップのロールオーバによるalphaの動作が正常に行われない理由は何ですか?

このQ&Aのポイント
  • ムービクリップのa1,a2,a3,a4をロールオーバするとそれぞれ対応する数字のh1,h2,h3,h4のムービクリップのalphaが0から100にtweenを使って動かすことを考えたいと思います。
  • このプログラムは、ムービクリップの初期設定を行い、それぞれのボタンのonRollOverイベントに対応するtweenを作成しています。
  • しかし、このプログラムは正常に動作しません。原因として考えられるのは、ボタンのonRollOverイベントが正しく設定されていないことです。
回答を見る
  • ベストアンサー

this.nの記述について

ムービクリップのa1,a2,a3,a4をロールオーバするとそれぞれ対応する数字のh1,h2,h3,h4のムービクリップのalphaが0から100にtweenを使って動かすことを考えたいと思います。 //初期設定 var obj_array:Array = new Array(); for (var i = 1; i<=4; i++) { obj_array[i] = eval("a"+i); obj_array[i]._alpha = 0; } //ここからロールオーバの操作 import mx.transitions.*; import mx.transitions.easing.*; for (var i = 1; i<=4; i++) { // 各ボタンの固有値 n を設定 this["h"+i].n = i; // 各ボタンの onRollOver 動作定義 this["h"+i].onRollOver = function() { var tween_handler:Object = new Tween("a"+this.n, "_alpha", Strong.easeOut, 0, 100, 1, true); };  しかし、まったく動作しません。理由としては何が考えられるでしょうか。

  • Flash
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

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

ご提示のスクリプトですと、h1 ~ h4 にロールオーバーした時に a1 ~ a4 が変化するようになっていると思われますが、どちらなのでしょうか? とりあえず、ご質問文通り a1 ~ a4 にロールオーバーした時に h1 ~ h4 を Tween クラスで変化させる作例を考えます。 Tween クラスのコンストラクタ( new Tween )に渡す1番目のパラメータは、トゥイーンの対象になるオブジェクトの”参照”です。 ご提示のスクリプトでは、これがただの文字列になっているため、トゥイーンを作成する対象が正確に設定されていません。 この点を修正してスクリプトにしてみますと、大体、次のようになります。 ステージに a1 ~ a4 と h1 ~ h4 があり、a○のムービークリップにロールオーバーした時、h○のムービークリップを Tween クラスで操作するものとします。 このスクリプトは、メインのタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  import mx.transitions.*;  import mx.transitions.easing.*;  ////////////////////////////////////////////////////////////  //a1~a4の初期設定  ////////////////////////////////////////////////////////////  for( i = 1 ; i <= 4 ; i++ )  {   //ロールオーバー時に操作するムービークリップを記録しておく   this[ "a" + i ].clip = this[ "h" + i ];   //ロールオーバー時の処理   this[ "a" + i ].onRollOver = function()   {    var tween_handler;    //Tweenオブジェクトを作成    tween_handler = new Tween( this.clip , "_alpha" , Strong.easeOut , 0 , 100 , 1 , true );   };  }  ////////////////////////////////////////////////////////////  //h1~h4の初期設定  ////////////////////////////////////////////////////////////  for( i = 1 ; i <= 4 ; i++ )  {   //最初は透明にしておく   this[ "h" + i ]._alpha = 0;  } **************************** ムービークリップのインスタンス名を共通の名前+通し番号で付け、この通し番号をムービークリップごとに変数に保存しておいて何かに利用する手法は、ActionScript ではよく使われます。 今回は Tween クラスには対応する番号の”ムービークリップの参照”を渡さなければならないため、番号を保存した場合は、これを利用して対象のムービークリップの名前(を表す文字列)を作り、参照に変換して渡さなければなりません。 文字列を参照に変換するには eval 関数か [ ] 演算子を使いますが、eval 関数を使う方法は旧式です。 上記のスクリプトの this[ "a" + i ] や this[ "h" + i ] が、文字列を参照に変換している部分です。 [ ] 演算子で参照に変換する方法には様々な書き方がありますが、this を使う場合は this が指す対象に注意しましょう。 フレームに書いたスクリプトでの this は、そのタイムラインの階層を指します。 しかし、onRollOver などのイベントハンドラに登録される関数の中での this は、イベントハンドラの持ち主を指すように変わってしまいます。 各ムービークリップに設定した管理番号を利用し、更に this を使った相対表現でターゲットパスを書くと、new Tween の第1パラメータは  tween_handler = new Tween( this._parent[ "h" + this.n ] , … ); このようになります。 番号を変数に記録しておき、onRollOver = function の中で番号から対象のムービークリップの参照を作るとなると、this の指す対象の変化でこの通りターゲットパスが複雑になります。 先の作例では、ただの番号ではなく、自分に対応するムービークリップの参照を変数に記録しています。 あとは、この変数を間違いなく new Tween に渡すだけです。 [ ] 演算子で変換すると this や _parent がたくさん付いてターゲットパスがややこしくなりそうな場合は、最初から、操作したいムービークリップの参照を記録しておく方法がオススメです。

kolbejp
質問者

お礼

 ありがとうございました。質問の後、rootから指定すると作動したので、対応するクリップがわからないのだろうとは思っていましたが、なるほどこれはスマートです。色々応用できそうです。今後ともよろしくお願い申し上げます。

関連するQ&A

  • tweenクラスを使った明度の調整は可能ですか。

    ずっとチカチカと、ちょうど電灯が着いたり消えたりするような効果をMCにつけたいと思い、以下のスクリプトをフレームに書きました。 import mx.transitions.Tween; import mx.transitions.easing.*; var myTween:Tween = new Tween(ball, "_alpha", None.easeNone, 100, 0, 0.2, true); myTween.onMotionFinished = function() { this.yoyo(); }; これでも良いことは良いんですが・・ alphaではなく明度(brightness?)で調整できないものかと思っています。 しかし、対象のMCのプロパティにbrightness等入力しても反応しません。 これまでに、_x , _xscale , alphaくらいは試してこれたのですが、明度は調整できないのでしょうか。 FlashCS3 AS2.0仕様です。 参考サイトをいくつか見てみましたが、alphaについては例が書いてあるのですが、明度がないような気がします。 どなたかご教授いただけませんでしょうか。 よろしくお願いします。

  • 三次元配列の要素をMCで指定して呼び出す

    a0b0~a2b2の計九つのムービクリップをクリックすると、三次元配列の要素からデータを取り出して出力することを考えています。たとえばa1b2をクリックすると、配列の中から[1][2]の要素を取りだします。下の配列の場合は"ウ"を出力します。 // var obj_array:Array = [["1", "2", "3"], ["a", "b", "c",], ["ア", "イ", "ウ"]]; for (var i = 0; i<=2; i++) { this[i].n = i; for (var j = 0; j<=2; j++) { // 各ボタンの固有値 n を設定 this[j].m = j; // 各ボタンの onRelease 動作定義 this["a"+i+"b"+j].onRelease = function() { trace(obj_array2[this.n][this.m]); }; } } //  しかし、どれをクリックしても"undefined"で返ってきます。  どのような書き直せばよいかご教授ください。

    • ベストアンサー
    • Flash
  • for文でまとめる

    FLASH CS3 アクション 2.0 Tweenを用いてイーズアウトの5種類をballを使って表現しようとしています。 ステージにball1からball5を置き、ボタンbt1を押すと右方向に移動させます。 //Tweenクラスを使用できるようにインポート import mx.transitions.Tween; import mx.transitions.easing.*; bt1.onRelease = function() { //インスタンス「ball」の動きをTweenクラスを使って制御 var myTween1:Tween = new Tween(ball1, "_x", Regular.easeOut, 39, 400, 2, true); var myTween2:Tween = new Tween(ball2, "_x", Strong.easeOut, 39, 400, 2, true); var myTween3:Tween = new Tween(ball3, "_x", Elastic.easeOut, 39, 400, 2, true); var myTween4:Tween = new Tween(ball4, "_x", Back.easeOut, 39, 400, 2, true); var myTween5:Tween = new Tween(ball5, "_x", Bounce.easeOut, 39, 400, 2, true); }; http://okwave.jp/qa/q7042246.htmlの回答で教えていただきましたfor文を 参考にして書き直しをしてみましたがBounce.easeOutのみ動きますが本来のもの とは異なります。どのように変更すればいいのか教えてください。 //Tweenクラスを使用できるようにインポート import mx.transitions.Tween; import mx.transitions.easing.*; var easeList:Array = new Array(); //イージングの種類 easeList[1] = "Elastic.easeOut"; easeList[2] = "Strong.easeOut"; easeList[3] = "Elastic.easeOut"; easeList[4] = "Back.easeOut"; easeList[5] = "Bounce.easeOut"; bt1.onRelease = function() { for (var i:Number = 1; i<=5; i++) { _root["ball"+i]; for (var i:Number = 1; i<=5; i++) { easeList[i+1]; //インスタンス「ball」の動きをTweenクラスを使って制御 var myTween = new Tween(_root["ball"+i], "_x", easeList[i+1], 39, 400, 2, true); } } };

    • ベストアンサー
    • Flash
  • XMLで画像を読み込むと巨大化します・・・

    Flash8にて、外部XML画像とURLを読み込みしています。 初の試みでして、たどたどしくも双方ともに読み込むところまでは皆様のこれまで作られたデータを基に作成出来たのですが、画像を読み込んだときに巨大化されてしまって困っています。 ▼XML --------------------------------------------------- <?xml version="1.0" encoding="utf-8"?> <jpeg> <jpegURL>images/image1.jpg</jpegURL> <link>http://yahoo.co.jp/1</link> <jpegURL>images/image2.jpg</jpegURL> <link>http://yahoo.co.jp/2</link> <jpegURL>images/image3.jpg</jpegURL> <link>http://yahoo.co.jp/3</link> <jpegURL>images/image4.jpg</jpegURL> <link>http://yahoo.co.jp/4</link> </jpeg> --------------------------------------------------- 800×250で画像を読み込みたいのですが、 読み込むと、すさまじく巨大化してしまっています。。 作ろうとしているのは、横にスクロールするナビゲーションです。 XMLで画像とリンク先を指定、画像は同じ階層に「img」というフォルダを作って入れています。 下記が、1フレーム目に記載しているASです。 ▼AS --------------------------------------------------- var obj_array:Array = new Array(); var center:Number = Stage.width/2; var menu_num:Number = 4; var maxlength:Number = 800*menu_num; //サイズ指定箇所 var friction:Number = -0.03; var obj_xml:XML = new XML(); obj_xml.onLoad = start_me; obj_xml.ignoreWhite = true; obj_xml.load("scrollslide.xml"); function start_me(success:Boolean):Void { if (success == true) { for (var i = 1; i<=menu_num; i++) { var menu_str:String = "menu"+i; obj_array[i] = _root.attachMovie("menu", menu_str, i); obj_array[i].num = i; obj_array[i]._x = 800*(i-1); //X座標 obj_array[i]._y = 0; var jpg_str:String = obj_xml.firstChild.childNodes[(i-1)*2].firstChild; var link_str:String = obj_xml.firstChild.childNodes[i*2-1].firstChild; obj_array[i].jpg_mc.loadMovie(jpg_str); obj_array[i].onEnterFrame = scrollphoto_me; obj_array[i].onPress = press_me; obj_array[i].onRollOver = roll_me; obj_array[i].onRollOut = rollout_me; //関数呼び出し obj_array[i].onRelease = release_me; obj_array[i].link = link_str; } } else { seltext = "xml read error"; } } function release_me():Void { trace(this.link); getURL(this.link, "_parent"); } function scrollphoto_me():Void { var speed:Number = (_root._xmouse-center)*friction; var vx:Number = this._x+speed; if (vx<=-800) { //ステージ左に消えたら vx += maxlength; //サムネイルの最後列の後ろに移動 } else if (vx>=Stage.width+10) { //ステージ右に消えたら vx -= maxlength; //サムネイル最前列の前に移動 } this._x = vx; updateAfterEvent(); } function roll_me():Void { this._alpha = 80; } function rollout_me():Void { this._alpha = 100; } stop(); --------------------------------------------------- サイズを指定している箇所に問題があるのでしょうか。 初心者でして、全く見当がつかず困っております。 もしよろしければ、先人の方たちにご意見とご指摘を頂ければと思います。宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • マウスの基準点について

    www.i-tv.in/test/shop_menu.swf 上記のものスクリプトの参考書を見ながら作りました。マウスが摩擦をおく基準が上の方になっています。 これを中央にもっていきたいと思いましたが、このような単純なことは調べても出てきません。どなかた教えて頂ければ幸いです。宜しくお願いします。 function start_me(success:Boolean):Void { if (success == true) { for (var i = 1; i<=menu_num; i++) { var menu_str:String = "menu"+i; _root.attachMovie("menu",menu_str,i); obj_array[i] = eval(menu_str); obj_array[i].num = i; obj_array[i].mctext = i; obj_array[i]._y = 125*(i-1); obj_array[i]._x = 10; obj_array[i]._alpha = 40; var jpg_str:String = obj_xml.firstChild.childNodes[i-1].firstChild; obj_array[i].jpg_mc.loadMovie(jpg_str); obj_array[i].onEnterFrame = scrollphoto_me; obj_array[i].onPress = press_me; obj_array[i].onRollOver = roll_me; obj_array[i].onRollOut = rollout_me; } } else { seltext = "xml read error"; } }

    • ベストアンサー
    • Flash
  • 100種類の画像をランダムに読み込みたい(AS2)

    現在下記のようなスクリプトを書いている状態なのですが、 ここからさらに100種類の画像をランダムに読み込み、表示できるようにしたいと思っています。 あと、すでにスライドはするようになってはいるのですが、たまに読み込みが間に合わず空白ができてしまいます。解決するにはスピードを遅くするしかないものなのでしょうか? 一応他の情報も記しておきます。 ・img フォルダ内に連番で100枚の画像ファイルを保存している ・リンク先はLink.asという名前で、そこに100種類のURLを記述している ・PC環境:CS5 AS2.0 Flash Player8 Mac環境 Flashの勉強しはじめたばかりで苦戦しております。 どなたかご教授のほどをよろしくお願いいたします。 import mx.transitions.Tween; import mx.transitions.easing.*; var num:Number = 10; var bar_h:Number = 200; var bar_w:Number = 150; var bar_n:Number = 10; var margin:Number = 0; var lag:Number = 1000; var speed:Number =1; var transMode:Boolean = true; for (i=1; i<=num; i++) { mc = this.createEmptyMovieClip("p"+i, i); mc.createEmptyMovieClip("inner",i); mc.inner.loadMovie("img/p"+i+".jpg"); mc._x = margin + (bar_w+margin)*(i-2); mc._y = 0; mc._alpha = 100; mc.n = i; mc.onRollOver = rollover; mc.onRollOut = rollout; mc.onRelease = releas; } function rollover() { this._alpha = 100; transMode = false; } function rollout() { this._alpha = 100; transMode = true; } function releas() { transMode = true; url = _root["link"+this.n]; getURL(url); } function bar_trans() { if (transMode) { for (i=1; i<=num; i++) { bar_mc = _root["p"+i]; bar_mc.x0 = bar_mc._x; if (bar_mc.x0>margin + (margin+bar_w)*(num-3 )) { bar_mc._visible = false; bar_mc.targetx = - bar_w; } else { bar_mc._visible = true; bar_mc.targetx = margin + bar_w + bar_mc.x0; } myTween(bar_mc); } } } ID = setInterval(bar_trans, lag); function myTween(bar_mc) { new Tween(bar_mc, "_x", Regular.easeOut, bar_mc.x0, bar_mc.targetx, speed, true); } #include "Links.as"

    • ベストアンサー
    • Flash
  • JavaScriptのthisの挙動について

    JavaScriptで次のCodeのようなコードを書いて実行したところ、Outputのようになります。 原因は、thisが保持できていなかったからです。 ※先頭に#が付いているのが問題の箇所です。 Code: Array.prototype.rs = function() // rs = random sort { var ret = { list: new Array(), length: new Number() }; # var obj = { # list: this # }; var tmp = { index: new Number(), length: obj.list.length }; while((ret.length = ret.list.length) < tmp.length) { tmp.index = Math.floor(Math.random() * (tmp.length - ret.length)); ret.list[ret.length] = obj.list[tmp.index]; obj.list.splice(tmp.index, 1); } return ret.list; } var list = new Array(1,2,3,4,5,6,7,8,9); alert(list.rs()); alert(list.rs()); Output: アラートウィンドウで 2,4,6,9,3,5,1,8,7 (一例) アラートウィンドウで 出力無し 要するに、thisをobj.listに入れて、thisには触っていないのに、obj.listと同期してthisが消えているのです。 Code中で先頭に#を付けた部分を次のように変更すると期待通りに動作しましたが、腑に落ちません。 # var obj = { # num: this.join('') # }; # obj.list = obj.num.split(''); もっと簡潔な書き方や、迅速に動く書き方があればご教授頂きたいです。

  • ロールオーバーで下の画像を表示させる

    質問番号:7020788を参考にしています。 http://okwave.jp/qa/q7020788.html 一番下に写真(400x400)を置き、その上にmc0~mc3(200×200)を4つ配置しました。 mc0にロールオーバーすればmc0がフェードアウトして200×200だけが写真を見え るようにしたいと考えています。 同様にmc1にロールオーバーすればmc1がフェードアウトします。 しかし、どのmcにロールオーバーしてもmc0~mc3の全体がフェードアウトしてし まい、私が思っておるように動作いたしません。 次にアクションスクリプトを示します。 mport fl.transitions.*; import fl.transitions.easing.*; mc0.addEventListener(MouseEvent.ROLL_OVER,onrollOver); mc1.addEventListener(MouseEvent.ROLL_OVER,onrollOver); mc2.addEventListener(MouseEvent.ROLL_OVER,onrollOver); mc3.addEventListener(MouseEvent.ROLL_OVER,onrollOver); function onrollOver(eventObj:Event):void { for (var i:Number = 0; i<=3; i++) { TransitionManager.start(this, {type:Fade, direction:Transition.OUT, duration:2, easing:None.easeNone}); removeEventListener(MouseEvent.ROLL_OVER,onrollOver); } } FLASH CS3でアクションスクリプトは3.0で作っています。どうか対処策を教えて いただきたく思います。

    • ベストアンサー
    • Flash
  • AS3 mc0~5をまとめて処理する

    AS3初心者です。 forにてmc0~5をまとめて処理したいのですが、 下記スクリプトで、function内mc0の書き換え方が分かりません。 よろしくお願いします。 ///////////////////////////////////////// import fl.transitions.easing.Regular; import fl.transitions.TweenEvent; var twObj:Tween; for(var i:int=0;i<=5;i++){ this["mc"+i].addEventListener(MouseEvent.ROLL_OVER, hiraku); this["mc"+i].addEventListener(MouseEvent.ROLL_OUT, modoru); } function hiraku(eventObj:MouseEvent):void { //mc0を["mc"+i]としまとめて処理したい twObj=new Tween(mc0,"rotation",Regular.easeInOut,0,30,1,true); } function modoru(eventObj:MouseEvent):void { //mc0を["mc"+i]としまとめて処理したい twObj=new Tween(mc0,"rotation",Regular.easeInOut,30,0,1,true); } //////////////////////////////////////////

    • ベストアンサー
    • Flash
  • javascriptの2次元配列をソートの仕方

    function word_grouping(data) { var code = data; //先頭についている”code="を除去 code = code.replace("code=",""); var = code.split(","); var alpha =new Array(); alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M']; //2次元配列作成 var array = new Array(); for (i =0; i < alpha.length; i++) { array[i] = [' ','0']: } //グループ名を格納 for( i = 0; i <alpha.length; i++){ array[i][0] = alpha[i] //0番目の項目から順番にグループごとに分ける for( i = 0; i < sp.length; i++){ group = sp[i].substring(0.1); //どのグループに所属しているか調べる for( j = 0; j < alpha.length; j++){ //一致したグループの配列にカウント+1していく if(group == array[j][0]{ array[j][1]++; } } } メモ ・spにはグループのどこかに所属する20個のキーワードが入っていてそれをグループに振り分けている ・グループ分けには”A001”のAだけみて振り分けています したいこと ・arrayに入ったキーワードの数を降順で並び替えたい 分からない所 ・2次元配列をsortする仕方 こんな感じなんです わかる方回答お願いします。

専門家に質問してみよう