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

 今回もまたFlashのことで教えてください。
先日教えていただいた「ドラッグしたMCを常に上に表示&色の変化」がきちんと動作できて
とても助かりましたが、また、新たな課題が出たので教えて下さい。(これまでできていたリセットボタンがうまく動作しなくなっちゃったのです。)
具体的に言うと、つまずいている課題は以下の通りです。

 ドラッグして移動したMCを元の位置(フレーム上の最初にあった位置)に戻すために「リセットボタン」を配置しましたが、このボタンでリセットしてもなぜかドラッグして移動したMCもそのまま残った状態で表示されるのです。つまり、完全リセットされないのです。

 ドラッグしたMCが元の位置に戻り、ドラッグする以前のフレームが表示されるようにしたいのでどうか教えてください。


私が書いたスクリプトとタイムラインを示しますので、どうぞよろしくお願いいたします。

バージョン Flash CS5.5    アクションスクリプト2.0     Flash Player 6 です。  


フレーム1とフレーム2があり、フレーム1はフレーム2に進むためのボタンを配置。
フレーム2には赤の□2つ。白の□2つを配置。
フレーム2に書いたスクリプト(1)は以下の通り
(ドラッグしたMCが常に上に表示&色の変化をさせるスクリプト)
(赤の□のインスタンス名「R_mc1」「R_mc2」   白の□のインスタンス名「W_mc1」「W_mc2」 )


//---------------------------
//深度カウント用変数を用意
var dep_cnt:Number = 1;

//変数 i に 1~2 を入れながらループ
for (var i:Number = 1; i<=2; i++) {
//★「R_mc○」内の再生を停止
this["R_mc"+i].stop();
//★「R_mc○」内の変数 target_mc に「W_mc○」の参照を代入
this["R_mc"+i].target_mc = this["W_mc"+i];
//「R_mc○」押下時に関数 dragMC を実行
this["R_mc"+i].onPress = dragMC;
//「R_mc○」を放した時に関数 dropMC を実行
this["R_mc"+i].onRelease = dropMC;
//「R_mc○」をMC外で放した時にも関数 dropMC を実行
this["R_mc"+i].onReleaseOutside = dropMC;
}

//関数 dragMC の定義
function dragMC():Void {
//深度カウント用変数をカウントアップ
dep_cnt++;
//押下されたMCをその深度に移動
this.swapDepths(dep_cnt);
//押下されたMCのドラッグを開始
this.startDrag();
//★マウスが動く度に関数 watchHitW_mc を実行
this.onMouseMove = watchHitW_mc;
}

//関数 dropMC の定義
function dropMC():Void {
//放されたMCのドラッグを終了
this.stopDrag();
//★マウスが動く度に関数 watchHitW_mc を実行するのを解除
delete this.onMouseMove;
}

//★関数 watchHitW_mc の定義
function watchHitW_mc():Void {
//★ドラッグ中のMCがそのMC内の変数 target_mc に
// 代入したMCとヒットしていれば
if (this.hitTest(this.target_mc)) {
//★ドラッグ中のMC内をフレーム2で停止
this.gotoAndStop(2);
} else {
//★それ以外はドラッグ中のMC内をフレーム1で停止
this.gotoAndStop(1);
}
}
//---------------------------


