【问题标题】:Trying to access the first instance of an array in Actionscript 3尝试访问 Actionscript 3 中数组的第一个实例
【发布时间】:2015-02-14 05:53:37
【问题描述】:

我正在尝试在 actionscript 3 中进行死亡检测。我的想法是在 x 轴上创建一个点数组(MovieClips),它代表频谱,SoundMixer.computeSpectrum(bytes, true, 0);设置为真。如何访问我的数组的第一个点实例。然后我想检查它在每个当前帧上的最大值,并根据最后一个值进行测量。我想我需要设置一个阈值,当该值在阈值范围内时,就叫它节拍....我迷路了,谁能指出我正确的方向..

提前致谢。

var snd: Sound = new Sound();
var req: URLRequest = new URLRequest("mySong.mp3");
snd.load(req);

var channel: SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

const CHANNEL_LENGTH: int = 256;
const BUFFER_LENGTH: int = 512;
var dot:Dot;

dot.cacheAsBitmap = true;
var myArray:Array = new Array();
var bytes:ByteArray = new ByteArray();

function onEnterFrame(event: Event): void 
{

  SoundMixer.computeSpectrum(bytes, true, 0);


   for (var i:int = 0; i < CHANNEL_LENGTH; i+=8) // channel_length = 256
   {


     var sampleValue:Number = bytes.readFloat();
     dot = new Dot();
     dot.x = i * 2;
     dot.y = sampleValue * 250; //50 + (i * 30)
     addChild(dot);
     myArray.push(dot);
   }

}

【问题讨论】:

  • 你要不要myArray[0]
  • 嗨,Marty...我确实尝试过,但似乎没有用。我会再试一次。当我执行 myArray.length 时,它会返回 1 或 0 .. 这似乎不对。 myArray.length 不应该还给我 256 吗?感谢您的回复。我会在靠近后立即回复。

标签: arrays actionscript-3 beat-detection


【解决方案1】:

我不确定你要做什么。

但是如果你想做一个声谱可视化器,我认为你的方向是对的。

我按照你的做法得到这样的结果:(http://www.imageupload.co.uk/5M3n) 那些点会随着音乐起舞

只需将dot.cacheAsBitmap = true; 移动到dot = new Dot(); 之后,或者您可以将其移除。

在 Dot 类中,不要忘记在一段时间后自行处理。

但实际上我根本不需要使用myArray

这是我的代码:

import flash.events.Event;

var snd: Sound = new Sound();
var req: URLRequest = new URLRequest("mySong.mp3");
snd.load(req);

var channel: SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

const CHANNEL_LENGTH: int = 256;
const BUFFER_LENGTH: int = 512;
var dot:Dot;

var myArray:Array;
var bytes:ByteArray = new ByteArray();

function onEnterFrame(event: Event): void 
{

  SoundMixer.computeSpectrum(bytes, true, 0);
  myArray = [];

   for (var i:int = 0; i < CHANNEL_LENGTH; i+=8) // channel_length = 256
   {


     var sampleValue:Number = bytes.readFloat();
     dot = new Dot();
     dot.cacheAsBitmap = true;
     dot.x = i * 2;
     dot.y = sampleValue * stage.StageHeight;
     addChild(dot);
     myArray.push(dot);
   }
   var firstElement:Dot = myArray.length>0?myArray[0]:null;
   if(firstElement)
   {
      handleWithFirstElement(firstElement);
   }
}

function onPlaybackComplete(e:Event):void
{
    removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}

function handleWithFirstElement(ele:Dot):void
{
   //your code
}

在 Dot 类中:

flash.utils.setTimeout(this.parent.removeChild, 100, this);
// Run this just after added on Stage

【讨论】:

  • 您好,感谢您的回复。我使用数组的原因是我可以定位第一个点(实例)。当 computeSpectrum 设置为 true 时,第一个实例应该代表低频。我需要以这个实例为目标,在其高点测量它的值并将其与之前的值进行比较。我希望这将构成一个节拍。另外,我无法让动画移动到舞台底部。更改 .y 值没有任何作用。 @Marty....还是迷路了。谢谢大家
  • 我已经编辑了答案,引入了一个数组来存储点。不要忘记在您的 enterframe 事件开始时清理 myArray。此外,将 250 更改为 stage.StageHeight 可以帮助您解决关于移动到舞台底部的问题吗?是不是你脑海中的画面?
  • 你好。感谢您的帮助,非常感谢。这段代码运行良好。有趣的是,当我将代码更改为 samplevalue * stage.stageHeight 时,图形并没有移动到页面底部。再次感谢所有帮助。
  • 你的意思是dot.y = (1 - sampleValue) * stage.StageHeight; ?
猜你喜欢
  • 2012-04-06
  • 2023-03-15
  • 2013-06-21
  • 1970-01-01
  • 2011-10-19
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
相关资源
最近更新 更多