- ベストアンサー
FlashのattachMovieに関する質問
- FlashのattachMovieを使用してマップ用MCを配置する際に白画面で表示される現象が起きる
- マップ用MCは30x30の二次元配列で構成され、チップの再生フレームを変えて地形を表現している
- attachMovieの識別子と深度を重複しないように設定しているが、原因を特定できずアドバイスを求める
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>マップMCはmの初期値0から1ずつ減算した深度にし、 >当たり判定MCはnの初期値0から1ずつ加算した深度にしてある為、 >マップMCが前に出ると言うのは無いはずです・・・。 深度はMCごとにもっているので _root.map.attachMovieで指定する深度と _root.wall.attachMovieで指定する深度は関係ありません 問題は親MCである_root.mapと_root.wallの深度です。 ですので、#1の補足に書かれた >//この前の行で空MCを製作しました。 の部分で例えば、 _root.createEmptyMovieClip("map", 2); _root.createEmptyMovieClip("wall", 1); のように書いていると、_root.mapが手前に来て_root.wallが後ろに隠れてしまいます。 私が思いつく原因はこのくらいです。一応検証用に使ったASを載せておきます 「chip」と「alpha」のリンケージ識別子が設定してあれば、 メインタイムラインにコピペすれば動きます。 //----------------------------------- //↓「map」MCと名前がかぶってしまうのでちょっと変えました var mapA = new Array(); // var d = 0; for (var x = 0; x<30; x++) { mapA[x] = new Array(); for (var y = 0; y<30; y++) { d++; mapA[x][y] = d; } } _root.createEmptyMovieClip("map", 1); _root.createEmptyMovieClip("wall", 2); // n = 0; m = 0; for (a=0; a<mapA.length; a++) { for (b=0; b<mapA[0].length; b++) { n++; //マップ用MCにチップを配置してゆく create = _root.map.attachMovie("chip", "chip"+a+"_"+b, n); create.gotoAndStop(mapA[a][b]); create._x = create._width*b; create._y = create._height*a; //もし、マスの数値が50以上なら、当たり判定MCにチップを //(50フレーム以上には通行不能のチップを置いています) if (mapA[a][b]>50) { m++; create2 = _root.wall.attachMovie("alpha", "alpha"+a+"_"+b, m); create2._x = create._width*b; create2._y = create._height*a; } } } //----------------------------------- あと、これは今回の件に関係ありませんが深度をマイナスにすると removeMovieClipできなくなります。
その他の回答 (2)
- perse
- ベストアンサー率74% (113/152)
>create2 = _root.wall.attachMovie("alpha","alpha"+a+"_"+b,m); >create2._x = create._width * b; >create._y = create._height * a; の一番下は create2._y = create._height * a; ではないでしょうか?(createではなくcreate2) これが間違っているのに >traceで確認したところ、名前もきちんと表示され、座標も正しい数値を示してきました。 ということは、違うMCをtraceしていた。なんてことないですか? または 「alpha」MCの_alpha値が0になっているとか、 「wall」MCが「map」MCとかの背面にあってみえてないとか。
お礼
回答ありがとうございます。 質問をする前に一通り、状態を確認してみましたが、traceのミス、代入先のミスなどは見られませんでした。 うむう・・・何故でしょうか・・・。
補足
これは、プログラムを直接コピーした訳ではなく、打ち直したものなので、こちらだけの打ち間違えです。 その為、traceはきちんと作動しているようです。 当たり判定MCはalpha値によるものではなく、半透明に塗りつぶしたものを使っています。本番ではこれを透明にして使おうと思います。 マップMCはmの初期値0から1ずつ減算した深度にし、当たり判定MCはnの初期値0から1ずつ加算した深度にしてある為、マップMCが前に出ると言うのは無いはずです・・・。(最初に加算、減算しているため、深度0が重複していると言う事もありません)
- perse
- ベストアンサー率74% (113/152)
attachMovieしたMCをtraceで確認してみてはどうでしょうか。 AS2だとこんな感じです //attachMovie開始位置 var xStart = 0; var yStart = 0; //chipの高さと幅 var h = 10; var w = 10; //横方向と縦方向の配置数 var xCount = 30; var yCount = 30; //深度 var dsp = 0; for (var y = 0; y<yCount; y++) { for (var x = 0; x<xCount; x++) { dsp++; //attachMovie var mc = _root.attachMovie("chip", "chip"+dsp, dsp); //位置 mc._x = xStart+x*w; mc._y = yStart+y*h; trace(mc) } }
お礼
丁寧な回答ありがとうございます。 参考になりました。
補足
早速、traceでチェックしてみました。 質問を単純にしようと思い省いていたのですが、実は、チップ用MCと同時に、当たり判定用MC「wall」も複製しているのです。 当たり判定MCは、分かりやすいように半透明の赤色をつけてあります。 タイムライン上には //この前の行で空MCを製作しました。 n=0; m=0; for(a=0;a<map.length;a++){ for(b=0;b<map[0].length;b++){ n--; //マップ用MCにチップを配置してゆく create = _root.map.attachMovie("chip","chip"+a+"_"+b,n); create.gotoAndStop(map[a][b]); create._x = create._width * b; create._y = create._height * a; //もし、マスの数値が50以上なら、当たり判定MCにチップを //(50フレーム以上には通行不能のチップを置いています) if(map[a][b] > 50){ m++; create2 = _root.wall.attachMovie("alpha","alpha"+a+"_"+b,m); create2._x = create._width * b; create._y = create._height * a; } } } これを実行したところ、マップ用MCは正しく表示されたものの、当たり判定用MCが表示されませんでした。 traceで確認したところ、名前もきちんと表示され、座標も正しい数値を示してきました。 原因は、attachMovie自体の仕様か、深度の指定の間違いかな、と思っているのですが、打開策が分からずに居ます・・・。
お礼
丁寧な回答ありがとうございます。 原因はperseさんのおっしゃるとおり、当たり判定MC自体の深度指定を誤り、マップMCの背後に隠れていた為でした。(数値が小さいほど前、と思い込んでいたのかも・・・。) また、門のような「最初は通行不能、ある事をすると通行可能」のようなものを作る為には、当たり判定MCの一部を消すため、removeMovieClipは必要かもしれません。 深度設定についても考え直してみます。 本当にありがとうございました。