- ベストアンサー
Flash ドラック&ドロップ 色の変更
Flash]で作成していてつまずいている者です。 初心者なので困っています。 内容は以下のようなことです。 画面に2つの□が左右にあるとします。 左の□は赤のムービークリップで、右の□は白のムービークリップです。 左の赤の□をドラックして、右の白の□に重ねた(吸着した)ときに 赤が黄色に変わる方法を知りたいです。 すみませんがよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
「MC(ムービークリップ)を使う」ということですから MC の特性を生かして 例えば MC内の フレーム1 と 2 との表示を切り替えることによって 色を変えるという方法をまず考え付くべきでしょうね。 (この方法を使えば,「塗りだけの色を変える」とか「形と色を変える」とかその他色々なことに対応できます。) しかし... 「使用されている Flash のバージョン」も 「使用している ActionScript のバージョン」も書かれていませんね。。。 これでは具体的なスクリプトなど回答できません。 回答できなければ困るので こちらで勝手な条件を想定させていただきます。 Flash CS3 以上をお持ちで ActionScript 3.0 を使って Flash Player 9 以上用の SWF をパブリッシュするものとします。 この条件であるものとして以下を続けます。 まず,「左の□の赤MC」内は 2フレーム にして フレーム1 と フレーム2 にキーフレームを作り フレーム1 には 赤□,フレーム2 には 黄□ の絵を用意します。 ※参考【添付図】↓ この作業が終わりましたら 「シーン 1」などメインのタイムラインの編集に戻ります。 そして ステージ上の「左の□の赤MC」を選択した状態で プロパティインスペクタ(プロパティパネル)より 例えば「L_mc」というインスタンス名を付けます。 また ステージ上の「右の□の白MC」を選択した状態で プロパティインスペクタ(プロパティパネル)より 例えば「R_mc」というインスタンス名を付けます。 その「L_mc」や「R_mc」が存在するタイムラインのフレーム (例:メインタイムラインのフレーム1)に書くスクリプト例です↓。 //--------------------------- //左の「L_mc」内の再生を停止 L_mc.stop(); //右の「R_mc」上でマウスダウン時に関数 onR_mcMouseDown を実行 R_mc.addEventListener(MouseEvent.MOUSE_DOWN,onR_mcMouseDown); //関数 onR_mcMouseDown の定義 function onR_mcMouseDown(e:MouseEvent):void { //「R_mc」のドラッグを開始 R_mc.startDrag(); //マウスアップ時に関数 onStageMouseUp を実行 stage.addEventListener(MouseEvent.MOUSE_UP,onStageMouseUp); //マウスが動く度に関数 watchHitLR を実行 addEventListener(MouseEvent.MOUSE_MOVE,watchHitLR); } //関数 onStageMouseUp の定義 function onStageMouseUp(e:MouseEvent):void { //「R_mc」のドラッグを終了 R_mc.stopDrag(); //マウスアップ時に関数 onStageMouseUp の実行するのを解除 stage.removeEventListener(MouseEvent.MOUSE_UP,onStageMouseUp); //マウスが動く度に関数 watchHitLR を実行するのを解除 removeEventListener(MouseEvent.MOUSE_MOVE,watchHitLR); } //関数 watchHitLR の定義 function watchHitLR(e:MouseEvent):void { //もし「R_mc」が「L_mc」にヒットしていれば if (R_mc.hitTestObject(L_mc)) { //「L_mc」内の再生を フレーム2 で停止 L_mc.gotoAndStop(2); } else { //ヒットしていなければ「L_mc」内の再生を フレーム1 で停止 L_mc.gotoAndStop(1); } } //--------------------------- 回答文字数制限にまだ少し余裕があるため 上と同様の構造を作った上での Flash MX 2004 以上をお持ちで ActionScript 2.0 を使って Flash Player 6 以上用の SWF をパブリッシュする場合の フレームに書くスクリプト例も書いておきます↓。 //--------------------------- //左の「L_mc」内の再生を停止 L_mc.stop(); //右の「R_mc」上でマウスダウン時に実行するメソッドを定義 R_mc.onPress = function():Void { //「R_mc」のドラッグを開始 R_mc.startDrag(); //マウスが動く度に関数 watchHitLR を実行 this.onMouseMove = watchHitLR; }; //右の「R_mc」上でマウスアップ時に実行するメソッドを定義 R_mc.onRelease = R_mc.onReleaseOutside = function():Void { //このMC(R_mc)のドラッグを終了 this.stopDrag(); //マウスが動く度に関数 watchHitLR を実行するのを解除 delete this.onMouseMove; } //関数 watchHitLR の定義 function watchHitLR():Void { //もし「R_mc」が「L_mc」にヒットしていれば if (R_mc.hitTest(L_mc)) { //「L_mc」内の再生を フレーム2 で停止 L_mc.gotoAndStop(2); } else { //ヒットしていなければ「L_mc」内の再生を フレーム1 で停止 L_mc.gotoAndStop(1); } } //--------------------------- ※ご質問には 「(吸着した)とき」と書かれていますが 「(接触した)とき」と解釈を変えています。 (両スクリプトとも,いわゆる吸着はさせていません。)
お礼
教えて頂いた通りにすることで解決しました。 素早く正確な回答に本当に感謝します。 ありがとうございました。