2011-07-05 82 views
0

這是我的第一篇文章:)。我在c#中有相當多的經驗,在as3中有一點點,在動畫方面也有很多。無論如何要回答這個問題。使用循環在Flash中創建多個動態對象

我正在嘗試在會議中創建閃光燈中麥克風活動的圖形表示。

我得到了一個叫做eqNotch的movieclip,它只是一個矩形,它的鏈接名稱是EqNotch。 我還有一個movieclip,我在第一幀上寫了我的as3,它的名爲dynamicBar和鏈接名稱是DynamicBar。

我已經成功地編寫了dynamicBar的代碼來創建一列eqNotches,並且行數取決於話筒活動。 問題在於:我將一個放在舞臺上,工作正常。但我想放置約25,它只顯示一個。 我試着循環在舞臺上的第一幀上創建動態項目。 我試圖從庫 我試過動態條形碼內循環分別拖動來移動.X依賴於什麼環路是在和裏面那是「而(this.numChildren <浮子){...」

我希望能夠多次重複這個對象的代碼或者其他的東西來達到這個效果。

代碼dynamicBar:

import flash.media.Microphone; 
import flash.events.SampleDataEvent; 
import flash.utils.ByteArray; 

var my_mic:Microphone = Microphone.getMicrophone(); 
my_mic.rate = 22; 
my_mic.gain = 100; 
my_mic.addEventListener(SampleDataEvent.SAMPLE_DATA, drawSampleData); 
var myTimer:Timer = new Timer(20,8); 
myTimer.addEventListener(TimerEvent.TIMER, timerListener); 
var lastData:int; 
var timeRemover; 
var myData:ByteArray; 


function timerListener(e:TimerEvent):void 
{ 
    var currentData:int = 1; 
    var floater:int = 1; 
    try 
    { 
     //currentData = myData.readFloat()*30; 
     currentData = my_mic.activityLevel/5; 
    } 
    catch (e:Error) 
    { 
     currentData = 1; 
    } 


    try 
    { 
     floater = Math.abs(((currentData*3 + lastData)/4)); //- (stage.x/2)) 
    } 
    catch (e:Error) 
    { 
     floater = currentData; 
    } 
    lastData = currentData; 

    if (floater > 20) 
    { 
     floater = 20; 
    } 
    if (floater < 1) 
    { 
     floater = 1; 
    } 
    var numOfCols:int = 5; 
    var j:int; 

    var i:int; 

    while (this.numChildren < floater) 
    { 
     i++; 
     var eqNotch:EqNotch = new EqNotch(); 
     eqNotch.y = i * -10; 
     try 
     { 
      addChild(eqNotch); 
     } 
     catch (e:Error) 
     { 
     } 
    } 
    this.removeChildAt(this.numChildren-1); 
} 

function drawSampleData(eventObject:SampleDataEvent):void 
{ 
    myTimer.start(); 
    myData = eventObject.data; 
} 

UPDATE

好主意亞當,我知道了,雖然,但我無法刪除正確的。 我現在有點過分了,現在我想學習這個經驗。我不得不創建一個數組來記錄每個數組的高度。它會正確添加它們,但不會正確刪除它們。

import flash.media.Microphone; 
    import flash.events.SampleDataEvent; 
import flash.utils.ByteArray; 

var my_mic:Microphone = Microphone.getMicrophone(); 
my_mic.rate = 22; 
my_mic.gain = 100; 
my_mic.addEventListener(SampleDataEvent.SAMPLE_DATA, drawSampleData); 
var myTimer:Timer = new Timer(20,8); 
myTimer.addEventListener(TimerEvent.TIMER, timerListener); 
var lastData:int; 
var timeRemover; 
var myData:ByteArray; 

var numOfCols:int = 25; 
var columns:Array = new Array(); 
/*for (var iLoop:iLoop=0;iLoop<numOfCols;iLoop++){ 
    column[ 
}*/ 



function timerListener(e:TimerEvent):void 
{ 
    var currentData:int = 1; 
    var floater:int = 1; 
    try 
    { 
     //currentData = myData.readFloat()*30; 
     currentData = my_mic.activityLevel/5; 
    } 
    catch (e:Error) 
    { 
     currentData = 1; 
    } 


    try 
    { 
     floater = Math.abs(((currentData*3 + lastData)/4));//- (stage.x/2)) 
    } 
    catch (e:Error) 
    { 
     floater = currentData; 
    } 
    lastData = currentData; 

    if (floater > 20) 
    { 
     floater = 20; 
    } 
    if (floater < 1) 
    { 
     floater = 1; 
    } 

    for(var j:int = 0; j<numOfCols;j++) 
    { 

     var notchDistance:int = j * 30; 
     if(columns[j]==null){ 
      columns[j]=0; 
     } 
     while (int(columns[j]) <= floater) 
     { 
      var eqNotch:EqNotch = new EqNotch(); 
      eqNotch.x = notchDistance; 
      eqNotch.y = int(columns[j]) * -7; 
      addChild(eqNotch); 
      columns[j]++; 
     } 
     if(int(columns[j]) >= floater){ 
     columns[j]--; 
     this.removeChildAt(int(columns[j])*(j+1)-1-j); 
     trace("height"+columns[j]+"col"+j); 
     } 
    } 
} 

function drawSampleData(eventObject:SampleDataEvent):void 
{ 
    myTimer.start(); 
    myData = eventObject.data; 
} 
+0

它看起來並不像*列*陣列被設置在任何地方。 –

+0

當一個列被創建時它的設置爲零,如果它爲null,那麼它的++或 - 取決於添加或刪除。 – MrJD

+1

哦,是的,我明白了。好吧,你好像過於複雜了。像EqNotch對象一樣創建和銷燬對象非常昂貴。我會建議只創建所有凹槽,並根據需要打開/關閉可見屬性。 –

回答

1

明白了。

以爲我可能也與社會各界分享:)

