• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FLASHでの深度の設定)

FLASHでの深度の設定に関する質問

このQ&Aのポイント
  • FLASH MX 2004を使用して、リンクしたい物の深度を設定する際に問題が発生しています。
  • リンクしたい物を深度5に設定すると、その物が見えなくなってしまいます。
  • どなたかお詳しい方にアドバイスをいただきたいです。

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

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

まず、深度についてですが。 深度は -16384 から 1048575 の範囲の数値で、数値が大きいほど上に重なって表示されます。 描画しただけのシェイプ等も含めた全てのオブジェクトは、どのオブジェクトとも重複することのない深度が割り当てられます。 ステージに配置されたオブジェクトは、レイヤーの順序やレイヤー内での重なり順などから、-16383 から(最も下層の -16384 はムービー自身が占有します)順に深度が割り当てられます。 attachMovie や duplicateMovieClip のように動的にムービークリップを挿入するメソッドでは、新たに挿入するインスタンスの深度を指定することができます。 この時、既に他のオブジェクトが占有している深度を指定すると、古いオブジェクトは新しいオブジェクトに置き換えられて消えてしまいますので、他のオブジェクトが占有していない深度を指定する必要があります。 つまり、リンクのムービークリップ(仮に”link_clip”とします)を円のムービークリップよりも上に表示するには、link_clip の深度が円のムービークリップの深度よりも高い数値になっていればいいことになります。 ステージに予め配置してあるオブジェクトの場合は、先述の通り -16383 から順に深度が割り当てられます。 よって、link_clip を予めステージに配置している場合は、負の深度が割り当てられている可能性が高いです。 一方、ご質問文のスクリプトを拝見した限りでは、変数 depth の初期値が分からないので正確には分かりませんけれど、おそらく、円のムービークリップの深度は 0 ~ 19 (もしくは 1 ~ 20 )と思われますので、この状態では link_clip は必ず円のムービークリップの下になってしまいます。 一番手っ取り早い方法は、link_clip も attachMovie で動的に挿入し、深度の指定である第3引数を変数 depth の最大値以上に設定することです。 例えば、円のムービークリップが 20 まで占有しているのであれば、21 以上を指定すると link_clip の方が上に配置されます。 円のムービークリップを挿入したループの後に、depth + 1 という具合に変数 depth を利用して第3引数を指定すると、確実だと思います。 どうしても link_clip をステージに配置しておかなければならない事情でしたら、swapDepths を使って、他のムービークリップと深度を入れ替えるといった方法があります。 swapDepths では、深度または既存のムービークリップのインスタンス名かのどちらを指定できます。 深度を指定する場合は、どのオブジェクトも占有していない数値を指定すると、そのムービークリップの深度だけが変化することになります。 今回の場合は、link_clip の深度が円のムービークリップの深度以上であればいいので、例えば  _root.link_clip.swapDepths( depth + 1 ); といった方法でも可能です。 このスクリプトも、円のムービークリップを挿入するループの後で実行してください。 余談ですが。 MouseMove イベントを利用して描画する場合は、最後に  updateAfterEvent(); というスクリプトを入れておくと、フレームレートに関係なく、イベントが起こる度に表示が更新されるので、絵の動きがスムーズになります。 よろしければ effect 関数の最後に挿入してみてください。

takasi123
質問者

お礼

