- ベストアンサー
自由線とレイヤー画面との位置関係
- Flash 8で地図を作成している際に、自由線とレイヤー画面の位置関係に問題が発生しています。
- レイヤー(1)に地図画面を作成し、レイヤー(2)に自由線を描くスクリプトを配置していますが、絵を跨ぐ場面で実線が途切れて表示されます。
- スクリプトの書き方を教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> (2)にスクリプトを加えて、絵の有無に関わらず、 > 「実線」が最前部に表示されるように設定する > ものと思いますが、スクリプトが分かりません。 おそらくそう思われていること自体が間違っていると思いますよ(思うだけなのですが)。 スクリプトは,書くレイヤーに依存しません。 例えば this.stop(); を, フレーム1 の レイヤー1 に書いても,レイヤー10 に書いても,結果は同じです。 書いたレイヤーの再生が止まるわけではなく, その階層のタイムライン全体が止まります。 それと同じです。 また,レイヤー は オブジェクト にもなりえません。 したがって,今のところ レイヤークラス のスクリプトなども存在しないので, ActionScript を扱う上では, そもそもレイヤーをターゲットオブジェクトとして考えること自体が間違っていることになります。 上の this.stop(); でもターゲットとなっているオブジェクトはムービークリップです。 _root も,ある一種のムービークリップです。 > スクリプト(onClipEvent...を利用)を配して、 > 地図上に道順の実線を描きます。 どういうスクリプトなのか予想できませんが, 一番上のレイヤーのステージの左上のコーナー(座標 0,0 )に, 空のムービークリップを作成して, そのムービークリップ内にスクリプトで道順を描くようにすれば良いと思います。 もしくは, 空のムービークリップではなく, 基準点をステージの左上のコーナーに置いた透明な塗り入りのムービークリップを作成して, そのムービークリップ内にスクリプトで道順を描くようにすれば良いと思います。 また次の 「勝手な例」 のように, 空のムービークリップ はスクリプトで作成しても良いと思います。 ///////////////////////////////////////////////////////// --- 勝手な例 --- Flashで,新規ドキュメントを作成し(ステージサイズはデフォルトの 550×400 くらい), _root の フレーム1 の空白キーフレームに次のスクリプトをコピペし, ムービープレビュー や パブリッシュ などをすると, 私が考えた勝手な線などが自動的に描かれます。 --------------------------------------------- // インスタンス名 road_mc という空のMCを 深度0 に作成 this.createEmptyMovieClip("road_mc", 0); // 各変数の初期値を設定 myX = 40; myY = 20; cnt = 0; // road_mc に描く線のスタイルを設定 road_mc.lineStyle(3, 0xFF00FF, 100); // // road_mc 内の深度0 に「駅」を書く(※単なる遊び) road_mc.createTextField("eki", 0, myX-20, myY-10, 30, 30); road_mc.eki.text = "駅"; // // 1フレーム進む時間ごとに毎回実行 this.onEnterFrame = function() { // 変数 cnt の値を 1 加算 cnt++; if (cnt<=10) { road_mc.moveTo(myX, myY); myX += 10; road_mc.lineTo(myX, myY); } else if (cnt<=30) { road_mc.moveTo(myX, myY); myY += 10; road_mc.lineTo(myX, myY); } else if (cnt<=40) { road_mc.moveTo(myX, myY); myX += 10; road_mc.lineTo(myX, myY); } else if (cnt<=45) { road_mc.moveTo(myX, myY); myY -= 10; road_mc.lineTo(myX, myY); } else if (cnt<=55) { road_mc.moveTo(myX, myY); myX += 10; road_mc.lineTo(myX, myY); } else if (cnt<=60) { road_mc.moveTo(myX, myY); myX += 10; myY += 10; road_mc.lineTo(myX, myY); } else if (cnt<=65) { road_mc.moveTo(myX, myY); myX += 10; road_mc.lineTo(myX, myY); } else if (cnt<=75) { road_mc.moveTo(myX, myY); myY += 10; road_mc.lineTo(myX, myY); } else { // road_mc 内の深度1 に「家」を書く(※単なる遊び) road_mc.createTextField("ie", 1, myX-7, myY, 30, 30); road_mc.ie.text = "家"; // この onEnterFrame を削除 delete this.onEnterFrame; } }; --------------------------------------------- 上のスクリプトでは, 空のムービークリップ road_mc を createEmptyMovieClip で 深度0 に作成しているので, _root に手動でレイヤーをいくつ追加しても, また,どのレイヤーに何を描いても, 上のスクリプトによって描かれる線などは一番上に描かれます。 つまり, 手動では上記スクリプトで描かれる線などの上に何かを描くことは不可能だということです。 インスタンスなど表示されているものは, その深度の数値が高いほど上に表示されます。 手動で作成したり配置したインスタンスやシェイプやビットマップ画像は, 普通,負の数の深度に自動的に配置されます。 つまり手動では,ものを 深度0 以上には配置できません。 したがって road_mc は, 手動で作成するものでは不可能な 深度0 に作成されるため, その中に線などが描かれるため一番上に表示されます。 上のスクリプトで描かれた線などよりさらに上に何かを表示させたい場合は, 深度1 以上に別のムービークリップをスクリプトで作成し, そのムービークリップにスクリプトで何かを描けば表示できます。 または, 深度1 以上に, swapDepths() や attachMovie() などのスクリプトで ムービークリップの深度を変更したり複製したりすれば, 手動で描かれたものも上記スクリプトの線などより上に配置できます。 ちなみに, 空のムービークリップを作成する createEmptyMovieClip() も, this.stop() などと同じ MovieClipクラスの(MovieClipを対象オブジェクトとする)メソッドです。 「createEmptyMovieClip (MovieClip.createEmptyMovieClip メソッド)」 http://livedocs.adobe.com/flash/8_jp/main/00002447.html また, moveTo() や lineTo() も,MovieClipクラスのメソッドです。 「moveTo (MovieClip.moveTo メソッド)」 http://livedocs.adobe.com/flash/8_jp/main/00002484.html 一方, レイヤーに近い存在の深度とはオブジェクトではなく, ムービークリップやボタンやテキストフィールドなどが存在する前面や背面などの z軸的空間 の順序です。 「深度とは?」 http://www.1art.jp/flash2/chapter/34/34.htm
お礼
ありがとうございます。 大変ご親切なご連絡で恐縮です。結局「手動」のラインでも作成可能なんですよね !! 大変難しそうなんで、頭が爆発しそうですが色々トライしてみます。少し時間を下さい。また分からない時に、この画面で照会いたしますので、