import flash.media.Microphone; 
import flash.events.SampleDataEvent; 
import flash.utils.ByteArray; 

var my_mic:Microphone = Microphone.getMicrophone(); 
my_mic.rate = 22; 
my_mic.gain = 100; 
my_mic.addEventListener(SampleDataEvent.SAMPLE_DATA, drawSampleData); 
var myTimer:Timer = new Timer(20,8); 
myTimer.addEventListener(TimerEvent.TIMER, timerListener); 
var lastData:int; 
var timeRemover; 
var myData:ByteArray; 

var numOfCols:int = 25; 
var columns:Array = new Array(); 
/*for (var iLoop:iLoop=0;iLoop<numOfCols;iLoop++){ 
    column[ 
}*/ 



function timerListener(e:TimerEvent):void 
{ 
    var currentData:int = 1; 
    var floater:int = 1; 
    try 
    { 
     //currentData = myData.readFloat()*30; 
     currentData = my_mic.activityLevel/5; 
    } 
    catch (e:Error) 
    { 
     currentData = 1; 
    } 


    try 
    { 
     floater = Math.abs(((currentData*3 + lastData)/4));//- (stage.x/2)) 
    } 
    catch (e:Error) 
    { 
     floater = currentData; 
    } 
    lastData = currentData; 

    if (floater > 20) 
    { 
     floater = 20; 
    } 
    if (floater < 1) 
    { 
     floater = 1; 
    } 

    for(var j:int = 0; j<numOfCols;j++) 
    { 

     var notchDistance:int = j * 30; 
     if(columns[j]==null){ 
      columns[j]=0; 
     } 
     while (int(columns[j]) <= floater) 
     { 
      var eqNotch:EqNotch = new EqNotch(); 
      eqNotch.x = notchDistance; 
      eqNotch.y = int(columns[j]) * -7; 
      addChild(eqNotch); 
      columns[j]++; 

     } 
     if(int(columns[j]) >= floater){ 
     columns[j]--; 
     this.removeChildAt((int(columns[j])*j)+((j+1)*(int(columns[j])-1))); 
     trace("height"+columns[j]+"col"+j); 

     } 
    } 
} 

function drawSampleData(eventObject:SampleDataEvent):void 
{ 
    myTimer.start(); 
    myData = eventObject.data; 
} 
3

我可能只是在init中生成所有「notches」,然後根據需要打開/關閉可見性。也許是這樣的:

const numNotches:int = 20; 

var floater:int = 0; // Value of volume from 0-20 
var notches:Array; 

initNotches(); 

function initNotches():void 
{ 
    for (var i:int = 0; i < numNotches; i++) 
    { 
     var newNotch:EqNotch = new EqNotch(); 
     newNotch.y = i * -10; 
     newNotch.visible = false; 
     addChild(newNotch); 
     notches[i] = newNotch; // Add newly created EqNotch to the notches array, in position. 
    } 
} 

function dataUpdated():void 
{ 
    floater = ;// Set floater based on data, and bound it between 0-20. 

    for (var i:int = 0; i < numNotches; i++) 
    { 
     var notch:EqNotch = notches[i] as EqNotch; 
     notch.visible = (i < floater); // Show or hide notch based on volume level. 
    } 
} 

這將是基本的想法,但你需要落實到你的代碼。

+0

嘿亞當,請檢查我的更新 – MrJD