Flash着せ替え用アクションスクリプト

このQ&Aのポイント
  • FlashCS3でキャラクターにドラックドロップで服を着せる方法についての質問です。
  • 現在はキャラクターの体部分と服をムービークリップとして配置し、ドラックドロップの動作を実装しています。
  • しかし、服を体に吸着させる方法が分からず困っています。アクションスクリプトの初心者ですが、参考になるwebサイトなどがあれば教えてください。
回答を見る
  • ベストアンサー

Flash着せ替え用アクションスクリプト

はじめまして。 FlashCS3で、キャラクター(体)にドラックドロップで服を着せられるような"着せ替え"を制作したいと考えています。 現在はキャラクターの体部分にあたるムービークリプ(インスタンス名"target")と服ににあたるムービークリップ(インスタンス名"clothes0")をシーン上に配置し、 "clothes0"内に this.onPress = function () { this.swapDepths(++_root.depth); this.startDrag(); } // this.onRelease = function () { this.stopDrag(); } // this.onMouseMove = function () { updateAfterEvent (); } というスクリプトを書いて、一応ドラックドロップで服だけ動くような感じです。 服の"clothes0"を体である"target"に吸着させる方法をご存じの方がいましたら教えてください! いろいろ検索などして調べたのですがどうもうまくいきません。 参考になりそうなwebサイトなどもありましたら教えていただけると助かります! ちなみにまだアクションスクリプトを触りだしたばかりの詳しくない者です;

  • tyuni
  • お礼率100% (1/1)

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

『吸着』 とはどういうものであるかというと, 『物が目標ポイントにある程度近い場所にあったとき,その物の座標を目標ポイントの座標と一致させる。』 ということです。 ActionScript や Flash のバージョンや, 使う場合によってスクリプトの形は当然変わりますが, だいたいどの場合も上で書いた『吸着』の意味は変わりませんし, 上で書いた『吸着』の意味になるようにコーディング(スクリプト記述)をします。 この場合, 上で書いた 物 とは,インスタンス名clothes0 のムービークリップです。 上で書いた 目標ポイント とは,インスタンス名target のムービークリップの座標です。 上で書いた ある程度近い場所にあったとき とは this.onRelease したときです。 上で書いた ある程度 は適当に指定してやれば良いです。 したがってスクリプトは次のようになります。 ------------------------------------------- // ある程度の範囲の設定(単位px) range = 10; // this.onPress = function() { this.swapDepths(++_root.depth); this.startDrag(); }; // this.onRelease = function() { this.stopDrag(); // この MC の座標が target座標 の ±range 以内にあるとき if (this._x<=this._parent.target._x+range && this._x>=this._parent.target._x-range && this._y<=this._parent.target._y+range && this._y>=this._parent.target._y-range) { // この MC の座標を target の座標に合わせる this._x = this._parent.target._x; this._y = this._parent.target._y; } }; // ------------------------------------------- 変数 range は,変数 depth 同様, _root に設定して, _root.range のように参照してもかまいません。 また, どの clothes○ もほとんど同じスクリプトになりますから, _root のフレームに for文 を使って書いても良いと思いますし, #include で共通の外部ASをインクルードしても良いと思いますし, ムービークリップを継承するクラスファイルを作成して, そのクラスを clothes○ のシンボルに適応させても良いと思います。 その辺は色々です。 =================== しかし, スクリプト以前にわかっておなかければならないのは "基準点" です。 ムービークリップ(ボタンも)の座標とは, ムービークリップの基準点の座標を指します。 ムービークリップの基準点は十字マーク ┼ でステージ上に表示されます。 この基準点は絵などをムービークリップなどに変換するときに 「シンボルに変換パネル」で,  基準点(R): □□□         □■□         □□□ のような部分があってそこで, 左上,中上,右上,左中,中中,右中,左下,中下,右下 の9ポイントから選べます。 上の場合 ■ のある 中中(中央) に基準点が来ます。 それ以外の場所などにしたい場合は, ムービークリップの中の絵を動かさなければなりません。 上のようなスクリプトでうまく行くのは, 基準点と絵の本体との相対的位置関係が, target と clothes0 とで一致しているという条件が必要です。 --- ↓targetの例↓ --------   基準点  □↓□□□□□□□□□  □┼□□■■■□□□□  □□□□■■■□□□□  □□□□□■□□□□□  □■■■■■■■■■□  □□□□□■□□□□□  □□□□□■□□□□□  □□□□■□■□□□□  □□□■□□□■□□□  □□■■□□□■■□□  □□□□□□□□□□□ --- ↓clothes0の例↓ --------   基準点  □↓□□□□□□□□□  □┼□□□□□□□□□  □□□□□□□□□□□  □□□□□□□□□□□  □□■■■□■■■□□  □□■■■■■■■□□  □□□□■■■□□□□  □□□■■■■■□□□  □□■■■■■■■□□  □□□□□□□□□□□  □□□□□□□□□□□ このように作成しておいた場合, 上のスクリプトで,targetの基準点にclothes0の基準点が吸着するように動きます。 このように作成しない場合は, スクリプトでうまく行くように計算したり検証しながら補正する必要が出てきます。 これはかなり面倒ですから, やはり基準点と絵の本体との相対的位置関係を合わせてムービークリップを作成する方が良いです。 またこの場合に限らす, 日頃から基準点を意識したインスタンス作成をすることが大切です。 作成の最初から基準点を意識していると難無く普通に作成できますし, 場合によっては基準点を意識すると描画方法(描画手順)なども変わって来ると思います。 ※私が描いた上の □■■□ のテキスト絵でも   target を先に描いてそれを下にコピペし   clothes0の服の部分を■で付け足して描いて   本体部分を消した(■を□にした)のです。   そうすると基準点┼の相対的位置関係は変えることなく   簡単に描けます。   いつもそうとは限りませんが,   Flash でも同様の方法で描くのが良い場合もあります。

