Данные массива теряются за пределами функции загрузчика - PullRequest
0 голосов
/ 04 ноября 2011

Попытка сделать вопрос на основе сетки ответом на игру и загрузить переменные из текстового файла, используя циклы for в массив Я хотел уменьшить избыточный код и использовать циклы for для заполнения моих массивов. У меня проблема с потерями / уничтожением массивов вне функции загрузчика.

Я понимаю, что если массив объявлен внутри функции, естественно, массив будет уничтожен при выходе из функции. Однако я объявляю массивы вне функции, поэтому массивы должны оставаться неизменными после выхода из функции.

Что мне здесь не хватает?

Кстати - у меня нет проблем с загрузкой данных. Данные загружаются правильно. Массив просто уничтожается после загрузки данных.

//Create the arrays to hold the 
//categories, questions, and answers
var categoryArray:Array = new Array();      
var quesAnswArray:Array = new Array(); 

//create the loader
var loader:URLLoader = new URLLoader();

//telling the loader that we are dealing with variables here.  
loader.dataFormat = URLLoaderDataFormat.VARIABLES;  

//This is an eventlistener, these are used all the time in AS3  
//learn to use them, this basically tells flash to listen to a specific event  
//and then call a specific function.  
//in Our case we listen for the event called COMPLETE which means it will active  
//a function called "loading" when our flash movie has completed loading  
loader.addEventListener(Event.COMPLETE, loading);  

//Here we tell our loading which file to read our categories and questions from.  
loader.load(new URLRequest("questions.txt"));  

//This is the function that will happen when the eventlistener activates.  
//basically it says that our text fields called content_1 and _2's text property  
//should be equal to loader.data.var_1 and var_2 (as you might remember from the     explanation above).  
function loading (event:Event):void{  

     //loading bar
     var total:Number = this.stage.loaderInfo.bytesTotal;
     var loaded:Number = this.stage.loaderInfo.bytesLoaded;

     bar_mc.scaleX = loaded/total;
     loader_txt.text = Math.floor((loaded/total)*100)+ "%";

    var varText:URLVariables = new URLVariables(event.target.data);
    //populate the category array with the value from the file.
    for (var category:int=0; category<13; category++)
        {
            this["cat"+category] = varText["var_" + [category+1]];
            categoryArray.push(this["cat"+category]);
        }
     //populate the two demensional array of questions and answers. 
         //columns
     for (var cols:int=0; cols<12; cols++){
            //rows
            for (var rows:int=0; rows<5; rows++){
                 this["q"+rows] = varText["var_c"+[cols+1]+"q"+[rows+1]];
                 this["a"+rows] = varText["var_c"+[cols+1]+"a"+[rows+1]];
                 quesAnswArray.push(new Array());
                 quesAnswArray[cols].push(this["q"+rows]);
                 quesAnswArray[cols].push(this["a"+rows]);
            }
        }
    //bonus round q&a
    this["finalQ"] = varText["var_c13q1"];
    this["finalA"] = varText["var_c13a1"];
    quesAnswArray.push(this["finalQ"]);
    quesAnswArray.push(this["finalA"]);

   if (total == loaded){
     play();
     this.removeEventListener(Event.ENTER_FRAME, loading);
   }

   trace(categoryArray); // this traces the array values perfectly
   trace(categoryArray.length); // this returns 13 which is correct
}

trace(categoryArray); //this gives me nothing. 
trace(categoryArray.length) //gives me 0

1 Ответ

1 голос
/ 04 ноября 2011

Ваш код делает то, что должен делать.Что происходит, так это то, что ваша loading() функция вызывается асинхронно после получения данных Flash.Так что в основном ваши последние операторы трассировки выполняются до loading() и до инициализации массивов.

Так что просто убедитесь, что вы обращаетесь к массивам после вызова loading().Возможно, создайте такую ​​функцию, как initialize(), которая будет содержать ваш код инициализации.И вызвать эту функцию в конце loading().

...