【问题标题】:AS3 how to load in external images in a loop?AS3如何循环加载外部图像?
【发布时间】:2010-11-03 20:50:00
【问题描述】:

我正在使用 AS3 在 Flash 中制作一个高分表,我已经成功地获得了显示名称和分数的工作代码,但它也是我的高分表的一部分,它需要显示用户的国家/地区标志。标志的图像存储在远程服务器上。

现在我知道如何加载单个图像并将其添加到我的影片剪辑中,但是当我想通过循环迭代加载 20+ 时,事情变得非常复杂。我查看了很多示例,但无法采用示例代码为我工作。无论如何,我到目前为止没有进一步的操作。

// Load High scores from server
var hiscoreloader:URLLoader = new URLLoader();
hiscoreloader.addEventListener(Event.COMPLETE, highScoresLoaded);
var hiscorexml:XML;
function highScoresLoaded(e:Event):void
{
    hiscorexml = new XML(e.target.data);
    var hsList:XMLList = hiscorexml.highscores.highscore;
    for(var i:uint = 0; i < hsList.length(); i++)
    {
        this["hs_score_"+i].text = zeroPad(hsList.score.text()[i], 8);
        this["hs_name_"+i].text = hsList.name.text()[i];
        // Load in Flag
        // url of flag will be: "http://wfwxg.philosophydesign.com/images/flags/" + hsList.country.text()[i] + ".png"
        // Move clip instance name the above image needs adding too will be: this["hs_flag_"+i]
    }
}
hiscoreloader.load(new URLRequest("http://wfwxg.philosophydesign.com/includes/top20.php?nocache=" + new Date().getTime()));

谁能修改我的代码来做我想做的事?

非常感谢

斯科特

【问题讨论】:

    标签: flash actionscript-3 image load


    【解决方案1】:

    这里有一个快速的解决方案。

    实际上,我建议封装关注点,这样您的代码就不会太紧耦合。现在,您可以在一个函数中处理几乎所有事情,同时将结果数据分配给您的主影片剪辑。这就是为什么我创建了一个数组来保存 XML 数据以及加载的图像。

    一种可能的结构是:
    - 首先检索 XML 数据并将其分配给数据数组。
    - 通过数据数组循环加载图像,并将加载的内容分配给相关的对象。
    - 加载完所有图片后,使用数据数组设置显示

           // Load High scores from server
            var hiscoreloader:URLLoader = new URLLoader();
    
                //Create an Array to hold your XML data
            var data:Array = [];
    
            hiscoreloader.addEventListener(Event.COMPLETE, highScoresLoaded);
    
            var hiscorexml:XML;
    
            function highScoresLoaded(e:Event):void
            {
              hiscorexml = new XML(e.target.data);
                  var hsList:XMLList = hiscorexml.highscores.highscore;
    
              for(var i:uint = 0; i < hsList.length(); i++)
              {
                 //here we create a new Object to hold the retrieved data
                 //and add it to the data Array
                data[i] = { 
                                 hs_score:zeroPad(hsList.score.text()[i], 8), 
                 hs_name: hsList.name.text()[i], 
                 flagURL:"http://wfwxg.philosophydesign.com/images/flags/"
                                 + hsList.country.text()[i] + ".png",
                 mc_name:"hs_flag_"+i.toString();
                };
    
                 //load the images
                 var loader:Loader = new Loader();
                 configureListeners(loader.contentLoaderInfo);  
                 loader.name = i.toString();
                 loader.load( new URLRequest( data[i].flagURL ) );
              }
            }
    
            function configureListeners(info:LoaderInfo):void
            {
                //add all your event listeners here
                info.addEventListener(Event.COMPLETE , completeHandler );
            }
    
            function removeListeners(info:LoaderInfo):void
            {
                //remove all your event listeners here
                info.removeEventListener(Event.COMPLETE , completeHandler );
            }
    
    
        function completeHandler(event:Event):void
        {
            var index:int = int( event.currentTarget.loader.name );
            //add the image data to your data Array
            data[index].flag = event.currentTarget.loader.content;
            removeListeners( event.currentTarget );
        }
    

    【讨论】:

    • 非常感谢您的帮助。我已经重新标记了您给出的代码并修复了 completeHandler 中的一个错误,您有索引但随后使用 i.这是我现在拥有的代码:pastebin.com/zk3AWKN9 运行时出现此错误:1118:将静态类型 Object 的值隐式强制转换为可能不相关的类型 flash.display:LoaderInfo。
    • 我无法测试您的代码,尝试加载 XML 会引发安全错误。仅通过查看就很难进行调试 :) 尝试使用断点,如果不尝试将代码分成几部分。例如,首先通过注释掉加载程序代码来测试循环,如果可行,只注释掉 loader.load... 等等,直到找到它中断的地方。这段代码相当简单,我看不出这个错误的原因,我认为这可能是由于你的环境,也许是变量名冲突......
    • 在我之前的评论中,我突出显示了它所在的代码。对我来说,这个错误意味着它不喜欢 event.currentTarget 被传递给 :LoaderInfo 类型。所以我把它改成了一个对象。该代码有效,但我真的不知道这是否正确以及它是否正确清理了事件侦听器。这是我现在拥有的代码:pastebin.com/1dLzxtDc
    • 你的代码应该没问题。我实际上对这个错误感到惊讶,因为我不记得有类似的东西。无论如何,为了将 event.currentTarget 键入为 LoaderInfo 实例,我已经更改了几行。您可以随时使用 hasEventListener() 方法测试您的代码,以确保一切正常...
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多