- ベストアンサー
外部SWF読み込み後の座標指定
こんにちわ いろいろなサイトを見たものの 適切な答えがなかったので質問します ステージ上のボタンをクリックしたら 外部SWFが読み込まれる仕組みのものなのですが クリックしたのち そのボタンの中心に 外部SWFの中心が重なり合うような 座標指定はどのようなスクリプトなのでしょうか? 現在は on (release) { this.loadMovie("1.swf"); } となっております。 アドバイスお願いいたします。 FLASH8 WINDOWS XP使用です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
書かれているようなことをすることは, スクリプト的には非常にシンプルで簡単です。 しかし, 理論上は Flash の性質などを理解しないと,結構難しいことだと思います。 ですから,なぜそういうスクリプトになるのかを順に説明します。 そうでないと,イミフメイで,他での応用や作り替えがきかないと思うからです。 > 現在は > on (release) { > this.loadMovie("1.swf"); > } と書かれていますが, これを書いたのは,_root(メインのムービー) に置いた, ボタンシンボルのインスタンス(つまりボタン)であると勝手に解釈して説明します。 ========================================= まず,書かれているスクリプトの説明です。 書かれている, this.loadMovie("1.swf"); の,this の指す物は,ムービークリップです。 ボタン(ボタンシンボルのインスタンス)に this.loadMovie("1.swf"); を書いた場合は,そのボタンが存在するムービークリップに 1.swf が読み込まれます。 _root(メインムービー) に置いたボタンに書いた場合は, _root 自体がムービークリップと同じ意味になり, そのムービークリップの一種である _root に 1.swf が読み込まれます。 ムービークリップに新たなムービーをロードすると, そのムービーにによってムービークリップのタイムラインがすべて乗っ取られます。 したがって,書かれているように, _root に置いたボタンに this.loadMovie("1.swf"); を書いた場合は,_root の全てが 1.swf が乗っ取られるため, もとのムービーは消えて, 1.swf だけが表示されるようになります。 まずこのもとのムービーが消えるという現象をどうにかしなければなりません。 これをどうにかするには, this(_rootのこと) に読み込むのではなく, 1.swf を読み込むための,ボタンとは別のムービークリップが必要になります。 そして,ロード後に,そのボタンとは別のムービークリップを移動してやれば, 好きな場所に 1.swf などがロードできます。 ========================================= というわけで, 1.swf を読み込むムービークリップを作ってください。 ムービークリップを作る方法ですが, まず,ボタンより下のレイヤーを追加して, そのレイヤーのステージ上に,1~5mmくらいの小さな正方形の塗りを用意し, その塗りを選択して, 「修正」→「シンボルに変換」で「ムービークリップシンボル」に変換します。 このとき,基準点に注意してください。 「ムービークリップシンボル」に変換するときに, 「シンボルに変換」ダイアログが出てくると思いますが, ////////////////////////////////////////// 名前(N):[ 任意の名前 ] タイプ(T): ◎ ムービークリップ 基準点(R):□□□ ○ ボタン □■□ ○ グラフィック □□□ ////////////////////////////////////////// このように,基準点が,中心にチェックに入っている状態で「OK」してください。 この説明では,中心にチェックがにっている状態として説明を続けます。 ムービークリップにムービーやJPEGなどを読み込む場合, そのムービークリップの基準点に,読み込まれる物の左上の座標が来るように読み込まれます。 上のように,必ずしも中央に基準点を持ってくる必要はありません。 基準点の位置によって,スクリプトが変わるので, この場合,基準点が中央になっいるということを自覚してムービークリップに変換してくださいということです。 基準点などの意味がさっぱりわからない場合は, 次のURLを参考にしてください。 「インスタンスの基準点」 http://homepage3.nifty.com/ginga-b/MX/inst_refpoint.html ムービークリップに変換できましたら, そのムービークリップにインスタンス名を付けます。 この説明では, myMC というインスタンス名を付けたことにしておきます。 ========================================= そして, _root に置いた,ボタンにも,インスタンス名を付けてください。 この説明では, myButton というインスタンス名を付けことにしておきます。 そしてそのボタンに, ----------------------------------- on (release) { _root.myMC.loadMovie("1.swf"); // ↓ボタンを消したい場合のみに書く _root.myButton._visible = false; } ----------------------------------- と書けば(コピペすれば),「myMC」に「1.swf」が読み込まれます。 これで,半分完成です。 まだ,ボタンの中央に「1.swf」の中央を移動させるという,ご質問の本題が残っています。 ========================================= あとは, 「myMC」の座標を指定してやれば, そこに表示されている物が移動するのですが, ここに大きな障壁があります。 もし,ロードするものが,「1.jpg」など,JPEG であれば, 四角くて形や大きさが変わらないので,簡単です。 しかし,相手が SWF です。 SWF は基本的にステージのサイズと,その中にある物のサイズが必ずしも等しくありません。 例えば「1.swf」のステージ外に何か物が置いてあれば, その物全てが SWF(ムービークリップmyMC) の大きさということになります。 逆に,「1.swf」ステージの大きさは 500×400px であったとしても, その 500×400px の中に 50×60px の物が1つしか置いていなければ, SWF (ムービークリップmyMC) の大きさは 50×60px ということになってしまいます。 つまり,中央の座標が非常に求めにくいのです。 というわけで,「1.swf」の改良です。 「1.swf」を作ったドキュメント(FLA)を開いて, 新規レイヤーを追加し, そのレイヤーにまたしても,小さな塗りのムービークリップを作成してください。 必ず最初のフレーム1には存在させるようにしてください。 このムービークリップも基準点は中心にしたとしておきます。 そしてムービークリップにインスタンス名をつけてください。 この説明では, datum (基準の意味)というインスタンス名を付けことにしておきます。 この「datum」を選択して,右側の整列パネルで, (表示されていなければ,「ウィンドウ」→「整列」で表示させてください。) 「ステージを基準」をクリックした状態にしておいて, 「中央揃え(水平方向)」ボタン(串みたいなボタン),「中央揃え(垂直方向)」ボタン(串が横向きになったようなボタン)をクリックして,ステージ中央に配置します。 そして,「1.swf」をパブリッシュします。 ========================================= 再び,元の読み込む側の FLA ファイルに戻ります。 最初に作った,「myMC」を選択して, その「myMC」に次のようなスクリプトを書けば(コピペすれば)ほぼ完成です。 --------------------------------------- onClipEvent (load) { this._x = _root.myButton._x-this.datum._x; this._y = _root.myButton._y-this.datum._y; } --------------------------------------- 意味は, このムービークリップがロードされたとき, このムービークリップを,「myButton」の座標から,「datum」の座標分,左上に移動。 ということです。 ==※==※==※==※==※==※==※==※==※==※==※== という感じで, Flash というものの性質を知っていれば, すごく簡単なことで,スクリプト自体もものすごく簡単でシンプルです。 ボタンとムービークリップのスクリプトを合計しても,ほんの8行くらい?で,簡単な算数が入っているだけです。 しかし, Flash というものの性質を理解されていない場合は, スクリプト自体は簡単でも,イミフメイで難解なスクリプトだと思われると思うので, 長々と説明させていただきました。 上のつたない説明の意味が本当にわかると, 「1.swf」のステージのサイズさえ最初にわかっていれば, 「datum」 なんて用意せずに, --------------------------------------- onClipEvent (load) { this._x = _root.myButton._x-ムービーの幅/2; this._y = _root.myButton._y-ムービーの高さ/2; } --------------------------------------- という定数で行けることがわかると思います。 例えば, 「1.swf」のステージサイズが 横×高さ=400×300px だとすると, --------------------------------------- onClipEvent (load) { this._x = _root.myButton._x-200; this._y = _root.myButton._y-150; } --------------------------------------- ということになります。 しかし,「1.swf」という名前から考えて, 「2.swf」,「3.swf」… なども存在すると考えたため, どの SWF が読み込まれても良いように,上のような少し凝った仕組みにしました。 なお, 「myMC」と「datum」の最初に描いた四角い塗りは,不要ですね。 各ムービークリップの編集で,最初に描いた四角い塗りを削除するか,透明な塗りに塗り替えてください。 作成するときには見えた方が良いので,しばらく残しておいても良いですが, 実際のアップでは見えても目障りなだけですから消した方が良いです。 ============================================= というわけで,実際は自分で考えてすべきことで, その考え方によって,スクリプトはコロコロ変わります。 > いろいろなサイトを見たものの > 適切な答えがなかったので質問します 探してもサンプルなどはないと思いますよ。 以上のように基準点やムービーの作成まで長々と説明せねばなりませんから, 私が Flash 解説のサンプルを公開するサイトの作成者であったとしたら, 説明が手間なだけで,説明に手間をかけた割には,格好いいものができるわけではないので, 絶対にサンプルとして公開しないでしょうね。 もっと,スクリプト的に格好良く(高度なスクリプトで),説明が簡単で(スクリプトを公開するだけで使える),もっとすごい動きをするものを公開するでしょう。