• ベストアンサー

ムービークリップの移動で…

Flash初心者です。 左右に動くMC(b_mc)を作っているのですが、それが1500px以上移動した時に、別のMC(right_mc)を出現・移動させ、それ以外は表示させないようにしたいのですが、アクションスクリプトをどうやって記述したらいいのか分かりません。 どなたかご教授下さい。 宜しくお願いいたします。

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

  • ベストアンサー
noname#35109
noname#35109
回答No.2

#1です。 > 「それ以外」というのは、1500px以下では > right_mcは表示させないという意味です。 そういう意味でしたか。 とり違えておりました。 しかしそれだと,#1ですでに1つの方法を回答していますよ。 #1の最初の場合で行くと, 「白幕を作る」部分を除けば良いだけです。 ステージ上に ■ と ● のムービークリップを作成。 ■=ムービークリップ:インスタンス名 「b_mc」 ●=ムービークリップ:リンケージの識別子「right_mc」 ●はステージ上から消しておいて, _root のフレーム1に次のように書きます。 ---------------------------------- // b_mc の 初期座標を 変数 bx に記録 bx = _root.b_mc._x; // 状況を示す変数 stt (atate)の初期化 stt = 0; // // 1フレーム進時間ごとに毎回実行 _root.onEnterFrame = function() { // b_mc のx座標を 20 ずつ加算 _root.b_mc._x += 20; // // もし b_mc の x座標 が bx+1500 より大きくなって // stt の値が 0 であれば if (_root.b_mc._x>1500 && _root.stt == 0) { // シンボル right_mc を // インスタンス名 right_mc で 深度1 に呼びだす _root.attachMovie("right_mc", "right_mc", 1); // 座標はステージ中央 _root.right_mc._x = Stage.width/2; _root.right_mc._y = Stage.height/2; // 即,stt の値を 1 にする _root.stt = 1; // // stt の値が 1 であれば } else if (_root.stt == 1) { // right_mc の x座標を 10 ずつ加算 _root.right_mc._x += 10; } }; ---------------------------------- こんな感じでできると思いますが。 「right_mc」を出す位置がわからないので, 適当にステージ中央にしているだけです。 ===================== 「right_mc」をライブラリから呼びだすのではなく, 最初は非表示にしておく方法もありますが。 ステージ上に ■ と ● のムービークリップを作成。 ■=ムービークリップ:インスタンス名 「b_mc」 ●=ムービークリップ:インスタンス名 「right_mc」 そして_root のフレーム1に次のように書きます。 ---------------------------------- // right_mc を非表示にする _root.right_mc._visible = false; // b_mc の 初期座標を 変数 bx に記録 bx = _root.b_mc._x; // 状況を示す変数 stt (atate)の初期化 stt = 0; // // 1フレーム進時間ごとに毎回実行 _root.onEnterFrame = function() { // b_mc のx座標を 20 ずつ加算 _root.b_mc._x += 20; // // もし b_mc の x座標 が bx+1500 より大きくなって // stt の値が 0 であれば if (_root.b_mc._x>1500 && _root.stt == 0) { // right_mc を表示する _root.right_mc._visible = true; _root.stt = 1; // // stt の値が 1 であれば } else if (_root.stt == 1) { // right_mc の x座標を 10 ずつ加算 _root.right_mc._x += 10; } }; ---------------------------------- その他, 最初, _root.right_mc._alpha = 0; としておいて,b_mc が 1500px 動いたときに, _root.right_mc._alpha = 100; にする。 という方法もありますね。 > ifとelse ifで記述できるかと思ったのですけど > なかなか動いてくれなくて…。 #1のスクリプトも上の2つのスクリプトも, ifとelse ifで条件分岐して動かしていますよ。 onEnterFrame などで,いつも b_mc の座標を監視しておいて, if判定する必要はあると思いますが。

その他の回答 (1)

noname#35109
noname#35109
回答No.1

