プロが教える店舗&オフィスのセキュリティ対策術

actionscript初心者です(1.0か2.0)
flashは CS4 を使ってます

ステージにいくつかのオブジェクトと、3つの箱がある

任意のオブジェクトを1つドラッグして、任意の箱にドロップ

箱がふくらむ
※1つの箱に入るオブジェクトは1つまで

といった感じのflashを作りたいのです
オブジェクトのドラッグはなんとか書けますが、
箱の上でオブジェクトが消え、箱がふくらんだ箱に変わるところなどがわかりません・・・
いいサンプルなどご存知でしたら教えてください!

A 回答 (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/actio …


次に,

 // 「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 …


○○.onPress=function(){…};
○○.onRelease=function(){…};
○○.onRelease=function(){…};
これらのようなものを「イベントハンドラメソッド」と言います。
これも何のことかわからない場合は次のページなどを参考にしてみてください。
「ムービークリップのイベントハンドラ」
http://homepage3.nifty.com/ginga-b/MX/mc_eventha …


ムービークリップ.hitTest(○○)
これは ムービークリップクラスの接触判定メソッド です。
次のページなどが参考になると思います。
「Flashゲーム講座&ASサンプル集【当たり判定について】」
http://hakuhin.hp.infoseek.co.jp/main/as/hittest …


あと,
: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;
}
}
};
}
---------------------------------------------
 
「ゴミ箱のようなflashを作りたい」の回答画像1
    • good
    • 0
この回答へのお礼

おお~!できました!
完璧です!すばらしいです!
こんなに丁寧に、細部まで分かりやすくご説明いただいてありがとうございます!

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

お礼日時:2009/10/23 15:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!