tyuni
質問者

お礼

とても詳しい回答ありがとうございました! 「吸着」と「座標」の関係性がいまいち理解できておらず、 スクリプトにいちいち座標を書き込む方法も試したりしていたのですが、この度の図の入った回答がとても勉強になりました。 基準点も今まで制作する際にあまり意識して描いたことはなかったのですが、これからスクリプトを少しづつ学ぶものとしてしっかり注意して見ていきたいと思います。 着せ替えのフラッシュですが教えていただいた方法を参考に制作してみたところ、しっかりtargetに吸着させることができました! 本当にありがとうございました!

関連するQ&A

  • 外部ファイルを読み込んだMCをドラッグ&ドロップしたいんですが?

    flash(swf)で外部ファイルを読み込んだムービークリップ(MC)をドラッグ&ドロップで移動できるようにしたいんですが、どのようにすればできるでしょうか? 通常のライブラリなどに登録して表示させているMC(インスタンス名:photoL)は以下のようなASで処理できるんですが、外部ファイルを読み込んだMC(インスタンス名:photoF)では同じ書き方をしても表示はするんですが、ドラッグ&ドロップで移動できません。 --------------------------------------------------- photoF.loadMovie("test.jpg"); photoL.onPress = function(){ this.startDrag(false,v_leftLock,v_topLock,v_rightLock,v_bottomLock); }; photoL.onRelease = function(){ this.stopDrag(); }; photoL.onReleaseOutside = function(){ this.stopDrag(); }; photoF.onPress = function(){ this.startDrag(false,v_leftLock,v_topLock,v_rightLock,v_bottomLock); }; photoF.onRelease = function(){ this.stopDrag(); }; photoF.onReleaseOutside = function(){ this.stopDrag(); };

    • ベストアンサー
    • Flash
  • 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; } ご回答出来る方がいらっしゃれば宜しくお願い致します。

  • プルダウンメニューの移動

    ムービークリップ(インスタンス名:menu)を作成し、 その中にムービークリップ(インスタンス名:head)を作成しました。 head をマウスで動かすスクリプトは以下のようになっていて動かすことができます。 onClipEvent(load) { //ドラッグを開始します function dragFunc() { this.startDrag(frame, -400, -300, 400, 300); } //ドラッグを終了します function dropFunc() { this.stopDrag(); } } on(press) { this.dragFunc(); } on(release, releaseOutside) { this.dropFunc(); } しかし、head をドラッグして、menu を動かすことができません。(this を menu、menu.head に変更しても) どのようにしたら、いいでしょうか?

    • ベストアンサー
    • Flash
  • ドロップ先のターゲットパスの指定について.

    いつもお世話になっております.今回はドラッグ&ドロップに関して質問です.以下に記述されているASの間違った部分の修正をお願いします. やりたいことは「mc1~80をドラッグでき.back1~80のどれにでもドロップできる」といったことです. 現在,以下のASでうまく機能していることは,ドラッグ&ドロップできるがbcak1~80に吸着されない....といったところです. どうか解決のほどよろしくお願いします. for(i=0; i<=80; i++) { _root["mc"+i].onPress = function(){ this.startDrag (true); } } for(i=0; i<=80; i++) { _root["mc"+i].onMouseUp = function(){ if (this._droptarget == _root["back"+i]) { this._x = _root["back"+i]._x; this._y = _root["back"+i]._y; } stopDrag (); } } for(i=0; i<=80; i++) { _root["mc"+i].onMouseMove = function(){ updateAfterEvent(); } }

    • ベストアンサー
    • Flash
  • 【as3】クリックでインスタンスを増やしたい

    Actionscript初心者です。 勉強のため、以下のURLにあるActionscript2.0のFlashをActionscript3.0に書き換えたいと思っています。 http://allabout.co.jp/gm/gc/66814/ 左側にリースのパーツ、右に素のままのリースが配置されています。パーツはそれぞれ、リボン付きベル(インスタンス名「bellBig」)、松ぼっくり (インスタンス名「matu」)、小さいベル(インスタンス名「bellSmall」)と指定してあります。この3つのアイテムをドラッグドロップすることでリースを飾り付けていきます。 インスタンスをドラッグ&ドロップする所まではできたのですが、 松ぼっくりと小さいベルをドラッグした際にインスタンスを複製するところでつまずいています。 あまりにも初歩的な質問で恐縮ですが、ご教授お願いいたします。 /*////////////////////大きいベル/////////////////////*/ // ドラッグ開始 bellBig.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown1); function mouseDown1(event:MouseEvent):void{ bellBig.startDrag(); } // ドラッグ終了 bellBig.addEventListener(MouseEvent.MOUSE_UP,mouseUp1); function mouseUp1(event:MouseEvent):void{ bellBig.stopDrag(); } /*////////////////////まつぼっくり/////////////////////*/ // ドラッグ開始 matu.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown); function mouseDown(event:MouseEvent):void{ matu.startDrag(); } //ドラッグ終了 matu.addEventListener(MouseEvent.MOUSE_UP,mouseUp); function mouseUp(event:MouseEvent):void{ matu.stopDrag(); } /*////////////////////小さいベル/////////////////////*/ // ドラッグ開始 bellSmall.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown2); function mouseDown2(event:MouseEvent):void{ bellSmall.startDrag(); } // ドラッグ終了 bellSmall.addEventListener(MouseEvent.MOUSE_UP,mouseUp2); function mouseUp2(event:MouseEvent):void{ bellSmall.stopDrag(); }

  • ドラッグしたときの当たり判定

    ParaFlaを使ってFlashを制作しています aというスプライトをドラッグし bというスプライトにぶつかったらラベルCに飛ぶ というものを作りたいのですがうまくいきません aに記述しているアクションスクリプト on (press) { this.startDrag (true); } - on (release,releaseOutside) { this.stopDrag (); } - onClipEvent (enterFrame) { if(this.hitTest(_root.b) == true) { this.gotoAndPlay("c"); } } - onClipEvent (mouseMove) { updateAfterEvent(mouse); } バージョンはSWF8です ドラッグはできるのですがbとぶつかっても 何も起こりません bには何も記述していません どこを変更すればよいかわかる方 よろしくお願いします

    • ベストアンサー
    • Flash
  • ドラッグアンドドロップについて(startDrag+stopDrag)

    現状のファイルではstartDrag+stopDragにてムービークリップをドラッグアンドドロップ出来るようにしています。 このドラッグの操作感をデフォルトより重い感じにしたいと思っておりますが、どのようにスクリプトで制御していいのかが分からず大変困っております。 ご存じの方がおられましたら大変お手数ですが、ご教授いただければと思います。 何卒、宜しくお願い申し上げます。

    • ベストアンサー
    • Flash
  • ActionScript 3.0 D&Dの実装

    ステージ上に、インスタンス20個配置し (addChildは使わずに、普通に最初から置きます。  インスタンス名は mc1 ~ mc20)  それぞれをドラッグアンドドロップで自由に動かしたいです。 以下のようにプログラムを書いたのですが いざドラッグしようとすると 「TypeError: Error #1006: value は関数ではありません at MethodInfo-1()」 っとエラーが出てしまいました。 っと出てしまいました。 一体何が原因でしょうか? また、解決方法がありましたら是非ともよろしくお願いします。 addEventListener(MouseEvent.MOUSE_OVER,getname); function getname(e:MouseEvent) {    var str= e.target.name; trace(str); //マウスカーソルを乗せたムービークリップのインスタンス名が出ます。 addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); function onMouseDown(e:MouseEvent) { str.startDrag(); } addEventListener(MouseEvent.MOUSE_UP, onMouseUp); function onMouseUp(e:MouseEvent) { str.stopDrag(); } }

    • ベストアンサー
    • Flash
  • ドラッグ中の回転を止めたいのですが…

    ドラッグができて,なおかつクリックすると90度回転するようにするため,サンプル集を見てムービークリップ(sikaku_mc)に 次のようなアクションスクリプト(以下AS)を書きました。 もともと解説にあったのですが,これだとドラッグしている最中も 回転してしまいます。クリックすると回転しても ドラッグしているときは回転しないようにするためにはどうすればいいでしょうか。 ちなみにこのASはムービークリップ(sikaku_mc)の編集画面のタイムラインに書き込んだものです。 function onPress() { this.startDrag(false); var xm:Number = this._xmouse; var ym:Number = this._ymouse; this._x = _root._xmouse; this._y = _root._ymouse; sikaku_mc._x -= xm; sikaku_mc._y -= ym; this.onEnterFrame = mawasu; this.onMouseMove = updateStage; } function updateStage() { updateAfterEvent(); } function mawasu() { this._rotation += 90; } this.onRelease = this.onReleaseOutside=stopDragMe; function stopDragMe() { this.stopDrag(); delete this.onEnterFrame; delete this.onMouseMove; } ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • 空のMCにLoadした外部画像jpgの名前設定

    いつもお世話になっております。 空のMCを作成し、Photogallery内に使用するJPGイメージを外部から呼び出すようにしているのですが、イメージ自体をマウスでドラッグしたいので各JPGイメージに名前(インスタンス名)を付けたいのですが、うまくいきません。 是非ご教授頂けますと幸いです。 XP、CS4 アクションスクリプト2.0 環境です 現在のスクリプトです。 loadMovie(".../images/image1.jpg", "targetlargeMC"); var targetlargeMC; targetlargeMC = ".../images/image1.jpg"; ドラッグするためのコードは下記です(一応) targetlargeMC.onRollOver = function () { Mouse.hide(); handMC.gotoAndStop("hand"); //startDrag("handMC", true); } handMC.onLoad = function () { gotoAndStop("none"); } var drag_flg:Boolean = false; targetlargeMC.onPress = function() { startDrag(this); this.onMouseMove = function() { drag_flg = true; delete this.onMouseMove; }; }; targetlargeMC.onRelease = targetlargeMC.onReleaseOutside = function () { if (!drag_flg) { gotoAndStop(60); } else { stopDrag(); drag_flg = false; } };

    • ベストアンサー
    • Flash