> それ以外は表示させない のですか。 何か特定なものを表示させないのではなくて,それ以外の物すべてを...。 案ですが b_mc が1500px以上移動した時に, ステージ全体を白幕で覆ってしまって, その白幕の上に right_mc を出現・移動させるのも1つの方法ではないでしょうか。 新規ドキュメントを作成して, てきとうな ■ でも描いてムービークリップに変換し, インスタンス名に 「b_mc」 と付けます。 その隣り辺りにでも, てきとうな ● を描いてムービークリップに変換します。 そして, ライブラリを表示させてライブラリ内の ● を選択し, 右クリック → リンケージ でリンケージプロパティを表示させ,  リンケージ(V):□ActionScriptに書き出し にチェックを入れます。 すると自動的に □最初のフレームに書き出し にもチェックが入りますから, そのチェックは入れたままにしておきます。 □ActionScriptに書き出し にチェックを入れると,  識別子(I):[       ] が入力可能になりますから, その識別子の欄に 「right_mc」 と記入します。 そして 「OK」 ボタンをクリックします。 ステージの編集に戻って, 上で作成した ● のムービークリップを削除します。 ●はシンボルとしては残っているのでステージ上から削除しても大丈夫です。 そして, ステージ上に ▲ や □ や - や × や を無茶苦茶に落書きし, その他,ダイナミックテキストやなんでもかんでも思い付くものを配置します。 レイヤーもいくつ追加してもかまいません。 そして最後に, ActionScript を書くためのレイヤーを追加して, そのレイヤーのフレーム1に次のように書きます。 ----------------------------------- // b_mc の 初期座標を 変数 bx に記録 bx = _root.b_mc._x; // 状況を示す変数 stt (atate)の初期化 stt = 0; // // 1フレーム進時間ごとに毎回実行 _root.onEnterFrame = function() { // b_mc のx座標を 20 ずつ加算 _root.b_mc._x += 20; // // もし b_mc の x座標 が bx+1500 より大きくなって // stt の値が 0 であれば if (_root.b_mc._x>1500 && _root.stt == 0) { // 空のムービークリップ maku_mc を深度 0 に作成 _root.createEmptyMovieClip("maku_mc", 0); // link_mc にステージの大きさの白色塗りを作図 _root.maku_mc.beginFill(0xFFFFFF, 100); _root.maku_mc.moveTo(0, 0); _root.maku_mc.lineTo(Stage.width, 0); _root.maku_mc.lineTo(Stage.width, Stage.height); _root.maku_mc.lineTo(0, Stage.height); _root.maku_mc.lineTo(0, 0); _root.maku_mc.endFill(); // シンボルmaku_mc を // インスタンス名maku_mc で 深度1 に呼びだす _root.attachMovie("right_mc", "right_mc", 1); // 座標はステージ中央 _root.right_mc._x = Stage.width/2; _root.right_mc._y = Stage.height/2; // 即,state の値を 1 にする _root.stt = 1; // // stt の値が 1 であれば } else if (_root.stt == 1) { // right_mc の x座標を 10 ずつ加算 _root.right_mc._x += 10; } }; ----------------------------------- すると, b_mc が,最初配置した場所より 1500px 右に移動したとき, 落書きしたもの全てが消えて,right_mc が出没し,右に動きだします。 一応,見た目は right_mc 以外は見えなくなると思います。 本当に消えるわけではなく,見た目が消えるだけですけどね。 第39回 Flashでお絵かきアプリケーションを作ってみよう http://pc.nikkeibp.co.jp/article/COLUMN/20070309/264369/?ST=skillup&P=2 「リンケージについて」 http://www.1art.jp/flash/le/lessona/lessona.htm ====================================== 別の方法ですが, こんな方法もアリかもしれません。 もっと無茶な方法ですけど。 ムービー自体の構造は上のままで,スクリプトのみの変更です。 ----------------------------------- // b_mc の 初期座標を 変数 bx に記録 bx = _root.b_mc._x; // 状況を示す変数 stt (atate)の初期化 stt = 0; // // 1フレーム進時間ごとに毎回実行 _root.onEnterFrame = function() { // b_mc のx座標を 20 ずつ加算 _root.b_mc._x += 20; // // もし b_mc の x座標 が bx+1500 より大きくなって // stt の値が 0 であれば if (_root.b_mc._x>1500 && _root.stt == 0) { // 全てのものを _root ごとおもいっきり下に移動 _root._y = Stage.height+1000; // シンボルmaku_mc を // インスタンス名maku_mc で 深度0 に呼びだす _root.attachMovie("right_mc", "right_mc", 0); // 座標はステージ中央 _root.right_mc._x = Stage.width/2; _root.right_mc._y = Stage.height/2-(Stage.height+1000); // 即,state の値を 1 にする _root.stt = 1; // // stt の値が 1 であれば } else if (_root.stt == 1) { // right_mc の x座標を 10 ずつ加算 _root.right_mc._x += 10; } }; ----------------------------------- かなり無茶な方法だと思います。 ====================================== また,別の方法ですが, 普通は行かないような空白キーフレームのみのフレームを用意して, b_mcが 1500px 以上移動した時に その空白キーフレームのみのフレームに gotoAndStop() して, right_mc を attachMovie で呼びだしても良いかもしれません。 「それ以外は表示させない」 が難しいのですよ。 表示させたくないものを1つのムービークリップなどにまとめて入れてあると, 削除や非表示も簡単なのですが, _root に置いた ムービークリップ も ボタン も テキストフィールド も シェイプ も ビットマップ画像も… というような,あらゆるものを非表示にした上で, right_mc のみを表示させるのはなかなか良いアイデアが浮かびませんね。

snowdrop25
質問者

お礼

sassakun様 返信ありがとうございます。 「それ以外」というのは、1500px以下ではright_mcは表示させないという意味です。 ifとelse ifで記述できるかと思ったのですけどなかなか動いてくれなくて…。 説明不足ですみません。