• 締切済み

Flash 着せ替えゲームのアクションスクリプト

現在Flashを使って着せ替えのゲームを作っています。 人物に洋服をドラッグドロップ吸着し、吸着しないと元に戻るところまではできるのですが、何着も洋服があると人物上で重なってしまいます。 それを、例えば洋服を着ているところに着物をドロップすると洋服が元にある場所に戻るということはできないのでしょうか。 現在のスクリプトはこのような感じです。 人物=mytarget 洋服のボタンのムービークリップのアクション(シーンに置く前) on (press) { this.startDrag(); } on (release, releaseOutside) { this.stopDrag(true); if (_droptarget == "/mytarget") { this._x = eval(_droptarget)._x; this._y = eval(_droptarget)._y; } else { this._x = oldX; this._y = oldY; } } シーン上に置いてある洋服のムービークリップ onClipEvent (load) { oldX = this._x; oldY = this._y; } ご回答出来る方がいらっしゃれば宜しくお願い致します。

みんなの回答

回答No.2

とても時間がたっていますが… noname#35109様の回答の内容がとてもわかりやすく、 同じ問題で頭を抱えていた私はすごく助かりました! ありがとうございました!

noname#35109
noname#35109
回答No.1

えらく回答が遅くなってしまいましたね。 ここにこのようなご質問があることを今まで全然気づきませんでした。 たまたま「アクションスクリプト」と,コミュニティ内を検索してみて, 始めて今気づいた次第です。 --------------------------------------- onClipEvent (load) を使われているところから推測して, Flash 5 以上をお持ちであり, なおかつ,携帯用 Flash(Flash Lite 1.1以下)の SWF を作ろうとされているわけではありませんね。 スクリプトが古すぎますよ。 よく無事に動作しているなぁと感心しました。 onClipEvent (load) 以外は Flash 4 以下のスクリプトです。 Flash 5 からは ActionScript1.0 となり, 使用を禁止(使用を避ける)スクリプトも混ざっています。 大筋はなるべく書かれていることを尊重したつもりですが, かなり元のスクリプトに手を加えさせていただきました。 その点ご了承ください。 /////////////////////////////////////////////////// 洋服のムービークリップに全てインスタンス名を付けてください。 この説明では,「clothes0」,「clothes1」,「clothes2」 と clothes という文字列と 0,1,2 という連番を付けておきます。 同様に,たくさんある場合は, 「clothes3」, 「clothes4」… とインスタンス名を付けて行ってください。 そして, 各洋服ムービークリップ内にあるボタンに, 次のように書けば(コピペすれば)一応うまく行くと思います。 --------------------------------------- on (press) { this.startDrag(); } on (release, releaseOutside) { this.stopDrag(); // // もし,ターゲットとマウスがヒットしていれば if (_root.mytarget.hitTest(_root._xmouse, _root._ymouse, true)) { // 一応全ての洋服を元の位置に戻し for (i=0; i<=2; i++) { _root["clothes"+i]._x = _root["clothes"+i].oldX; _root["clothes"+i]._y = _root["clothes"+i].oldY; } // このムービークリップのみターゲットに吸着 this._x = _root.mytarget._x; this._y = _root.mytarget._y; } else { this._x = oldX; this._y = oldY; } } --------------------------------------- こんな感じです。 _droptarget で押し切ろうかと努力してみましたが, 洋服どうしが重なったときどうしてもうまく動作しません。 swapDepths(); で深度を変えればなんとかなると思いますが, 作られているものがどんなものかわからないため,勝手に深度を変えるのもやめました。 また, _droptarget はスラッシュシンタックス(/)とセットでないと動作しないという, 完璧に Flash 4 時代の遺物です。 Flash 5 以上ではドットシンタックス(.)を使うべきです。 そうすると, 手っ取り早く使えるのは hitTest (当たり判定) となります。 「当たり判定について」 http://hakuhin.hp.infoseek.co.jp/main/as/hittest.html というわけで, なるべく元のスクリプトを尊重したつもりですが, 変わった部分が多くなってしましました。 でも,これで Flash 5 らしい,ちゃんとした ActionScript1.0 になったと思います。 Flash MX 以上をお持ちでしたら, ムービークリップに on (press) など onイベントハンドラが書けますから, ムービークリップの中に ボタンを作るという手間なことは必要ありません。 こんな感じに1つにまとめられます↓。 ----------------------------------- onClipEvent (load) { oldX = this._x; oldY = this._y; } on (press) { this.startDrag(); } on (release, releaseOutside) { this.stopDrag(); if (_root.mytarget.hitTest(_root._xmouse, _root._ymouse, true)) { for (i=0; i<=2; i++) { _root["clothes"+i]._x = _root["clothes"+i].oldX; _root["clothes"+i]._y = _root["clothes"+i].oldY; } this._x = _root.mytarget._x; this._y = _root.mytarget._y; } else { this._x = oldX; this._y = oldY; } } ----------------------------------- Flash MX 以上をお持ちでしたら, 一度試してみてください。 ただし,パブリッシュの設定で,Flash Player 6 以上の SWF をパブリッシュする設定にしておかなければ,うまくパブリッシュできませんが。 あと, [ ] は配列アクセス(演算子)というものです。 eval関数 は今はもうほとんど使えません(Flash Lite を除く)。 使えないので使いません。 全て [ ] ですませるのが普通です。

関連するQ&A