アプリ版:「スタンプのみでお礼する」機能のリリースについて

Flash8を使っています。

シーン1とシーン2があり、それぞれのレイヤー上にMCが10個程並んでいます。シーンの切り替えはボタンで行います。

シーン1と2で必要なMCを画面上側にある選択領域(choice_MC)にドラッグするのですが、ドラッグ開始と同時にswapDepthsで深度空間に移動させ、シーンが変わっても消えないようになっています。

しかし、2つ問題点があり

● シーンを切り替えると、choice_MC上のMCと同じものが表示されてしまう。

● choice_MC上になくてもドラッグしたMCはシーンを切り替えても表示されてしまう。


解決策として
シーンを切り替えた際、choice_MC上のMCと同じ名前のMCは深度空間に移動させて消去する。

というようなことを考えていましたが、何か良い方法はないでしょうか?
何卒宜しくお願い致します。 

A 回答 (3件)

#1&2 です。


補足(お礼)を読ませていただいたり,ご質問を再読させていただいて,
概容がだいたいつかめました(と思うだけですが)。

次のようにされてはいかがでしょうか?
単なる提案ですよ。


ドラッグする MC(ムービークリップ) が10個あって,5個ずつ表示させるものとします。
10個のMC には,「dr_0」「dr_2」「dr_3」…「dr_9」というインスタンス名を付けたとします。
また,背景である MC1 と MC2 の中には,
それぞれ同じインスタンス名である「idou_btn」というボタンを用意したとします。


--- 階層構造 -----------------------------------
  _root(メインムービー)
    ├ dr_0(ドラッグするMC)
    ├ dr_0(ドラッグするMC)
     … 略 …
    ├ dr_0(ドラッグするMC)
    ├ choice_MC(ドラッグエリアのMC)
    ├ MC1(背景MC)
    │ └ idou_btn(ボタン)
    └ MC2(背景MC)
       └ idou_btn(ボタン)
-----------------------------------------------



--- レイヤー&フレーム構造 -------------------------
 □ レイヤー 筆・・|○| ←スクリプト
 □ レイヤー 筆・・|●| ←ドラッグする MC dr_0 ~ dr_4
 □ レイヤー 筆・・|●| ←ドラッグする MC dr_5 ~ dr_9
 □ レイヤー 筆・・|●| ←choice_MC(ドラッグエリアのMC)
 □ レイヤー 筆・・|●| ←MC1 (背景ムービークリップ1)
 □ レイヤー 筆・・|●| ←MC2 (背景ムービークリップ2)
-----------------------------------------------



スクリプトは,
各MCやボタンには全く書かないものとします。
全ては _root の フレーム1 に
次のように↓書いて各ボタンなどの動作定義をします。


//////////////////////////////////////////////////////
// ムービークリップ dr_0 ~ 9 の動作定義
for (var i = 0; i<=9; i++) {
// onPressでドラッグ開始
_root["dr_"+i].onPress = function() {
this.startDrag();
};
// onReleaseでドラッグ終了
_root["dr_"+i].onRelease = function() {
this.stopDrag();
};
_root["dr_"+i].onReleaseOutside = function() {
this.stopDrag();
};
}
//
// MC1 内のボタン idou_btn の動作定義
_root.MC1.idou_btn.onRelease = function() {
// MC2 を表示
_root.MC2._visible = true;
_root.MC2.gotoAndPlay(1);
// choice_MC との当たり判定で dr_0 ~ 4 の表示非表示を決定
for (i=0; i<=4; i++) {
// もし dr_0 ~ 4 が choice_MC とヒットしていなければ
if (!_root["dr_"+i].hitTest(_root.choice_MC)) {
// その dr_○ を非表示にする
_root["dr_"+i]._visible = false;
}
}
// ムービークリップ dr_5 ~ 9 を表示
for (i=5; i<=9; i++) {
_root["dr_"+i]._visible = true;
}
// MC1 を非表示
_root.MC1._visible = false;
};
//
// MC2 内のボタン idou_btn の動作定義
_root.MC2.idou_btn.onRelease = function() {
// MC1 を表示
_root.MC1._visible = true;
_root.MC1.gotoAndPlay(1);
// choice_MC との当たり判定で dr_5 ~ 9 の表示非表示を決定
for (i=5; i<=9; i++) {
// もし dr_5 ~ 9 が choice_MC とヒットしていなければ
if (!_root["dr_"+i].hitTest(_root.choice_MC)) {
// その dr_○ を非表示にする
_root["dr_"+i]._visible = false;
}
}
// ムービークリップ dr_0 ~ 4 を表示
for (i=0; i<=4; i++) {
_root["dr_"+i]._visible = true;
}
// MC2 を非表示
_root.MC2._visible = false;
};
//
// ムービークリップ dr_5 ~ 9 を非表示
for (i=5; i<=9; i++) {
_root["dr_"+i]._visible = false;
}
//
// MC2 を非表示
_root.MC2._visible = false;
//////////////////////////////////////////////////////



