問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
1 名前:nana 日付:2013/01/05(土)13:04:12 ID:v/+V20TW58A0
毎回参考にさせて頂いています。
前回、マイクの音量に対応するMCの動きに関して質問した者です。お世話になりました。

今回は、マイクから取得した音量が60~100の場合、今いるフレームから、1つ次のフレームへいき、
音量が35~59の場合、今いるフレームから、1つ前のフレームへいく
というプログラムが書きたいのですが、
フレームの移動がまったくできていません。
どうすれば、解決することができるかご教示お願い致します。

環境:
ASファイル
Flash5.5


--------------------------------------------------------------------------------------------------------------------
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.system.*;
import flash.media.*;

public class AnalogInput01 extends Sprite {

public function AnalogInput01() {

//マイクの生成
var mic:Microphone=Microphone.getMicrophone();
//マイク入力の有無
var input_mic:Boolean = true;
//マイク設定パネル
Security.showSettings(SecurityPanel.MICROPHONE);


//ムービークリップtextboxの初期位置
textbox.x=565;
textbox.y=280;
//ムービークリップtextboxのy移動量
var dy:Number = 0;

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

if(mic!=null){
//マイク入力をスピーカーへ出力
mic.setLoopBack(true);
//textboxが音に反応して揺れる
addEventListener(Event.ENTER_FRAME, textbox_FRAME);

}


 function textbox_FRAME(e:Event):void {
//マイクの入力が有効の場合
if(input_mic){
// アクティビティレベルを取得
var level:Number = mic.activityLevel;
trace("音量:" + level);
// 60~100 の場合、最速
if(60 <= level){
this.nextFrame();
// 35~59 の場合、ゆっくり
}else if(35 <= level){
this.prevFrame();
}else{
//dy = (level / 40) * 10 * MathSign(dy);
}
}

// ムービークリップtextboxを移動
textbox.y = textbox.y + dy;
// 壁との当たり判定
if(textbox.y<260||textbox.y>280){
dy *= -1;
}
//クリックでムービークリップtextboxの揺れを止める
addEventListener(MouseEvent.MOUSE_DOWN, textbox_stop);
function textbox_stop(event:MouseEvent):void {
//速度を0に変更
dy = 0;
textbox.y = 280;

}


}


}
}
}
2 日付:2013/01/05(土)13:28:23 ID:v/+V20TW58A0
申し訳ございません。
脱字がありましたので、補足致します。
環境:Flash CS5.5です。
3 日付:2013/01/05(土)17:25:16 ID:uqGvQ4UrzKin
エラーが出てますね。

───────────────────────────
package {
import flash.display.*;
import flash.events.*;

public class AnalogInput01 extends Sprite {
public function AnalogInput01() {
trace(this);

function textbox_FRAME():void{
trace(this);
}
textbox_FRAME();
}
}
}
───────────────────────────
textbox_FRAME 関数内の this は、
AnalogInput01 オブジェクトではなく [object global] と表示されます。



リファレンスです。

http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/Function.html
>バインドメソッドの場合、this キーワードで、メソッドの実装元オブジェクトを指します。
>関数については、this で、関数が呼び出されたときの関連オブジェクトを指します。

global というのがよくわかりませんが、
どこから呼び出したかで、 this のアクセス先が変わるみたいですね。
───────────────────────────
package {
import flash.display.*;
import flash.events.*;

public class AnalogInput01 extends Sprite {
public function AnalogInput01() {

function TestFunc():void{
trace(this);
}

// そのまま実行 → [object global]
TestFunc();

// オブジェクトから関数実行 → [object Object]
var o:Object = new Object();
o.f = TestFunc;
o.f();

// ムービークリップから関数実行 → [object MovieClip]
var m:MovieClip = new MovieClip();
o = m as Object;
o.f = TestFunc;
o.f();
}
}
}
───────────────────────────
4 日付:2013/01/05(土)17:28:54 ID:uqGvQ4UrzKin
イベントリスナーに登録した関数の中から、
イベントの登録元となるオブジェクトを取得したい場合、
Event クラスの currentTarget プロパティを使用します。

AnalogInput01 クラスは、Sprite クラスから派生していますが、
prevFrame() メソッドが存在するのは、MovieClip クラスなので、extends MovieClip となります。
───────────────────────────
package {
import flash.display.*;
import flash.events.*;

public class AnalogInput01 extends MovieClip {
public function AnalogInput01() {

addEventListener(Event.ENTER_FRAME, textbox_FRAME);

 function textbox_FRAME(e:Event):void {
e.currentTarget.prevFrame();
}
}
}
}
───────────────────────────



コンストラクタ内のローカル関数ではなく、
AnalogInput01 クラスの、プライベートなメソッドにすれば
this でもアクセスできます。
───────────────────────────
package {
import flash.display.*;
import flash.events.*;

public class AnalogInput01 extends MovieClip {
public function AnalogInput01() {
addEventListener(Event.ENTER_FRAME, textbox_FRAME);
}

private function textbox_FRAME(e:Event):void {
this.prevFrame();
}
}
}
───────────────────────────
5 名前:nana 日付:2013/01/08(火)16:23:45 ID:v/+V20TW58A0
上記のスクリプトを参考にし、書き換えてみたら解決致しました。
有難うございました。
6 名前:状態変更 日付:2013/01/08(火)16:24:55 ID:v/+V20TW58A0
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2013/01/05(土)13:04:12
投稿終了日 :
2013/01/15(火)16:24:56
投稿者 :
nana
レス総数 :
6
スレッド番号 :
106
MondoCollectionSystem ver.0x00020000 by Hakuhin