在 AS 变量中使用 XML 和动画片段重复函数

Repeating functions with XML and movieclips in AS variables

我是 AS3 新手。基本上我有一个由 98 个 UILoader 组成的网格,每个 UILoader 都根据 XML 文件抓取一个图像。与其写出 98 行代码,不如每次用不同的数字重复一遍?

function loadworld() {
    var xmlData:XML = new XML();
    var theURL_ur:URLRequest = new URLRequest("imagepos.xml" + "#lawl=" + (Math.random() * 1000));
    var loader_ul:URLLoader = new URLLoader(theURL_ur);
    loader_ul.addEventListener("complete", fileLoaded);

    function fileLoaded(e:Event):void
    {
        xmlData = XML(loader_ul.data);

        if (t88.source == xmlData.t88) { } else { t88.source = xmlData.t88; };
        if (t89.source == xmlData.t89) { } else { t89.source = xmlData.t89; };
        if (t90.source == xmlData.t90) { } else { t90.source = xmlData.t90; };

        loadworld();
    }
}

正如您从代码中看到的那样,数字始终相同,因此我只需要从 1-98 重复 98 次即可。

我在尝试记录所有 98 个 UILoader 上的鼠标点击时也遇到了同样的问题:

this.t88.addEventListener(MouseEvent.CLICK, function (){
    pi1(88);
});

t88 表示 tile 88 或 UILoader88,我需要它来激活功能 pi1(88),然后 t89 需要激活 pi1(89)

当操作一个对象的多个实例时,最好使用Array(或Vector)来简化处理。

对于您的情况,您可以创建 UILoaders 并将它们添加到数组中,然后对于所有操作,您可以使用一些 for 循环,如下所示:

// the array where we will save our tiles
var tiles:Array = [];

// creation of tiles
for(var i:int = 0; i < 99; i++){
    var tile:UILoader = new UILoader();

        // save the index of the tail as its name
        tile.name = String(i+1);    

        tile.addEventListener(
            MouseEvent.CLICK, 
            function(e:MouseEvent):void {
                trace(e.currentTarget.name);    // gives : 1, 2, .. , 98

                // you can call your function : pi1(int(e.currentTarget.name));

            }   
        )

    tiles.push(tile);   
    addChild(tile);
}

function load_xml(){

    var xml:XML;
    var loader:URLLoader = new URLLoader();
        loader.load(new URLRequest('xml.xml'));
        loader.addEventListener(Event.COMPLETE, process_XML);

    function process_XML(e:Event):void {    
        xml = new XML(loader.data);
        var tile:UILoader;
        for(var i:int = 0; i < tiles.length - 1; i++){          
            tile = tiles[i];    
            if (tile.source != xml['t'+(i+1)]) tile.source = xml['t'+(i+1)];
        }
    }

}

load_xml();

编辑:

如果您的 UILoader 在舞台上,您可以像这样将它们添加到数组中:

var tiles:Array = [];
var index:int;
for(var i:int = 0; i < this.numChildren; i++){
    var obj:Object = this.getChildAt(i);
    if(obj is UILoader){
        index = int(obj.name.replace('t', ''));
        tiles[index - 1] = obj;

        obj.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
            trace(e.currentTarget.name.substr(1)); // gives 1, 2, ...
        })

    }
}

希望能帮到你。