これで一応私の回答の方は完成です。

同じことばかり書き続ける(ドラッグに関して)のも大変ですし,
説明もややこしくなるので,
全てのスクリプトは _root のフレームに書くことにしました。
こういう便利で全体を把握しやすくできるようになったのは,Flash MX 以降です。
MC1 や MC2 内のタイムライン制御などのスクリプトは,
それぞれの MC 内のタイムラインのフレームやムービークリップなどに書いてください。


swapDepths と ドラッグ は,
フレーム移動(シーン移動も含む)と非常に相性が悪いのです。
特に,swapDepths はフレームの逆移動でとんでもないことになります。
つい最近のご質問ですが↓。

「【FLASH】swapDepthsでMCが増殖する??」
http://okwave.jp/qa2679897.html
  ↑教えて!goo  ↓OKWave (同じです)
http://oshiete1.goo.ne.jp/qa2679897.html

ですから,
swapDepths とフレームの移動はできる限り避けたいと思いましたので,
#2 でも フレーム移動をなくしたのです。
そして今回も上記のようにフレーム移動は全くなしというものを考えてみました。

こうしておけば,
swapDepths をする必要もありません。
また,
もし swapDepths をするとしても,
フレームの移動がないので大丈夫です。



少し難しそうだと思われる部分に関する参考URLを書いておきます。

「繰り返し文 for - FLASHアクションスクリプト入門編」
http://isvalid.jp/actionscriptLab/ASlesson/actio …

「ドット演算子と配列アクセス演算子」
http://www.fumiononaka.com/TechNotes/Flash/FN050 …

「インスタンス同士で当たり判定を取る」
http://hakuhin.hp.infoseek.co.jp/main/as/hittest …
 
    • good
    • 0
この回答へのお礼

sassakunさま

「swapDepths と ドラッグ は,フレーム移動(シーン移動も含む)と非常に相性が悪いのです。特に,swapDepths はフレームの逆移動でとんでもないことになります。」

アクションスクリプト初心者の私が言うのも何ですが、前回までのご回答を何度も読み返して、この点については実感致しました。
今までの考え方を白紙に戻してもう一度最初から考えてみようと思っていた矢先、まさか3回目の回答がいただけるとは思いませんでした。
それも動作は完璧です。
今まで、各ボタンやフレーム、MCに散らばっていたスクリプトがこんなにシンプルになるとは・・・。
sassakunさまの力量の深さに、感激しました。

本当に、本当にありがとうございました。
心より感謝いたします。

\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/\(*^▽^*)/

お礼日時:2007/01/24 17:11

#1です。




> on (press) {
> this.swapDepths(_root.depth++);
> this.startDrag();
> }


ですから.....。。。
なぜ,深度を変える必要があるのですか?
#1の回答のようにすると,
シーンをまたぐわけではないので,深度を変えるという変なことはしなくて済むでしょう。


>> 以上のようにすると,
>>
>> > ドラッグ開始と同時にswapDepthsで深度空間に移動させ、
>> > シーンが変わっても消えないようになっています。
>>
>> という工夫も最初から全く不要になります。

と最後に書いていますよね。


> MC1の中に5つほどムービクリップをおき、そのムービクリップがドラッグできるよう

全然#1で書いている意味がわかっていらっしゃらないようです。
MC1 は背景です。MC2 も背景です。

どのような構造になっているのかわからないため,
登場していない物は書けませんが,


 □ レイヤー 筆・・|●| ←ドラッグするムービークリップ
 □ レイヤー 筆・・|●| ←Choice_MC
 □ レイヤー 筆・・|●|← シーン 1 のタイムラインが入った MC
 □ レイヤー 筆・・|●|← シーン 2 のタイムラインが入った MC

こういうことです。

背景が変わるだけでしたら,
シーンの移動も,swapDepths も全く不要でしょう。

ドラッグするムービークリップ は MC1 の中にも,MC2の中にも存在しないので消えません。



======================

あとになってしまい,すみませんが,
上記のこととは無関係で,スクリプトが少し変ですね。


