Создать несколько динамических объектов во флэш-памяти с помощью цикла - PullRequest
0 голосов
/ 05 июля 2011

Это мой первый пост за всю историю :).У меня достаточно опыта в c #, немного в as3 и много в анимации.Во всяком случае на вопрос.

Я пытаюсь создать графическое представление активности микрофона во флэш-памяти для конференции.

Я получил видеоклип с именем eqNotch, который представляет собой просто прямоугольник, и его имя связи - EqNotch.У меня также есть мувиклип, в котором я записываю свой as3 в первый кадр, он называется dynamicBar, а имя связывания - DynamicBar.

Я успешно написал код для dynamicBar для создания одного столбца eqNotches и числастрок зависит от активности микрофона.Здесь возникает проблема: я ставлю один на сцену, работает нормально.но я хочу разместить около 25, и он отображает только один.Я пробовал циклы, создавая динамические элементы в первом кадре на сцене.Я пытался перетаскивать отдельно от библиотеки, я пытался зацикливаться внутри динамического штрих-кода, чтобы переместить .x в зависимости от того, в каком цикле он был, и внутри, который был "while (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;
}

ОБНОВЛЕНИЕ

Отличная идея, Адам, я понял, но у меня возникли проблемы с удалением правильных.Сейчас я слишком далеко, чтобы бросить курить, и я хочу научиться этому для опыта.

Мне пришлось создать массив для записи высоты каждого из них.Он добавляет их правильно, но не удаляет их правильно.

    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;
}

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Я бы, вероятно, просто сгенерировал бы все ваши "метки" при инициализации, а затем включил бы / выключил видимость при необходимости.Может быть, что-то вроде этого:

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.
    }
}

Это было бы основной идеей, но вам нужно будет внедрить ее в свой код.

1 голос
/ 25 июля 2011

Понял.

Думаю, я тоже могу поделиться этим с сообществом:)

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;
}
...