ドラッグしたMCを元の位置に戻すための「リセットボタン」に書いたスクリプト(2)は以下の通り。
(以前に以下のようなスクリプトで元の配置にリセットされたので同じく書いてみましたが、今回はドラッグしたMCが消えず、そのまま表示されてしまいました。


//---------------------------

on (release) {
gotoAndPlay(1);

}
on (release) {
gotoAndStop(2);

}

//---------------------------


 

「FlashでドラッグしたMCをリセットし」の質問画像

A 回答 (1件)

ご質問で書かれていらっしゃるように



「フレーム移動を使う」&
「極力現在のスクリプトやそれを書く場所を変えない」

という条件でしたら,
リセットボタンに書かれたスクリプトのみを
単純に次のように修正すれば良いと思います。


//------------------
on (release) {
//変数 i に 1~2 を入れながらループ
for (i=1; i<=2; i++) {
//「R_mc○」を削除
this["R_mc"+i].removeMovieClip();
}
gotoAndStop(1);
gotoAndStop(2);
}

//------------------


レイヤーに配置した MC を swapDepths() すると
レイヤーとの結びつきが消えて宙に浮きます。

フレーム移動をさせて
またその MC が出没したフレームに戻すと
レイヤーに結びついた MC が再び現れて
宙に浮いた MC と共存してしまいます。

それらの MC を共存させたくない場合は
宙に浮いた MC を消してやれば良いでしょう。

その MC を消すメソッドが
removeMovieClip() です。

なお
removeMovieClip() では
レイヤーに結びついた MC つまり
手動で配置した MC は消えません。

removeMovieClip() では
ActionScript で生成や配置した MC や
swapDepths() で宙に浮いた MC のみを消すことができます。



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

しかし...
そもそもフレーム移動などが要る状況なのでしょうか?

もし,フレーム移動させる必要がないのであれば
私でしたらメインのタイムラインをフレーム1のみにして
さらにリセットボタン自体に書いたスクリプトは全て消して
そしてそのボタンには例えば「reset_btn」というインスタンス名を付けて
フレームに書くスクリプトを次のようにしますけどね↓。



//---------------------------
//深度カウント用変数を用意
var dep_cnt:Number = 1;

//変数 i に 1~2 を入れながらループ
for (var i:Number = 1; i<=2; i++) {
//★「R_mc○」内の再生を停止
this["R_mc"+i].stop();
//★「R_mc○」内の変数 target_mc に「W_mc○」の参照を代入
this["R_mc"+i].target_mc = this["W_mc"+i];
//◆「R_mc○」内の変数 start_x に「R_mc○」自身の初期x座標を代入
this["R_mc"+i].start_x = this["R_mc"+i]._x;
//◆「R_mc○」内の変数 start_y に「R_mc○」自身の初期y座標を代入
this["R_mc"+i].start_y = this["R_mc"+i]._y;
//「R_mc○」押下時に関数 dragMC を実行
this["R_mc"+i].onPress = dragMC;
//「R_mc○」を放した時に関数 dropMC を実行
this["R_mc"+i].onRelease = dropMC;
//「R_mc○」をMC外で放した時にも関数 dropMC を実行
this["R_mc"+i].onReleaseOutside = dropMC;
}

//関数 dragMC の定義
function dragMC():Void {
//深度カウント用変数をカウントアップ
dep_cnt++;
//押下されたMCをその深度に移動
this.swapDepths(dep_cnt);
//押下されたMCのドラッグを開始
this.startDrag();
//★マウスが動く度に関数 watchHitW_mc を実行
this.onMouseMove = watchHitW_mc;
}

//関数 dropMC の定義
function dropMC():Void {
//放されたMCのドラッグを終了
this.stopDrag();
//★マウスが動く度に関数 watchHitW_mc を実行するのを解除
delete this.onMouseMove;
}

//★関数 watchHitW_mc の定義
function watchHitW_mc():Void {
//★ドラッグ中のMCがそのMC内の変数 target_mc に
// 代入したMCとヒットしていれば
if (this.hitTest(this.target_mc)) {
//★ドラッグ中のMC内をフレーム2で停止
this.gotoAndStop(2);
} else {
//★それ以外はドラッグ中のMC内をフレーム1で停止
this.gotoAndStop(1);
}
}

//◆「reset_btn」クリック時に実行するメソッドの定義
reset_btn.onRelease = function():Void {
//◆変数 i に 1~2 を入れながらループ
for (i=1; i<=2; i++) {
//◆「R_mc○」内の再生をフレーム1で停止
this._parent["R_mc"+i].gotoAndStop(1);
//◆「R_mc○」の x座標 を R_mc○.start_x に戻す
this._parent["R_mc"+i]._x = this._parent["R_mc"+i].start_x;
//◆「R_mc○」の y座標 を R_mc○.start_y に戻す
this._parent["R_mc"+i]._y = this._parent["R_mc"+i].start_y;
}
};
//---------------------------



注釈行に◆を入れたところが,付け足し部分です。


「R_mc○」の初期座標は
この場合特に「R_mc○」自身内の変数に代入保存する必要はありません。

前回までのスクリプトで,
「R_mc○」内の変数に「W_mc○」の参照を保存したので
それに合わせているだけです。

MC の外(メインのタイムラインなど)に勝手な変数でも作って
その変数に初期座標を代入保存でも良いですし
また,
座標保存用の配列でも作って
その配列の要素に初期座標を代入保存しても良いです。




 
フレーム移動をさせない場合の作成状態の図↓
「FlashでドラッグしたMCをリセットし」の回答画像1
    • good
    • 0
この回答へのお礼

BlurFiltanさん、今回も本当にありがとうございました。
リセットボタンにスクリプトをつけることしか方法を見つけられない私が、そこでつまづいてしまって
またまたBlurFiltanさんにお世話になってしましました。
1つクリアしたら、また新たにつまづいて・・・の繰り返しの私に、いつもご丁寧に対応してくださる
BlurFiltanさんに本当に感謝感謝です。
またkochachaだってお思いでしょうが、毎回わかりやすくご回答してくださり、すごくありがたいです。
本当にありがとうございましたm(__)m
また、よろしくおねがいいたします(^.^)

お礼日時:2013/08/01 21:28

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