問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
1 名前:nana 日付:2012/11/06(火)17:48:44 ID:v/+V20TW58A0
はじめまして。いつも参考にさせて頂いています。

Actionnscript3.0で
アクティビティレベル70~100の場合、ムービークリップ(インスタンス名:text)は最速で上下に動き、
アクティビティレベル40~69の場合、ムービークリップはゆっくり上下に動く。
マウスクリックをすると動きが止まる。
といったものを作りたいのですが、アクティビティレベルの指定の仕方とif構文の書き方がわかりません。
また、下記のスクリプトだと音を何度も鳴らすと動きがカクカクしてしまいます。どうすれば解決しますか?
どうか、ご教示お願い致します。

_________________________________________________________________________________________________

// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);

// 無音状態とみなすボリュームのしきい値を設定
mic_obj.setSilenceLevel(50,150);

// アクティビティ検出用のボリュームのしきい値を取得する
trace(mic_obj.silenceLevel);

// 無音状態を検出するまでの時間を取得
trace(mic_obj.silenceTimeout);

//ムービークリップtextの位置指定
text.x=240;
text.y=230;


// アクティビティを検出する
mic_obj.addEventListener(ActivityEvent.ACTIVITY,function(e:ActivityEvent):void{
if(e.activating){
//音量表示
trace("アクティビティレベル:" + mic_obj.activityLevel);
// ムービークリップtextのy移動量
var dy : Number = 30;
text.addEventListener(Event.ENTER_FRAME,function(event){
  // ムービークリップtextを移動
  text.y = text.y+dy;
  // 壁との当たり判定
  if(text.y<55||text.y>115)dy *= -1;
  });

}else{
trace("無音状態");
}
});


// マウスクリック
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{
   text.addEventListener(Event.ENTER_FRAME,function(event){
  // ムービークリップtextを下の位置へ移動
  text.y = 230;
  });

});




2 日付:2012/11/06(火)19:01:58 ID:uqGvQ4UrzKin
アクティビティは、
ユーザーが活動しているか、活動していないかを調べることができます。

ActivityEvent.ACTIVITY イベントは、
「ユーザーがマイクに声を出している」
「ユーザーがマイクに声を出していない」
という2つの状態が切り替わるたびに呼び出されます。

今回は、アクティビティレベルが取得できればいいので、
しきい値の設定や、ActivityEvent.ACTIVITY イベントを使用する必要はなさそうです。
──────────────────────────────────────────────

// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// マイク入力をスピーカから出力する
mic_obj.setLoopBack(true);

// 毎フレーム実行する
stage.addEventListener(Event.ENTER_FRAME,function(e:Event):void{
trace("アクティビティレベル:" + mic_obj.activityLevel);
});
3 名前:nana 日付:2012/11/06(火)19:30:37 ID:v/+V20TW58A0
たびたび申し訳ございません。

マイクからの音ががあるかないかの二択ではなく、マイクからの音量の大きさによって変化するイベントを書きたいです。
例えば、音量が10~20のときは5フレーム目に飛ぶ。
音量が30~40のときは10フレーム目に飛ぶ。
その場合はどう音量を指定し、if構文で書くのかが知りたいのですが、そういったことは可能なのでしょうか?

お手数おかけして申し訳ございませんが、よろしくお願い致します。
4 日付:2012/11/06(火)19:37:41 ID:uqGvQ4UrzKin
こんな感じでしょうか。

>>1 のソースで、MouseEvent.MOUSE_DOWN イベント中に、
匿名関数を使って、Event.ENTER_FRAME イベントの登録を行なっていますが、
マウスボタンを押すたびに、Event.ENTER_FRAME イベントが多重に登録されていくのでご注意下さい。
──────────────────────────────────────────────

// Microphone オブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();

// ムービークリップtextのy移動量
var dy:Number = 0;
// マイクの入力の有無
var input_mic:Boolean = true;


// 符号を取得する関数
function MathSign(v:Number):Number{
return (v > 0) ? 1 : -1;
}

// 毎フレーム実行する
text.addEventListener(Event.ENTER_FRAME,function(e:Event):void{

// マイクの入力が有効の場合
if(input_mic){

// アクティビティレベルを取得
var level:Number = mic_obj.activityLevel;
trace("音量:" + level);

// 70~100 の場合、最速
if(70 <= level){
dy = 30 * MathSign(dy);

// 40~69 の場合、ゆっくり
}else if(40 <= level){
dy = 10 * MathSign(dy);

// その他
}else{
//dy = (level / 40) * 10 * MathSign(dy);
}
}

// ムービークリップtextを移動
text.y = text.y + dy;

// 壁との当たり判定
if(text.y < 55){
text.y = 55;
dy *= -1;
}
if(text.y > 115){
text.y = 115;
dy *= -1;
}
});

// マウスクリック
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent):void{

// マイクの入力を無効化
input_mic = false;

// 速度を 0 に変更
dy = 0;
});
5 日付:2012/11/06(火)19:49:24 ID:uqGvQ4UrzKin
>>3
可能です。
アクティビティの設定は不要で、activityLevel プロパティから音量が取得できます。
Event.ENTER_FRAME イベント中に取得してみると動作確認できます。
6 名前:nana 日付:2012/11/09(金)14:58:47 ID:v/+V20TW58A0
お礼が遅れて申し訳ありませんでした。
お陰様で、無事解決致しました。
有難うございました。
7 名前:状態変更 日付:2012/11/09(金)14:59:30 ID:v/+V20TW58A0
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2012/11/06(火)17:48:44
投稿終了日 :
2012/11/16(金)14:59:34
投稿者 :
nana
レス総数 :
7
スレッド番号 :
99
MondoCollectionSystem ver.0x00020000 by Hakuhin