レス数:6 / 状態:解決済み / No:106 / ATOM
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;
}
}
}
}
}
前回、マイクの音量に対応する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です。
脱字がありましたので、補足致します。
環境: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();
}
}
}
───────────────────────────
───────────────────────────
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();
}
}
}
───────────────────────────
イベントの登録元となるオブジェクトを取得したい場合、
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 |