2011-04-02 38 views
0

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

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循环,它加载图像不会等待加载完成,任何继续循环。如何解决这个问题?或者你有更好的建议吗?

谢谢先进。

+0

是的,这整件事情的建立真的很糟糕。我的建议,学习如何使用闪光灯,而无需使用ENTER_FRAME事件。这里将发生什么是你将每秒调用OnLoad 30-60次,直到加载一个图像。所以基本上这让我想知道你是否试图运行这个代码,因为它应该只是简单的崩溃闪存。 – 2011-04-02 13:01:01

+0

谢谢jesse,叶,你注意到我有点新as3,真的有这个问题在脑海中如何保持一个功能,而不会导致它崩溃。就像在VB中,你可以使用DoEvents或类似的函数。 as3中如何可能?你知道任何参考,我可以学习有关这种编程的基本知识,而不必经过一切?谢谢 – Kourosh 2011-04-02 14:51:08

+0

抱歉,对我的评论有负面评论,不意味着粗鲁或任何此类性质。为了解释,每次渲染帧时都会调用ENTER_FRAME事件。因此,假设您将Flash SWF的每秒帧数设置为120,则此方法将由闪存虚拟机(如果可能,基于硬件)每秒120次调用。所以把它想象成一个事件发生到每秒120次的回调会变糟。我会在图片库上发布一个带有视频教程链接的答案,然后您可以根据自己的需要修改该代码。 – 2011-04-02 14:55:14

回答

2

好吧所以没有视频教程的照片库,但here is an Actionscript 3 tutorial on how to make a photo gallery。由于您是AS3的新手,请先从AS3开始,然后使用AS3中的计时器来切换照片。另外我的建议:尽量避免做时间轴补间和动画,尝试去纯粹的动作。这是因为基本上闪存是一个身份危机的工具/平台。它的目的是用于艺术家和动画师(因此时间线的东西,设计师用户界面)和开发人员。当你混合两个世界,然后进入更复杂的项目时,事情会变得非常快。但是,如果您按照您的代码所暗示的那样进行简单的转换,则应该没问题。

确保学习时,你学习动作3.动作脚本2是旧的Flash AVM语言(动作虚拟机1),它比动作脚本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语言。希望这有助于您的努力和一切努力。

+0

太棒了!真的很有帮助,你指出了我一直怀疑的事情,因为我通过与像unity3d这样的游戏引擎进行比较来了解它。无论如何感谢您的时间。 – Kourosh 2011-04-02 19:04:31

+0

如果你有兴趣学习一个不错的3D引擎,那么学习使用新的API出现在下一个主要版本的Flash播放器中。图形和性能或尖端。更多信息:http://blog.ascensionsystems.ca/和http://away3d.com//。 – 2011-04-02 19:10:19