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

当たり判定で、下記の様に書きました。
I_blueは青ボールインスタンス名、I_green 緑ボール インスタンス名です。
緑ボールをドラッグ&ドロップで青ボールに重ねると音がでるというものを作ろうとしています。

//
Hsound01 = new Sound(_root.I_blue);
Hsound01.attachSound("HS_sound01");
//
_root.I_blue.onEnterFrame = function() {
if (this.hitTest(_root.I_green)) {
_root.Hsound01.start(0, 1);
}
};
//
I_green.onPress = function(){
startDrag(this,false);
}
I_green.onRelease = function(){
stopDrag();
}

ですが、これだと音が繰り返し再生されてしまいます。
当たり判定で一度だけ音をならすには、どのようにすべきでしょうか。
お知恵をお貸しいただけたらと思います。
よろしくお願いします。

A 回答 (2件)

イベント(アクション)の発生が,



> ドラッグ&ドロップで青ボールに重ねると

なのですから,
そもそも onEnterFrame をトリガ(引き金(この場合は監視の役目も含む))とすることが変だと思いますよ。
もっと素直に,そのまま,
「ドラッグ& "ドロップ" で青ボールに重ねると」→「音を鳴らす」
の方が,onEnterFrame で無駄な CPU を毎フレーム使い続けるより,ずっと良いと思います。

つまり,こういうことです↓。

---------------------------------------
Hsound01 = new Sound(_root.I_blue);
Hsound01.attachSound("HS_sound01");
//
I_green.onPress = function() {
startDrag(this);
};
//
I_green.onRelease = function() {
// 青が これ(緑)にヒットしたら
if (_root.I_blue.hitTest(this)) {
_root.Hsound01.start(0, 1);
}
stopDrag();
};
---------------------------------------


※if (_root.I_blue.hitTest(this))
  は,
  if (.this.hitTest(_root.I_blue))
  の方が自然です。
  一応,ご質問のスクリプトに書かれている,
  if (this.hitTest(_root.I_green))
  を尊重して,あえて逆にしています。



> 当たり判定で一度だけ音をならすには…

この「一度だけ」の意味が,
「一回目のドラッグ&ドロップで青ボールに重ねたときに鳴らすだけで,二回目以降は鳴らさない」
という意味でしたら,#1の方の書かれている フラグを使う方法が良いと思います。

---------------------------------------
Hsound01 = new Sound(_root.I_blue);
Hsound01.attachSound("HS_sound01");
// 勝手に決めた変数 flag に 0 を代入
flag = 0;
//
I_green.onPress = function() {
startDrag(this);
};
//
I_green.onRelease = function() {
// 青が これ(緑)にヒットして なおかつ flag が 0 のとき
if (_root.I_blue.hitTest(this) && flag == 0) {
_root.Hsound01.start(0, 1);
flag = 1;
}
stopDrag();
};
---------------------------------------


onEnterFrame や onClipEvent (enterFrame) は,
毎フレーム毎フレーム同じ処理を繰りかえし実行します。
hitTest などの説明するためにはこれらを使うことも良い方法ですが,
実際にご質問にあるような内容のときには極力使わないようにしましょう。
    • good
    • 0
この回答へのお礼

sassakunさん、書き込みありがとうございます。

うっかりしていました(汗)。そうですね。ご紹介のかたちの方がシンプルで明快ですね。しかも負荷も軽い。D&Dではこちらを使うべきなのですね。実はD&Dの場合と 動いているMCの場合の 二つがでてくるものをつくっていまして、使い分けが必要なのですね。
sassakunさんの書き込みから、より深く理解できた気がします。

大変勉強になりました。
書き込みいただきありがとうございました。

お礼日時:2007/03/21 11:59

onEnterFrame の処理は毎フレームで呼ばれてしまいます。


このコードだと重なっている間(hitTestがtrueの間)ずっと
音の再生が呼び出されます。
簡単にやるなら、何か適当なフラグを用意して
---------------------------------------------------------
// 初回フラグ。trueで初期化しておく
var bFirst:Boolean = true;

_root.I_blue.onEnterFrame = function() {
if (this.hitTest(_root.I_green)) {
// 重なっているとき
if(bFirst) {
// はじめて重なったとき
_root.Hsound01.start(0, 1);
bFirst = false;
}
} else {
// 重なっていないとき
// フラグを戻す。
// 次に重なったときにまた音が再生される
bFirst = true;
}
};
---------------------------------------------------------
な感じでいけるかと思います。
実際にこのコード動かしてないんであまり自信ないです...(^^;
    • good
    • 0
この回答へのお礼

horsewaterさん、書き込みありがとうございます。

ご紹介のかたちでできる様になりました。
変数を使用してみて、試してはいたのですが、上手くできずにいたのですが、ご紹介の方法で「なるほど」という感じでできました。

大変たすかりました。
書き込みありがとうございました。

お礼日時:2007/03/21 11:49

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