【问题标题】:Repeating functions with XML and movieclips in AS variables在 AS 变量中使用 XML 和影片剪辑重复函数
【发布时间】:2015-03-12 18:09:08
【问题描述】:

我是 AS3 的新手。基本上我有一个由 98 个 UILoaders 组成的网格,每个 UILoaders 都基于 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) 等。

【问题讨论】:

  • 为什么在xml文件中用不同的数字来区分呢?它们是按特定顺序排列的,还是您只是想加载图像列表并将它们显示在网格中?
  • 是的,xml 会随着网格需要加载的不同图像而不断变化,因此它首先检查图像是否相同。 "if (t88.soruce == xmlData.t88)" 那么它会改变 UILoader,需要这样做 98 次
  • @Callum 您是否尝试过使用数组来放置图块,然后您可以使用 for 循环来执行所有操作?
  • 我不确定如何使用数组并在每个循环中更改数字?

标签: xml actionscript-3 flash loops variables


【解决方案1】:

当操作一个对象的多个实例时,最好使用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();

编辑:

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

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

    }
}

希望能有所帮助。

【讨论】:

  • 是否可以控制我已有的 UI 加载器?谢谢
  • 如何将其添加到您之前的代码中并使其重复?
  • @Callum 我不知道你所说的“让它重复”是什么意思?如果您说的是加载 xml,请查看我的代码中的那部分。
  • 抱歉,现在知道了。你们太有帮助了,非常感谢! @akmozo
  • 当尝试使用 tile.name = String(i+1); tile.addEventListener( MouseEvent.CLICK, function(e:MouseEvent):void { trace(e.currentTarget.name); // 给出 : 1, 2, .. , 98 // 你可以调用你的函数: pi1(int( e.currentTarget.name)); } ) 它说“访问未定义的属性图块。”
猜你喜欢
  • 2023-04-03
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2017-08-23
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
相关资源
最近更新 更多