views:

3483

answers:

3

I have this AS3 slideshow code, that loads an XML with a list of images. What I'm looking for, is a way to skip the XML part, and just load all images in the folder "images"?

How can I add an constant boolean that decides if it should play the images random or not? const RANDOM:boolean = true; ...

// import tweener
import caurina.transitions.Tweener;

// delay between slides
const TIMER_DELAY:int = 2000;
// fade time between slides
const FADE_TIME:Number = 1;

// flag for knowing if slideshow is playing
var bolPlaying:Boolean = true;
// reference to the current slider container
var currentContainer:Sprite;
// index of the current slide
var intCurrentSlide:int = -1;
// total slides
var intSlideCount:int;
// timer for switching slides
var slideTimer:Timer;
// slides holder
var sprContainer1:Sprite;
var sprContainer2:Sprite;
// slides loader
var slideLoader:Loader;
// url to slideshow xml
var strXMLPath:String = "slideshow.xml";
// slideshow xml loader
var xmlLoader:URLLoader;
// slideshow xml
var xmlSlideshow:XML;

function initSlideshow():void { 
 // create new urlloader for xml file
 xmlLoader = new URLLoader();
 // add listener for complete event
 xmlLoader.addEventListener(Event.COMPLETE, onXMLLoadComplete);
 // load xml file
 xmlLoader.load(new URLRequest(strXMLPath));

 // create new timer with delay from constant
 slideTimer = new Timer(TIMER_DELAY);
 // add event listener for timer event
 slideTimer.addEventListener(TimerEvent.TIMER, nextSlide);

 // create 2 container sprite which will hold the slides and
 // add them to the masked movieclip
 sprContainer1 = new Sprite();
 sprContainer2 = new Sprite();
 mcSlideHolder.addChild(sprContainer1);
 mcSlideHolder.addChild(sprContainer2);

 // keep a reference of the container which is currently
 // in the front
 currentContainer = sprContainer2;
}

function onXMLLoadComplete(e:Event):void {
 // create new xml with the received data
 xmlSlideshow = new XML(e.target.data);
 // get total slide count
 intSlideCount = xmlSlideshow..image.length();
 // switch the first slide without a delay
 switchSlide(0);
}

function fadeSlideIn(e:Event):void {
 // add loaded slide from slide loader to the
 // current container
 addSlideContent();

 // check if the slideshow is currently playing
 // if so, show time to the next slide. If not, show
 // a status message
 if(bolPlaying) {
 } else {
 }
 // fade the current container in and start the slide timer
 // when the tween is finished
 Tweener.addTween(currentContainer, {alpha:1, time:FADE_TIME, onComplete:onSlideFadeIn});
}

function onSlideFadeIn():void {
 // check, if the slideshow is currently playing
 // if so, start the timer again
 if(bolPlaying && !slideTimer.running)
  slideTimer.start();
}

function switchSlide(intSlide:int):void {
 // check if the last slide is still fading in
 if(!Tweener.isTweening(currentContainer)) {
  // check, if the timer is running (needed for the
  // very first switch of the slide)
  if(slideTimer.running)
   slideTimer.stop();
  // change slide index
  intCurrentSlide = intSlide;
  // check which container is currently in the front and
  // assign currentContainer to the one that's in the back with
  // the old slide
  if(currentContainer == sprContainer2)
   currentContainer = sprContainer1;
  else
   currentContainer = sprContainer2;
  // hide the old slide
  currentContainer.alpha = 0;
  // bring the old slide to the front
  mcSlideHolder.swapChildren(sprContainer2, sprContainer1);
  // delete loaded content
  clearLoader();
  // create a new loader for the slide
  slideLoader = new Loader();
  // add event listener when slide is loaded
  slideLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, fadeSlideIn);
  // load the next slide
  slideLoader.load(new URLRequest(xmlSlideshow..image[intCurrentSlide].@src));
 }
}

function nextSlide(e:Event = null):void {
 // check, if there are any slides left, if so, increment slide
 // index
 if(intCurrentSlide + 1 < intSlideCount)
  switchSlide(intCurrentSlide + 1);
 // if not, start slideshow from beginning
 else
  switchSlide(0);
}

function previousSlide(e:Event = null):void {
 // check, if there are any slides left, if so, decrement slide
 // index
 if(intCurrentSlide - 1 >= 0)
  switchSlide(intCurrentSlide - 1);
 // if not, start slideshow from the last slide
 else
  switchSlide(intSlideCount - 1);
}

function clearLoader():void {
 try {
  // get loader info object
  var li:LoaderInfo = slideLoader.contentLoaderInfo;
  // check if content is bitmap and delete it
  if(li.childAllowsParent && li.content is Bitmap){
   (li.content as Bitmap).bitmapData.dispose();
  }
 } catch(e:*) {}
}

function addSlideContent():void {
 // empty current slide and delete previous bitmap
 while(currentContainer.numChildren){Bitmap(currentContainer.getChildAt(0)).bitmapData.dispose(); currentContainer.removeChildAt(0);}

 // create a new bitmap with the slider content, clone it and add it to the slider container
 var bitMp:Bitmap =  new Bitmap(Bitmap(slideLoader.contentLoaderInfo.content).bitmapData.clone());
 currentContainer.addChild(bitMp);
}

// init slideshow
initSlideshow();
A: 

Well you could simply integrate the XML into actionscript if you want to skip the loading :

var xmlSlideshow:XML = <images><image /><image /></ images>;

In case you want to skip that as well you can name the images on a certain way so you can blindly load them (image0.jpg, image1.jpg, etc.), until your loading sequence throws an error (that you catch of course) as the imageN doesn't exist (this is dirty though!).

The best in this situation is to have a tiny server side script that lists all the files in a given folder and output their references into an XML that can be retrieved from your SWF.

Theo.T
How can I get it to play random images?
mofle
Create an array with the indexes and shuffle it.
Theo.T
How would I do that? I'm a noob.
mofle
A: 

Unless you're deploying your flash app through AIR, you don't have access to the system, so you can't read all the contents of a folder.

You could use PHP or your server side language of choice to read the contents of a folder and construct the xml you'll load.

Just change strXMLPath to http://example.com/yourphpfile.php and it will load up as an xml document. You should change the mimetype to mimetype="application/xml".

Alex Jillard
+1  A: 

If you're using PHP on your server something like

header('Content-type: applicaiton/xml;charset=utf-8');
$dir = dir('images');
echo '<images>', "\n";
foreach ($dir as $file) {
    if ($file == '.' || $file == '..') {
        continue;
    }
    echo '<image>', $file, '</image>', "\n";
}
echo '</images>';

should do the trick.

Just point your slideshow app at the PHP script and it'll create the list dynamically.

Alan