お礼遅れて申し訳ありませんでした!!とてもわかりやすく、参考にさせていただきました!そして無事稼働しております!どうもありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • actionscript1.0でJPGを読み込んでるところをSWFに、

    actionscript1.0でJPGを読み込んでるところをSWFに、、、 初心者のため良く分からないため質問いたします。 FLAを開くと設定はFlashのactionscript1.0 パブリッシュ設定がFlash Player8.0でした。 現在上記設定で下記scriptが書かれているものをFlashCS4で開いています。 そして現在3つのJPGを読み込んでいるのですが、そこをSWFに変更したいと考えています。 現在はAS1.0ですが、これを機会にAS3.0に変えたいとも考えています。 どう調べていいか分からないので質問させていただきました。 質問自体よく分からないかもしれませんが、非常に困っています。 よろしくお願いいたします。 onClipEvent (load) { Pass = "img_top_flash/"; Timer = _root.Sec*30; cnt = 0; this._y = 300; //元はthis._y = -20; this.loadVariables( Pass + "top_flash_url.txt"); function loadJPG() { _root.Loaded = false; cnt = 0; if (num == Max) { num = 0; } else if (num<0) { num = Max-1; } depth++; if (depth>1) { _root.mc["m"+(depth-2)].removeMovieClip(); } navi.slider._alpha = 100; mcName = "m"+depth; _root.mc.attachMovie("pic",mcName,depth); _root.mc[mcName].fileName = Pass+picArray[num]+".jpg"; for (i = 0; i < Max; i++) { if (i == num) { navi.mc["b"+i].gotoAndStop(2); } else { navi.mc["b"+i].gotoAndStop(1); } } } } onClipEvent (data) { picArray = files.split(","); Max = picArray.length; for (i = 0; i < Max; i++) { mcName = "b"+i; navi.mc.attachMovie("navi_btn",mcName,i); navi.mc[mcName].num = i; navi.mc[mcName]._x = i*20; } navi.mc.attachMovie("sankaku","sankaku",Max); navi.mc.sankaku._x = Max*20; num = depth = 0; loadJPG(); } onClipEvent (enterFrame) { if (Max>1 && _root.Loaded) { //this._y -= this._y/4; this._y -= this._y/100; if ( this._y <= 280 ) { this._y = 280; } navi.slider._x += (num*20-navi.slider._x)/_root.spd; navi.slider._alpha += (50-navi.slider._alpha)/_root.spd; cnt++; if (cnt>Timer) { num++; loadJPG(); } } }

    • ベストアンサー
    • Flash
  • flashのscriptを特定のフレームに!

    flashのactionscript2.0で記述したスクリプト を特定のフレームにだけ適用したいのですが どのようにすればよいのでしょうか。 いま、シーン1のフレーム1に ライブラリからMC(ブロック)を呼び出して並べるスクリプト記述したのですが、シーン1で mcとmcが衝突したら、ほかのフレームに移動するようにしたのですが 移動先の画面にもライブラリから呼び出したMC(ブロック)が並んで表示されます。 ちなみに、シーン2をつくって移動させても同じことが起こります。 ネットのサンプルコードを利用していますが スクリプトは以下の通りです。 よろしくお願いいたします。 ofs_x = 100; ofs_y = 50; // 当たり用テーブル(1ならブロック,0なら何もなし) HitTable = [ [ 1,1,1,1,1,1,1,1,1,1 ], [ 1,0,0,0,0,0,0,0,0,1 ], [ 1,0,1,0,1,1,1,1,0,1 ], [ 1,0,1,0,0,1,0,0,0,1 ], [ 1,0,1,0,1,1,0,1,1,1 ], [ 1,0,1,0,1,0,0,0,0,1 ], [ 1,0,1,0,1,0,1,0,1,1 ], [ 1,0,1,0,1,0,1,1,1,1 ], [ 0,0,0,0,1,0,0,0,0,1 ], [ 1,1,1,1,1,1,1,1,0,1 ] ]; // ブロックを配置 var i = 0; var j = 0; var depth = 0; for(i=0;i<10;i++){ for(j=0;j<10;j++){ if(HitTable[j][i] == 1){ _root.attachMovie("block", "block" + depth,depth); _root["block" + depth]._x = i * 20 + ofs_x; _root["block" + depth]._y = j * 20 + ofs_y; depth ++; } } }

  • FLASHでの画像無限スクロール基準点

    みなさん、ハジメマシテ。 現在マウスの位置によって画像が無限にスクロールするものを作っているのですが、ウィンドウサイズを変更しても基準点をセンターに持っていきたいのですが、サイズを変えた時の基準点が、最初に表示した時の基準点から変わりません。。 ソースは下記の通りです。 //初期化 function init() { w = content._width; x0 = Stage.width/2; cnt = Math.ceil(Stage.width/w)+4; scrollWidth = w*cnt; //ステージ幅に合わせてムービークリップを複製する for (i=1; i<=cnt; i++) { x = w*(i-2); y = content._y; props = {_x:x, _y:y}; //contentを複製する newMC = content.duplicateMovieClip("scrollMC"+i, i, props); //新しいムービークリップにイベントメソッドを設定する newMC.onEnterFrame = scrollxMC; } //複製元のムービークリップを隠す content._visible = false; } //ステージを横スクロールするメソッド function scrollxMC() { with (this) { if (_x<(-w)) { _x += scrollWidth; } else if (_x>(Stage.width+w)) { _x -= scrollWidth; } _x -= (_root._xmouse-x0)/10; } } //初期化の実行 init(); x0がここで言う基準点だと思うのですが、これをウィンドウサイズが変わってもセンターにくるようにするにはどうすればよろしいでしょうか?? お手数ですが、お力添えよろしくお願い致します。

  • FLASHのAS2で作成をしました。外部jpg画像読み込みの部分が現状

    FLASHのAS2で作成をしました。外部jpg画像読み込みの部分が現状は写真8枚です。 状況により4枚になったりするのですが、どこをどのようにしたらいいのか分からないので、助けてください。 MAX=8を外部txtにできるのでしょうか?また、MAX=8をいろいろな数に対応出来るプログラムがありますか? よろしくです。 onClipEvent (load) { Max = 8; Sec = 3; Path = "photo/"; n = depth=cnt=0; function loadPic() { n++; if (n>Max) { n = 1; } depth++; mcName = "mc"+depth; this.attachMovie("pic", mcName, depth); this[mcName].loadMC.Loaded = false; this[mcName].loadMC.loadMovie(Path+"p"+n+".jpg"); if (depth>2) { this["mc"+(depth-2)].removeMovieClip(); } } loadPic(); } onClipEvent (enterFrame) { cnt++; if (cnt>Sec*4) { cnt = 0; loadPic(); } }

  • スクロールボタンの範囲指定

    本を参考にスクロールするボタンのMCを作りました。 下記のスクリプトがメインフレームに記述してあるスクリプトです。 //初期化 function init() { w=content._width; cnt=math.ceil(stage.width/w)+4; x0=Stage.width/2; scrollWidth=w*cnt; //ステージ幅に合わせてムービークリップを複製する for(i=1; i<=cnt; i++) { x=w*(i-2); y=content._y; props={_x:x,_y:y}; //contentを複製する newMC=content.duplicateMovieClip("scrollMC"+i, i, props); //新しいムービークリップにイベントメソッドを設定する newMC.onEnterFrame=scrollxMC; } //複製元のムービークリップを隠す content._visible=false; } //ステージを横スクロールするメソッド function scrollxMC() { with (this) { if(_x<(-w)) { _x += scrollWidth; } else if (_x>(Stage.width+w)) { _x -= scrollWidth; } _x -= (_root._xmouse-x0)/60; } } //初期化の実行 init(); これでカーソルがステージ中央より左に行けば行くほど右に速くスクロールし、右もしかりなのですが、 カーソルがMC上にある時にしかこのスクリプトを実行しないようにするにはどうすればよろしいでしょうか。

    • ベストアンサー
    • Flash
  • マウスを避けるムービークリップ

    マウスが近づくと逃げるMCを制作しようとしているのですが、 思うようにいかず悩んでいます。 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z という風に並んだそれぞれのアルファベットのMCに マウスが近づくとある一定の範囲の距離を取り、離れると元の場所に戻る… というふうな動きにしたいのです。 今は、 a_mc.onEnterFrame = function () { X=70;//_rootのAのx座標 Y=211;//_rootのAのy座標 var dx = _root._xmouse-this._x; var dy = _root._ymouse-this._y; var kyori = Math.sqrt(dx * dx+dy * dy); var kakudo = Math.atan2(this._y-_root._ymouse,this._x-_root._xmouse); if(kyori<100){ this._x += kyori * Math.cos(kakudo) * 0.05; this._y += kyori * Math.sin(kakudo) * 0.05; this._x = (this._x * 5+X)/6; this._y = (this._y * 5+Y)/6; } }; と記述してマウスと反対方向の動きをさせていますが、 マウスから離れるという動きではないのです…。 分かりづらい説明ですみませんが、ヒントかなにかあれば教えてください。 制作環境は、CS4で、AS2です。

    • ベストアンサー
    • Flash
  • [Flash]actionscript2.0を用いて歯車を作りたいのですが

    Adobe FLASH CS2を使い2つのかみ合った歯車を制作しています。 ドラッグで片方の歯車を回転させると もう片方の方は逆回転になるはずですが、 うまいことactionscriptをかくことができません。 片方はこのようなactionscriptを使っているのですが うまい作り方はないでしょうか。 よろしくおねがいします。 on (press) { //このMCの基準点からのマウス座標を取得 rx0 = _root._xmouse-this._x; ry0 = _root._ymouse-this._y; //このMCの基準点とマウスとの距離を算出 td0 = Math.sqrt(rx0*rx0+ry0*ry0); //マウスによる回転の差分を算出 tr0 = (Math.PI/2+Math.atan2(ry0, rx0))*180/Math.PI-this._rotation; //onEnterFrame を定義 this.onEnterFrame = function() { //現在のMCの基準点からのマウス座標を取得 rx1 = _root._xmouse-this._x; ry1 = _root._ymouse-this._y; //このMCの回転を計算 this._rotation = (Math.PI/2+Math.atan2(ry1, rx1))*180/Math.PI-tr0; //このMCの移動を計算 }; } on (release, releaseOutside) { //この onEnterFrame を削除 delete this.onEnterFrame; }

  • flashのムービークリップにリンクを複数張る方法

    flash初心者です。質問します。 ムービークリップのMATRIXと円運動関数を使用して、3Dに回転するナビゲーションを作成したいのですが、ムービークリップ毎に個別にリンクを貼る方法が分からず、行き詰っています。 スクリプトは後記に記述しますが、this.onRelease=function() と getURL(url, "_blank");で 指定URLに飛んでくれるのですが、全てのムービークリップに1つのURLが適用されてしまい ナビゲーションとしての意味がなくなってしまいます。 var url = ("http://www.yahoo.co.jp/");の部分にURLを付け足してみたり色々試したのですが、 うまくいきません。 緊急なので、早めにお返事いただけるとありがたいです。何卒、よろしくお願いします。 ▼ 以下が問題のスクリプトです ▼ import flash.geom.Matrix; import flash.filters.BlurFilter; var composer:Array=new Array("a","b","c", "d","e","f","g","h", "i","j"); var url = ("http://www.yahoo.co.jp/"); var num = 10; var speed:Number; var diff:Number = 0; var rd:Number; var a:Number; var depth:Number; var v:Number; this.createEmptyMovieClip("composerNameBox",100); composerNameBox.createTextField("tf",120,0,0,220,25); composerNameBox._x = -10; composerNameBox._y = 145; for (i=1; i<=num; i++) { var mc = this.attachMovie("sp"+i, "sp"+i, i); mc.n = i; mc.onEnterFrame = circulating; } function circulating() { speed = (Stage.width/2-_xmouse)*0.005*0.001*Math.PI; diff += speed; rd = diff+this.n/num*2*Math.PI; a = Math.sin(rd) b = 0.3*Math.cos(rd); c = 0; d = 1; mcx = 100-200*Math.cos(rd); mcy = 40+40*Math.sin(rd); var myMatrix:Matrix = new Matrix(a, b, c, d, mcx, mcy); this.transform.matrix = myMatrix; depth = Math.floor((3+Math.sin(rd))*2500); this.swapDepths(depth); if (this.rollover) { v = 5; } else { v = Math.floor((1-Math.sin(rd))*5.5); } blurChange(this); this.onRollOver=function() { this.rollover = true; composerNameBox.tf.text = composer[this.n-1]; txtFormat(composerNameBox); } this.onRollOut=function() { this.rollover = false; composerNameBox.tf.text = ""; } this.onRelease=function() { getURL(url, "_blank"); } } function blurChange(this_mc) { var myBlur:BlurFilter = new BlurFilter(v, v, -5); this_mc.filters = [myBlur]; } function txtFormat(mc) { var format = new TextFormat(); with (format) { size = 12; color = 0x000000; align = "center"; bold = true; } mc.tf.setTextFormat(format); }

    • ベストアンサー
    • Flash
  • 1フレームにActionを設定したときの止め方

    ただ今flash勉強中の初心者です。検索したり本を調べたりしても根本が理解できていないためか、解答策が見つからず困っています。 自分で作ったものではないのですが、1フレーム目にActionを書いています。動きとしては、テレビの砂嵐のような画面に、二種類の文字がランダムに出て、ラインもランダムに出てくるという感じです。以下のscriptだと永遠と続くのですが、5秒ぐらいランダムに文字とラインが出て、その後砂嵐の画面だけにして止めたいのですが、どうしたら良いかわかりません。 使用しているソフトはFlash8、MacOSX10.4です。 import flash.display.BitmapData; var tv_noise:BitmapData = new BitmapData(Stage.width,Sage.height,true); _root.attachBitmap(tv_noise,20); _root.attachMovie("text1","text_1",3); _root["text_1"].scale = 350; _root["text_1"].onEnterFrame = random_me; _root.attachMovie("text2","text_2",2); _root["text_2"].scale = 350; _root["text_2"].onEnterFrame = random_me; _root.attachMovie("line","line_1",1); _root["line_1"]._y = Stage.height/2; _root["line_1"]._alpha = 40; _root["line_1"].onEnterFrame = scale_me; function random_me():Void{ this._x = 10+Math.round(Math.random()*Stage.width); this._y = 10+Math.round(Math.random()*Stage.height); this._xscale = this._yscale = Math.round(Math.ramdom() *this.scale); this._alpha = 10+Math.round(Math.random()*100); } function scrach_me():Void{ this._x = 10+Math.round(Math.random()*Stage.width); tv_noise.noise(Math.round(Math.random()*100000),80,170,8,true); } 宜しくお願いします。

    • ベストアンサー
    • Flash
  • C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまく

    C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまくいきません。ReverseOthello関数の石を探して裏返す処理がおかしいと思われます。一番裏返せる石が多い位置を裏返すという処理をしています。プログラミング経験が豊富な方よろしくお願いします。 #include "stdafx.h" bool Othello(int (*pBoard)[8] ){ int i; int j; int ans; int k = 0; int num[3] = {0,0,0}; int sum[28][3]; i = 0; while(i < 28){ j = 0; while(j < 3){ sum[i][j] = 0; j++; } i++; } i = 0; while(i < 8){ j= 0; while(j < 8){ if(pBoard[i][j] == 0){ ans = SeachStone(i,j,pBoard); if(ans != 0){ sum[k][0] = i; sum[k][1] = j; sum[k][2] = ans; k++; } } j++; } i++; } i = 0; while(i < 28){ if(num[2] < sum[i][2]){ num[0] = sum[i][0]; num[1] = sum[i][1]; num[2] = sum[i][2]; } i++; } if(num[2] == 0){ return false; } ReverseStone(num[0],num[1],pBoard); return true; } void ReverseStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int y2; int x2; int i; int j; int k; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ k = 0; while(k < cnt + 1){ y2 = y2 + (y1 - i); x2 = x2 + (x1 - j); pBoard[y2][x2] = 1; printf("%d\n",pBoard[y2][x2]); k++; } } j++; } i++; } } int SeachStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int sumCnt = 0; int y2; int x2; int i; int j; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ sumCnt = sumCnt + cnt; } j++; } i++; } return sumCnt; }