【问题标题】:AS3 Random Image from XML - Never Repeat来自 XML 的 AS3 随机图像 - 永不重复
【发布时间】:2013-03-13 16:42:40
【问题描述】:

我正在 Flash 中创建一个横幅广告,它会在页面加载后显示来自 XML 文件的 3 个随机图像。我的问题是它偶尔会重复。我已经包含了我的代码,有什么建议吗?


var pHeight:Number = 84;
var pWidth:Number = 120;


var listLoader:URLLoader = new URLLoader( new URLRequest("www.example.com/example.xml") );
var picLoader:Loader = new Loader();

listLoader.addEventListener(Event.COMPLETE, gotList);

function gotList(evt:Event):void {
    var xmlData:XML = XML(listLoader.data);
    var numImages:Number = xmlData.picture.length();
    var stImage:String = xmlData.picture[Math.floor(numImages*Math.random())].toString();

    picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotPic);
    picLoader.load( new URLRequest(stImage) );

    listLoader.removeEventListener(Event.COMPLETE, gotList);
}

function gotPic(evt:Event):void {
    var thisBmp:Bitmap = Bitmap(evt.target.content);
    thisBmp.x = 0;
    thisBmp.y = 0;
    var thisWidth:Number = thisBmp.width;
    var thisHeight:Number = thisBmp.height;

    thisBmp.scaleX = pWidth/thisWidth;
    thisBmp.scaleY = pHeight/thisHeight;
    addChild(thisBmp);

    picLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, gotPic);
}

【问题讨论】:

  • 我只看到加载单个图像的代码。你的意思是一旦页面加载就会运行并且每次都应该显示一个随机图像?
  • 我在一个movieclip中使用了代码,并且我使用了同一个movieclip 3次。例如,动画从翻转 3 张卡片开始,然后翻转一张,然后翻转下一张,最后翻转最后一张。在这 3 个中,我不想从 xml 文档中重复。
  • 您是否希望在每次新加载页面时都必须显示接下来的三个图像。您的 XML 结构如何?
  • 在这种情况下,我强烈建议将 XML 加载代码移出影片剪辑。您当前不必要地多次加载同一个文件。我会根据你的cmets为你制定一个答案。

标签: actionscript-3 flash flash-cs5 flash-cs4 banner


【解决方案1】:

正如 cmets 中所述,您需要将 XML 的加载从 MovieClip 移到您的主/文档类中(或者,如果您正在处理时间线,您可以将它放在那里.. . 我不是宽恕这种行为,我只是想不管你用什么方法都能回答你的问题)。

一次加载 XML 后,您可以从那里抓取图像,将它们放入 Array,然后对其进行随机排序:

var images:Array = [];
for each(var imgObj:XML in xml.img){
    images.push(imgObj.toString());
}
images.sort(function(a:Object,b:Object):int{return Math.random() > .5 ? -1 : 1})

您可能需要修改上面的代码以适应您的 XML 格式。

接下来您要做的是在您的 MovieClip 上创建一个公共方法,该方法允许您为该剪辑设置图像:

function setPic(stImage:String):void {
    picLoader = new Loader();
    picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotPic);
    picLoader.load( new URLRequest(stImage) );
    addChild(picLoader);
}

最后,您可以使用此setPic 方法在您的MovieCilp 的每个实例上设置图像:

for(var i:int = 0; i < images.length; i++)
{
    this["mc"+(i+1)].setPic(images[i]); 
}

这是假设您的 MovieClip 实例(mc1mc2 等)有一定的命名约定

【讨论】:

  • 非常感谢@Marcela 的帮助。我仍然对将所有这些放在一起感到有些困惑。我想我理解你所说的,当我可以在第一帧中加载一次时,不需要在影片剪辑中多次加载 xml。这看起来完全正确吗? (由影片剪辑和第一帧分隔) movieclip 'function setPic(stImage:String):void { picLoader = new Loader(); picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotPic); picLoader.load(新的 URLRequest(stImage)); addChild(picLoader); }'
  • 第一帧: var pHeight:Number = 84; var pWidth:Number = 120; var listLoader:URLLoader = new URLLoader(new URLRequest("www.example.com/example.xml")); var picLoader:Loader = new Loader();变种图像:数组= [];对于每个(var imgObj:xml.img 中的 XML){ images.push(imgObj.toString()); } images.sort(function(a:Object,b:Object):int{return Math.random() > .5 ? -1 : 1}) for(var i:int = 0; i
  • 正确,除非您需要在影片剪辑中定义 pHeightpWidth,因为那是您使用它们的地方。
  • 再次@Marcela 我非常感谢你的帮助,你的救命稻草。测试电影后,我遇到了 2 个错误。 1120:访问显示这一行的未定义属性 gotList -- listLoader.addEventListener(Event.COMPLETE, gotList); -- 我得到这个错误指的是未定义的属性 xml -- (var imgObj:XML in xml.img){ -- 我已经将我的代码粘贴在 pastebin.com/ZHrqJyF4 的 pastebin 中。我真的很感激这个
  • 我给你的代码是一个使用指南。有一些空白需要用您已有的代码来填充。您需要将原始的 gotList 方法从影片剪辑中移出并进入主时间线的第一帧。然后,您需要将图像数组创建移动到该gotList 方法中。为了使for each 工作,您需要更改它以匹配您的xml 格式:for each(var imgObj:XML in xmlData.picture)
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 2013-02-15
  • 2020-09-25
  • 2016-06-23
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多