• ベストアンサー

ゴミ箱のようなflashを作りたい

actionscript初心者です(1.0か2.0) flashは CS4 を使ってます ステージにいくつかのオブジェクトと、3つの箱がある ↓ 任意のオブジェクトを1つドラッグして、任意の箱にドロップ ↓ 箱がふくらむ ※1つの箱に入るオブジェクトは1つまで といった感じのflashを作りたいのです オブジェクトのドラッグはなんとか書けますが、 箱の上でオブジェクトが消え、箱がふくらんだ箱に変わるところなどがわかりません・・・ いいサンプルなどご存知でしたら教えてください!

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

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

とりあえず オブジェクト も ゴミ箱 もそれぞれを各ムービークリップで作成します。 (絵などをムービークリップに変換します という意味です。) そして各ムービークリップにインスタンス名を付けます。 仮に オブジェクト は 4つ で,ゴミ箱 は 3つ であったとします。 その場合 7つ のムービークリップになるわけですが, 例えば4つのオブジェクトムービークリップには 「obj_0」 「obj_1」 「obj_3」 「obj_4」, 例えば3つのゴミ箱ムービークリップには 「box_0」 「box_1」 「box_3」 というインスタンス名を付けます。 各ゴミ箱ムービークリップ内の フレーム2 には 「ゴミ箱がふくらんだ状態」の絵を置きます(描きます)。 ここまでの状態を表したのが 【下の図】↓ です。 ※「ゴミ箱がふくらんだ状態」の絵は,   シーン1 などメインのタイムラインのフレーム2に置くのではありません。   "各ゴミ箱ムービークリップ内" のタイムラインの フレーム2 に置きます。 これら7つのムービークリップが存在するフレームに 次のようなスクリプトを書けば, ご質問で書かれていらっしゃるようなことができます。 --------------------------------------------- // ゴミ箱(box_○)に関するループ for (var i:Number = 0; i<=3; i++) { // 「box_0」~「box_3」内をフレーム1で停止 _root["box_"+i].stop(); } // オブジェクト(obj_○)に関するループ for (i=0; i<=4; i++) { // // 「obj_0」~「obj_4」を押したときの動作を定義 _root["obj_"+i].onPress = function():Void { // このムービークリップのドラッグを開始 this.startDrag(); }; // // 「obj_0」~「obj_4」を放したときの動作を定義 _root["obj_"+i].onRelease=_root["obj_"+i].onReleaseOutside=function():Void { // このムービークリップのドラッグを終了 this.stopDrag(); // ゴミ箱(box_○)に関するループ for (i=0; i<=3; i++) { // もしそのときゴミ箱(box_○)がマウスに接触していたら if (_root["box_"+i].hitTest(_root._xmouse, _root._ymouse, true)) { //なおかつそのゴミ箱のフレームが1であれば if (_root["box_"+i]._currentframe == 1) { // そのゴミ箱内のフレームを2に進めて停止 _root["box_"+i].gotoAndStop(2); // そしてこのオブジェクトを非表示にする this._visible = false; } } } }; } --------------------------------------------- ・バージョン  ActionScript 2.0  Flash Player 6 以上用のSWFパブリッシュで動作 上に書いた「これら7つのムービークリップが存在するフレーム」とは 例えば「obj_0」~「obj_4」をムービーのタイムラインの上レイヤーのフレーム1, 「box_0」~「box_3」をムービーのタイムラインの下レイヤーのフレーム1に作成した場合, 同じムービーのタイムラインの同じフレーム1にスクリプトを書くという意味です。       ↓↓↓  ~ムービーのタイムライン例~  レイヤー3 ・・・|○| ←スクリプトはこのフレームに書く  レイヤー2 ・・・|●| ←例えば「obj_0」~「obj_4」  レイヤー1 ・・・|●| ←例えば「box_0」~「box_3」 スクリプトの内容に関してです。 まず,  // ゴミ箱(box_○)に関するループ  for (var i:Number = 0; i<=3; i++){…} これは for(繰り返しループ)文 です。 何のことかわからない場合は次のページなどを参考にしてみてください。 「繰り返し文 for - FLASHアクションスクリプト入門編」 http://isvalid.jp/actionscriptLab/ASlesson/actionsctipt_for.html 次に,  // 「box_0」~「box_3」内をフレーム1で停止  _root["box_"+i].stop(); で書いたような _root["box_"+i] の [ ] を「配列アクセス演算子」と言います。 使い方や意味などは,そのままを Google で検索してもらえば 説明や参考になるサイトが出てきます。 Google検索「配列アクセス演算子」 http://www.google.co.jp/search?hl=ja&source=hp&q=%E9%85%8D%E5%88%97%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%BC%94%E7%AE%97%E5%AD%90 ○○.onPress=function(){…}; ○○.onRelease=function(){…}; ○○.onRelease=function(){…}; これらのようなものを「イベントハンドラメソッド」と言います。 これも何のことかわからない場合は次のページなどを参考にしてみてください。 「ムービークリップのイベントハンドラ」 http://homepage3.nifty.com/ginga-b/MX/mc_eventhandler.html ムービークリップ.hitTest(○○) これは ムービークリップクラスの接触判定メソッド です。 次のページなどが参考になると思います。 「Flashゲーム講座&ASサンプル集【当たり判定について】」 http://hakuhin.hp.infoseek.co.jp/main/as/hittest.html あと, :Void とか :Number が少し出てきていますが, これは変数や関数の型指定をしているだけで ActionScript 2.0 の場合は特に大きな意味はありません。 デバッグ時にエラーを発見しやすいとか 他人が見たときにその変数が何であるのかがわかりやすいとか その程度のものです。 var i:Number → 変数 i には数値が入りますよ~ function():Void → この関数に戻り値はありませんよ~ というようなことです。 何のことかわからなければ無視しても良いですし, コロン以下を削除してもらっても全く問題はありません。 ※ Void を理解しようにも まず,  「戻り値がある関数とはどういうものか」を理解しない限り,  「戻り値がない関数とは何なのか」は理解できないと思う。  「熱い」がわからなければ「熱くない」がわからない と同様  「明るい」がわからなければ「明るくない」がわからない と同様 ※ ActionScript 3.0 では話が別です。   ActionScript 3.0 の型指定には動作上の意味があります。 === 以下は質問外の補足 ============================= 各オブジェクトのムービークリップは,  // そしてこのオブジェクトを非表示にする  this._visible = false; で非表示にしただけです。 これを  _visible = true にしてやると戻って来ます。 例えば,  「各ゴミ箱をクリックしたときに,   オブジェクトを元の表示状態に戻したい。」 という場合は次のようにスクリプトを書き換えます。 書き換えると言うよりも最後の部分を付け足します。 --------------------------------------------- // ゴミ箱(box_○)に関するループ for (var i:Number = 0; i<=3; i++) { // 「box_0」~「box_3」内をフレーム1で停止 _root["box_"+i].stop(); } // オブジェクト(obj_○)に関するループ for (i=0; i<=4; i++) { // // 「obj_0」~「obj_4」を押したときの動作を定義 _root["obj_"+i].onPress = function():Void { // このムービークリップのドラッグを開始 this.startDrag(); }; // // 「obj_0」~「obj_4」を放したときの動作を定義 _root["obj_"+i].onRelease=_root["obj_"+i].onReleaseOutside=function():Void { // このムービークリップのドラッグを終了 this.stopDrag(); // ゴミ箱(box_○)に関するループ for (i=0; i<=3; i++) { // もしそのときゴミ箱(box_○)がマウスに接触していたら if (_root["box_"+i].hitTest(_root._xmouse, _root._ymouse, true)) { //なおかつそのゴミ箱のフレームが1であれば if (_root["box_"+i]._currentframe == 1) { // そのゴミ箱内のフレームを2に進めて停止 _root["box_"+i].gotoAndStop(2); // そしてこのオブジェクトを非表示にする this._visible = false; } } } }; } // ---以下を付け足し------ // ゴミ箱(box_○)に関するループ for (i=0; i<=3; i++) { // 「box_0」~「box_3」をクリックしたときの動作を定義 _root["box_"+i].onRelease = function():Void { // オブジェクト(obj_○)に関するループ for (i=0; i<=4; i++) { // もしこのゴミ箱がオブジェクト(obj_○)に接触していたら if (this.hitTest(_root["obj_"+i])) { // このゴミ箱内のフレームを1に戻して停止 this.gotoAndStop(1); // そしてその接触しているオブジェクトを表示する _root["obj_"+i]._visible = true; } } }; } ---------------------------------------------  

aldolpho
質問者

お礼

おお~!できました! 完璧です!すばらしいです! こんなに丁寧に、細部まで分かりやすくご説明いただいてありがとうございます! ご回答をいただくまでは1つ1つに延々と動作をつけてがんばってみたのですが、期待した結果が得られず・・・ for文ってすごい! 10年以上前に意味もわからず受けていた Visual C++ の授業をちょっぴり思い出しました いただいたURLを参考にしてしっかり勉強していきたいと思います 本当にありがとうございました!!

関連するQ&A