【问题标题】:AS3 Loading multiple external images into an array?AS3 将多个外部图像加载到数组中?
【发布时间】:2011-04-02 11:55:02
【问题描述】:

尝试随机选择 4 张图像并将它们加载到数组中,然后在显示所有 4 张图像时使用计时器显示它们,另外 4 张图像将再次加载。这是代码:

var images : Array = new Array();
var rndNumbers : Array = new Array();
var imageLoader : Loader;
var imageTimer : Timer = new Timer(3000, 0);
var currImageID : int;
var imgID : int;
var loaded : Boolean = true;
var i : int;
var tmp : int = 0;
var rnd : int = 0;

addEventListener(Event.ENTER_FRAME, OnLoad);

imageTimer.addEventListener(TimerEvent.TIMER, ChangePicture);

function OnLoad(e : Event) : void {
    RandomNumbers();
    LoadImages();
}

function RandomNumbers() {
    for (var n = 0; n <= 3; n++) {
        rnd = 1 + Math.floor(Math.random() * 4);
        while (tmp == rnd) {
            rnd = 1 + Math.floor(Math.random() * 4);
        }
        tmp = rnd;
        rndNumbers[n] = rnd;
        trace(rnd);
    }
}

function LoadImages() : void {
    for (var i = 0; i <= rndNumbers.length - 1; i++) {
        imageLoader = new Loader;
        var urlRequest : URLRequest = new URLRequest("images/pic" + rndNumbers[i] + ".jpg");
        imageLoader.load(urlRequest);
        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadComplete);
    }
    imageTimer.start();
}

function LoadComplete(event : Event) {
    removeEventListener(Event.ENTER_FRAME, OnLoad);
    images[imgID] = imageLoader;
    imgID++;
}

function ChangePicture(event : TimerEvent) : void {
    transition.gotoAndPlay(1);
    Img_Box.addChild(images[currImageID]);
    if (currImageID != 3) {
        currImageID++;
    } else {
        RandomNumbers();
        LoadImages();
        currImageID = 0;
    }
}

这里可能的问题是加载图像的 for 循环不会等待加载完成并继续循环。那怎么解决?或者你有什么更好的方法吗?

提前致谢。

【问题讨论】:

  • 是的,这整件事的设置非常糟糕。我的建议是,学习如何在不使用 ENTER_FRAME 事件的情况下使用 flash。这里将发生的事情是您将每秒调用 OnLoad 30-60 次,直到加载一个图像。所以基本上这让我想知道你是否甚至试图运行这段代码,因为它应该只是简单的崩溃闪现。
  • 谢谢 jesse,你注意到我对 as3 有点陌生,并且真的想到了如何保持函数运行而不导致崩溃的问题。就像在 vb 中一样,您可以使用诸如 DoEvents 之类的函数或类似的东西。在as3中怎么可能。你知道有什么参考资料可以让我学习关于这种编程的基本知识,而不必经历所有事情吗?谢谢
  • 抱歉我的评论有点负面,并不是粗鲁或类似的事情。解释一下,每次渲染一帧时都会调用 ENTER_FRAME 事件。因此,假设您将闪存 SWF 的每秒帧数设置为 120,此方法将由闪存虚拟机(如果可能基于硬件)每秒调用 120 次。因此,可以将其视为每秒 120 次将事件分派给回调,这将变得很糟糕。我将在照片库上发布带有视频教程链接的答案,然后您可以从那里调整该代码以执行您想要的操作。

标签: flash actionscript-3 image load external


【解决方案1】:

好的,所以没有关于照片库的视频教程,但 here is an Actionscript 3 tutorial on how to make a photo gallery。由于您是 AS3 的新手,请从那里开始,然后研究使用 AS3 中的计时器来切换您的照片。还有我的建议:尽量避免做时间线补间和动画,尽量使用纯动作脚本。这是因为 Flash 基本上是一个存在身份危机的工具/平台。它旨在用于艺术家和动画师(因此是时间线的东西,设计师 UI)以及开发人员。当你将这两个世界融合在一起,然后进入更复杂的项目时,事情很快就会变得一团糟。但是,如果您正在执行代码中暗示的简单转换,那应该没问题。

确保在学习时,您学习的是 actionscript 3。actionscript 2 是旧的 flash AVM 语言(actionscript 虚拟机 1),它比 actionscript 3 慢约 20 倍,是一种非类型安全或非严格的语言。 Actionscript 3 是一种基于 ecmascript 3 语言标准的类型安全的严格语言,曾一度是 ecma 脚本 4.0 版格式命题的基础模型。然而,由于像微软这样的人,它作为新规范被关闭了,因此被认为是一种专有语言,但仍然基于开放标准。

至于您的代码,您可以简单地更改 onLoad 方法,以通过类成员变量记录 onLoad 回调被调用的次数。计数 4 次(完成 4 次加载)后,您可以将变量重置回 0。此外,您可以将函数更改为通用函数并从内部调用它,而不是将第一次加载调用放在 ENTER_FRAME 事件中放置此操作脚本的框架。 (我假设这段代码只是在 Flash FLA 中的一个框架上输入的)。示例:

//---->Delete this -->addEventListener(Event.ENTER_FRAME, OnLoad);

imageTimer.addEventListener(TimerEvent.TIMER, ChangePicture);

OnLoad(); // Manually call the first function to get the whole load/display loop going.

function OnLoad():void{

     RandomNumbers();
     LoadImages();
}

此外,如果您想成为一名认真的面向对象的 Flash 开发人员,您还需要学习如何开始使用类,包括文档类。您可以在此处找到相关视频教程的链接:

http://gotoandlearn.com/play.php?id=43

该网站还包含大量免费视频教程,这些教程应该可以帮助您顺利成为一名成熟的 Flash 开发人员。我自己在这些教程刚出来时就完全通过观看这些教程来获得我的 Flash 基础。从那里您可能想查看有关面向对象编程和设计模式的书籍/教程,以及它们如何应用于 actionscript 3 语言。希望这对您的努力有所帮助。

【讨论】:

  • 太棒了!真的很有帮助,你指出了我一直怀疑的事情,因为我通过与像 unity3d 这样的游戏引擎进行比较来学习它。无论如何,感谢您的宝贵时间。
  • 如果您有兴趣学习一个不错的 3D 引擎,那么请学习使用在下一个主要版本的 flash player 中出现的新 API。图形和性能或尖端。更多信息在这里:blog.ascensionsystems.caaway3d.com/
猜你喜欢
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多