As3 вызывающий массив вне функции

Я отчасти новичок в AS3 и сам программирую.

У меня эта проблема. Я хочу иметь возможность использовать Pl_array и En_array вне функции AfterLoad , но я всегда получаю неопределенное значение. Я пишу код внутри временной шкалы, а не .as-файл. Это имеет значение?

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

Вот код в первом кадре:

import flash.events.MouseEvent;
stop();
Btn_start.addEventListener(MouseEvent.CLICK, onStartClick);

function onStartClick(me:MouseEvent):void{
    gotoAndStop("Dictionary");
}

и вот на втором называется «Словарь:

import flash.events.Event;
import flash.utils.Timer;
import flash.events.MouseEvent;

stop();

var myTextLoader:URLLoader = new URLLoader();
var Txt_array:Array=new Array(); //tablica wczytanych zwrotów
var Pl_array:Array=new  Array();
var En_array:Array=new Array();
var myTimer:Timer = new Timer(1000);

myTextLoader.addEventListener(Event.COMPLETE, onLoaded); //listener na koniec wczytywania pliku tekstowego

function onLoaded(e:Event):void { //funkcja wywoływana przez listener na koniec wczytywania pliku
    Txt_array = e.target.data.split(/\n/); //
    dispatchEvent(new Event("Load_END"));
}
myTextLoader.load(new URLRequest("Zwroty.txt"));

this.addEventListener("Load_END", AfterLoad); //kod wykonywano po wczytaniu pliku tekstowego 
function AfterLoad(e:Event):void{   
    for each (var s:String in Txt_array){// pętla która rozdziela tekst na polski i angielski
        var i:int=0;
      En_array[i]=s.substr(0, s.indexOf("-")-1);
      Pl_array[i]=s.substr(s.indexOf("-")+2, s.length);
      i++;
    } //koniec fora
}//koniec funkcji

Begin.addEventListener(MouseEvent.CLICK, test);

function test(e:Event):void{
    trace(En_array[1]);
}

//funkcja wyświetlająca string w txt_load
function ShowString (txt_show:String):void{
    load_txt.text = txt_show;
}

function ShowOpinion(txt_opinion:String):void{
    opinion_txt.text=txt_opinion;
}   

function HideOpinion():void{
    opinion_txt.text=" ";
}

//funkcja porównująca łańcuchy
function Compare(txt_a:String,txt_b:String):Boolean{
    if (txt_a==txt_b){ 
      return true;
    } 
    return false;
}

//up_btn.useHandCursor=true;
//up_btn.addEventListener(MouseEvent.MOUSE_OVER, switch_bg);

//function switch_bg(me:MouseEvent):void{
    //var newColor:ColorTransform = me.target.transform.colorTransform;
    //newColor.color = 0x1000C6;
    //me.target.transform.colorTransform = newColor;
//}

on test Я всегда получаю undefined во время трассировки. Я пытался найти решение в Google, но не смог.

0
добавлено отредактировано
Просмотры: 1
Рекомендуется использовать Event.EVENT_TYPE.
добавлено автор Konrad, источник

3 ответы

Этот код выглядит так, как будто он должен работать, но если вы пытаетесь получить доступ к первому элементу в En_array , вам нужно помнить, что индексация начинается с 0, а не 1. Вы также можете убедиться, что En_array не является пустым перед чтением любого из его значений. Попробуй это:

if (En_array.length > 0)
    trace(En_array[0]);
1
добавлено

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

0
добавлено

У вас беспорядок в вашем коде. Давайте сделаем это проще:

import flash.events.Event;
import flash.utils.Timer;
import flash.events.MouseEvent;

stop();

var myTextLoader:URLLoader = new URLLoader();
var Txt_array:Array;
var Pl_array:Array;
var En_array:Array;
/* Good practice is to create object when you relay need it */
var myTimer:Timer = new Timer(1000);

myTextLoader.addEventListener(Event.COMPLETE, onLoaded); 

function onLoaded(e:Event):void {
   Txt_array = e.target.data.split(/\n/);//now we create new array
   afterLoad(Txt_array);
}

function afterLoad(array):void{//it is good habit to start function names from small letter
    En_array = [];// create arrays
    Pl_array = [];

    for each (var s:String in array){
      En_array.push(s.substr(0, s.indexOf("-")-1));
      Pl_array.push(s.substr(s.indexOf("-")+2, s.length));
     //push let you add items more efficient and you don't need index
    }
}

myTextLoader.load(new URLRequest("Zwroty.txt"));

Now everything should be fine :) Just remember to check if objects (in your case arrays) have elements you want to use (etc. array.lenght>0 or array=null)

0
добавлено