MC1 の中の シーンを切り替えるボタンには
-----------------------------------
on (release) {
_root.MC2._visible = true;
_root.MC2.gotoAndPlay(1);
_root.MC1._visible = false;
}
----------------------------------

MC2 の中の シーンを切り替えるボタンには
----------------------------------
on (release) {
_root.MC1._visible = true;
_root.MC1.gotoAndPlay(1);
_root.MC2._visible = false;
}
----------------------------------

が正解です。

真ん中の行が,
_root.MC2._visible.gotoAndPlay(1);
という意味不明なスクリプトになっていました。
訂正致します。
    • good
    • 0
この回答へのお礼

sassakun さま

度々の回答、本当にありがとうございました。
私の説明不足と理解不足で、何度もご回答をいただくことになり大変申し訳なく思っております。
「背景」をレイヤー上に置かれているムービークリップを含めて考えてしまっていた為、不思議な質問をしてしまいました。

ドラッグするムービクリップが多すぎるという理由でシーンを分けており、背景だけが変わるわけでない、という説明をするべきでした。

回答を読ませていただくと、レイヤー上にMCを置いてシーンを切り替える方法はややこしいようなので、別の方法を考えなくては・・・と思っています。

お礼日時:2007/01/22 00:36

質問者さまの望んでいらっしゃる回答とは違うかもしれませんが,


ご質問にあるような厄介な現象が起こるので,
私なら,シーン移動はさせません。

ドラッグしたいムービークリップはおそらく 深度0 以上にあっても良い物でしょうから,
シーン移動の意味は,
ムービークリップより下のレイヤーの背景の変化のために必要なのだと考えます。


ですから,
ドラッグするムービークリップより下のレイヤーに,
2つのムービークリップを作成して,
シーンを入れ替えるのではなく,
ムービークリップの表示非表示を切り替えます。

つまり,
シーン 1 の背景や,シーン 2 の背景は,それぞれのMC(ムービークリップ)の中に作ってしまします。


 □ レイヤー 筆・・|●| ┐
 □ レイヤー 筆・・|●| │← その他のもの
 □ レイヤー 筆・・|●| ┘
 □ レイヤー 筆・・|●|← シーン 1 のタイムラインが入った MC
 □ レイヤー 筆・・|●|← シーン 2 のタイムラインが入った MC

そして,
シーン 1 のタイムラインが入った MC には,
例えば 「MC1」 というインスタンス名を付け,
シーン 2 のタイムラインが入った MC には,
例えば 「MC2」 というインスタンス名を付けます。

そして,
MC1 の中の シーンを切り替えるボタンには
-----------------------------------
on (release) {
_root.MC2._visible = true;
_root.MC2._visible.gotoAndPlay(1);
_root.MC1._visible = false;
}
----------------------------------

MC2 の中の シーンを切り替えるボタンには
----------------------------------
on (release) {
_root.MC1._visible = true;
_root.MC1._visible.gotoAndPlay(1);
_root.MC2._visible = false;
}
----------------------------------

と書いて,
シーンを切り替えるのではなく,
ムービークリップの _visible プロパティを切り替えます。

_visible プロパティ は表示や非表示というプロパティです。

なお,
最初は表示させたくない MC2 には,
そのムービークリップ自体に,
-------------------------------
onClipEvent (load) {
this._visible = false;
}
-------------------------------

と書いておけば,
最初の最初,
MC1 の何も描いていない隙間から,
MC2 の一部が見えてしまうというような現象も防げます。



以上のようにすると,

> ドラッグ開始と同時にswapDepthsで深度空間に移動させ、
> シーンが変わっても消えないようになっています。

という工夫も最初から全く不要になります。
    • good
    • 0
この回答へのお礼

sassakun さま

「ドラッグしたいムービークリップはおそらく 深度0 以上にあっても良い物でしょうから,シーン移動の意味は,ムービークリップより下のレイヤーの背景の変化のために必要なのだと考えます。」

全くその通りなのです。つたない質問内容でここまで分かっていただき感謝しております。
早速試してみました。MC1の中に5つほどムービクリップをおき、そのムービクリップがドラッグできるよう
on (press) {
this.swapDepths(_root.depth++);
this.startDrag();
}
on (release) {
this.stopDrag();
}
と書きました。
MC1とMC2を切り替えると、ドラッグして深度を上げたはずのクリップが消えてしまいます。Choice_MC上にドラッグしたクリップは残しておきたいのですが・・・。
追加の質問になり、大変申し訳ありませんが、教えていただけると大変助かります。
何卒宜しくお願い致します。

お礼日時:2007/01/21 22:24

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