• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-09-2010, 15:39   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2010
Beiträge: 3
Endlosschleife in Slideshow - Problem!

hallo,

ich soll für meine ausbildung eine scrollende slideshow erstellen. ich habe das so weit auch hinbekommen. aber nun soll das ganze endlos laufen. wie mache ich einen loop bei einer xml datei? die daten der xml liste werden in ein arry gespeichert und dann durchgearbeitet. wenn vorbei dann vorbei.

nun stehe ich unter zeitdruck. habe schon den ganzen tag probiert und stehe völlig auf dem schlauch. ihr seid meine letzt rettung!!!!

in bild 1 ist folgender code:
Code:
Code:
var slideshow:Slideshow = new Slideshow("list.xml");
addChild(slideshow);

in der as datei steht folgendes:
Code:
Code:
package
{
   import flash.display.*;
   import flash.events.*;
   import flash.net.*;
   import flash.text.*;
   import flash.utils.*;



   public class Slideshow extends Sprite
   {

      private const PIC_SPACING:int = 30;
      private const ANIMATION_STILL_TIME:int =  0;
      private const ANIMATION_SPEED_FACTOR:int = 1;
      private const ANIMATION_INTERVAL:int = 50;
      private const RANDOMIZE_IMAGES:Boolean = true;
      
      private var queue:Array  = [];
      private var titles:Array = [];
      
      private var loader:Loader;
      private var xmlLoader:URLLoader;
      private var datasource:String;
      private var animator:Timer;
      
      private var xPos:int;
      private var yPos:int;
      private var lastTime:int;
      private var loadedItems:int;
      private var displayedItems:int;
      private var crtTitle:String;
      
      private var container:Sprite;
      private var titleField:TextField;
      

      public function Slideshow(datasource:String)
      {
         container = new Sprite();
         addChild(container);
         
         this.datasource = datasource;
         
         xmlLoader = new URLLoader(new URLRequest(datasource));
         xmlLoader.addEventListener(Event.COMPLETE, onDataLoaded);
         addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
      }
      

      private function onAddedToStage(e:Event):void
      {
         stage.scaleMode = StageScaleMode.EXACT_FIT;      
         container.x = stage.stageWidth;
         container.y = stage.stageHeight/2.2;
         
         titleField = new TextField();
         titleField.x = 0;
         titleField.width = stage.stageWidth;
         titleField.y = stage.stageHeight - 30;
         titleField.height = 30;
         titleField.selectable = false;
         titleField.embedFonts = true;
         titleField.antiAliasType = flash.text.AntiAliasType.ADVANCED;

         var format:TextFormat = new TextFormat();
            format.font = new TitleFont().fontName;
            format.align = TextFormatAlign.CENTER;
            format.size = 20;
            titleField.defaultTextFormat = format;
         titleField.text = "";

         addChild(titleField);
         
         animator = new Timer(ANIMATION_INTERVAL);
         animator.addEventListener(TimerEvent.TIMER, animate);
         animator.start();

      }

      private function onDataLoaded(e:Event):void
      {
         if (!xmlLoader.data)
         {
            trace("XML Load failed");
            return;
         }
         
            var dataXml:XML = XML(xmlLoader.data);
            for each (var item:XML in dataXml.item)
            {
               queue.push({url:item.@src, title:item.@title});
            }
            if (RANDOMIZE_IMAGES)
               queue = shuffle(queue);
      
            loadNextItem();
            }
      private function loadNextItem():void
      {
         var item:Object = queue.shift();
         
         if (item==null)
            return;
         crtTitle = item.title;
         
         loader = new Loader();
         loader.contentLoaderInfo.addEventListener(Event.INIT, onItemLoaded);
         loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onItemError);
         loader.load(new URLRequest(item.url));
      }


      private function onItemLoaded(e:Event):void
      {
         trace("loaded "+crtTitle);
         
         loadedItems++;
         
         var content:Bitmap = Bitmap(loader.content);
         content.x = xPos;
         xPos += content.width + PIC_SPACING;
         yPos = 500;
         container.addChild(content);
         titles.push(crtTitle);
         
         if (queue.length>0)
            loadNextItem();
         else
         {
            var refFirst:Bitmap = Bitmap(container.getChildAt(0));
            var refLast :Bitmap = Bitmap(container.getChildAt(container.numChildren-1));
            
            var copyFirst:Bitmap = new Bitmap(refFirst.bitmapData);
            var copyLast:Bitmap  = new Bitmap(refLast.bitmapData);
            
            copyLast.x = -copyLast.width - PIC_SPACING;
            copyFirst.x = xPos;
            
            container.addChild(copyFirst);
            container.addChild(copyLast);
         }
      }
      
      private function onItemError(e:Event):void
      {
         trace("load error");
         loadNextItem();
      }
      

      private function animate(e:TimerEvent):void
      {            
         if (loadedItems<1)
            return;
         
         if (container.numChildren > displayedItems)
         {
            var picToShow:Bitmap = Bitmap(container.getChildAt(displayedItems));
            var targetX:int = stage.stageWidth/2;
            var itemX:int = picToShow.x + picToShow.width/2 + container.x;
            
            var delta:int = 5;//(itemX-targetX) / ANIMATION_SPEED_FACTOR;
         }
         else
         {
            var picToShow:Bitmap = Bitmap(container.getChildAt(displayedItems-1));
            var delta:int = 0;
         }

         if (delta<=0)
         {

            if (((getTimer()-lastTime) >= ANIMATION_STILL_TIME * 1000) && (container.numChildren > displayedItems))
            {
               lastTime = getTimer();
               displayedItems++;
               titleField.text = "";
            }
            else
            {

               if (titleField.text == "" && titles[container.getChildIndex(picToShow)] != null)
                  titleField.text = titles[container.getChildIndex(picToShow)];
            }
         }

         else
         {
            if ((displayedItems==loadedItems) && ((container.x + container.getChildAt(displayedItems-1).x) <=0))
            {
               var diff:int = 0 - (container.x + container.getChildAt(displayedItems-1).x);
               
               container.x = container.getChildAt(container.numChildren-1).width - diff;
               displayedItems = 0;
            }
               
            container.x -= delta;   
         }
      }
      

      private function shuffle(arr:Array):Array
      {
         var shuffled:Array = arr.slice();
         for (var i:int=0; i<arr.length; i++)
         {
            var element:Object = shuffled[i];
            var rnd:int = Math.floor(arr.length * Math.random());
            shuffled[i] = shuffled[rnd];
            shuffled[rnd] = element;
         }
         return shuffled;
      }
   }
}

die xml datei liegt im selben ordner und hat folgende struktur:
Code:
Code:
<slideshow>
   <item src="slides/1.jpg" title=""/>
   <item src="slides/2.jpg" title=""/>
   <item src="slides/3.jpg" title=""/>
   <item src="slides/4.jpg" title=""/>
</slideshow>
in der xml stehen am schluß weit über 200 einträge. daher kann ichs nicht in die bibliothek ziehen. wäre über hilfe seeeeeeeeeehr dankbar!!!!
cike4 ist offline   Mit Zitat antworten
Alt 02-09-2010, 19:51   #2 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
hi und willkommen im forum!

wenn ich das beim überfliegen richtig gesehen habe befinden sich alle daten in einem array namens queue und werden dort rausgenommen, aber nicht wieder ans ende angefügt.

such mal diese zeile
PHP-Code:
var item:Object queue.shift(); 
und setz dann die hier noch drunter
PHP-Code:
queue.push(item); 
ich denke dann sollte es schon klappen.

mfg

sx
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 03-09-2010, 10:56   #3 (permalink)
Neuer User
 
Registriert seit: Sep 2010
Beiträge: 3
oh wow! manchmal ist die lösung so einfach! herzlichen dank!!!!!!!
cike4 ist offline   Mit Zitat antworten
Alt 03-09-2010, 15:22   #4 (permalink)
Neuer User
 
Registriert seit: Sep 2010
Beiträge: 3
jetzt ist nur das problem, bei weit über 200 dateien bleibt das flash irgendwann (nach ca. 5minuten) stehen. ich habe die bilder schon so doll runtergerechnet, das keines mehr über 10mb hat. ich vermute mal das der virtuelle speicher voll ist. gibt es irgendwo die möglichkeit, im flash einen cache entleeren zu programmieren? oder hat jemand schon einmal so ein problem gehabt und weiß die lösung dafür?
cike4 ist offline   Mit Zitat antworten
Alt 03-09-2010, 21:38   #5 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
hi,

erstmal mein fehler. hab ja nur kurz drübergeblinzelt und durch die änderung eine endlosschleife gemacht. leider beim laden.

ich weiß nicht was du dir da zusammenkopiert hast, aber zum durchschleifen der animation hab ich doch ein paar änderungen vornehmen müssen. ich hab soweit nur alles auskommentiert was störend war.

die schleife funktioniert, aber da ich es minimalistisch halten wollte, was die änderungen betrifft ist es für über 100 bilder wohl ziemlich ungeeignet. um es performanter zu machen müsste ich ein gutes stück tiefer eingreifen.

PHP-Code:
package
{
   
import flash.display.*;
   
import flash.events.*;
   
import flash.net.*;
   
import flash.text.*;
   
import flash.utils.*;



   public class 
Slideshow extends Sprite
   
{

      private const 
PIC_SPACING:int 30;
      private const 
ANIMATION_STILL_TIME:int =  0;
      private const 
ANIMATION_SPEED_FACTOR:int 1;
      private const 
ANIMATION_INTERVAL:int 50;
      private const 
RANDOMIZE_IMAGES:Boolean true;
      
      private var 
queue:Array  = [];
      private var 
titles:Array = [];
      
      private var 
loader:Loader;
      private var 
xmlLoader:URLLoader;
      private var 
datasource:String;
      private var 
animator:Timer;
      
      private var 
xPos:int;
      private var 
yPos:int;
      private var 
lastTime:int;
      private var 
loadedItems:int;
      private var 
displayedItems:int;
      private var 
crtTitle:String;
      
      private var 
container:Sprite;
      private var 
titleField:TextField;
      

      public function 
Slideshow(datasource:String)
      {
         
container = new Sprite();
         
addChild(container);
         
         
this.datasource datasource;
         
         
xmlLoader = new URLLoader(new URLRequest(datasource));
         
xmlLoader.addEventListener(Event.COMPLETEonDataLoaded);
         
addEventListener(Event.ADDED_TO_STAGEonAddedToStage);
      }
      

      private function 
onAddedToStage(e:Event):void
      
{
         
stage.scaleMode StageScaleMode.EXACT_FIT;      
         
//container.x = stage.stageWidth;
         
container.stage.stageHeight/2.2;
         
         
titleField = new TextField();
         
titleField.0;
         
titleField.width stage.stageWidth;
         
titleField.stage.stageHeight 30;
         
titleField.height 30;
         
titleField.selectable false;
         
titleField.embedFonts true;
         
titleField.antiAliasType flash.text.AntiAliasType.ADVANCED;

         var 
format:TextFormat = new TextFormat();
            
format.font = new TitleFont().fontName;
            
format.align TextFormatAlign.CENTER;
            
format.size 20;
            
titleField.defaultTextFormat format;
         
titleField.text "";

         
addChild(titleField);
         
         
animator = new Timer(ANIMATION_INTERVAL);
         
animator.addEventListener(TimerEvent.TIMERanimate);
         
animator.start();

      }

      private function 
onDataLoaded(e:Event):void
      
{
         if (!
xmlLoader.data)
         {
            
trace("XML Load failed");
            return;
         }
         
            var 
dataXml:XML XML(xmlLoader.data);
            for 
each (var item:XML in dataXml.item)
            {
               
queue.push({url:item.@srctitle:item.@title});
            }
            if (
RANDOMIZE_IMAGES)
               
queue shuffle(queue);
      
            
loadNextItem();
            }
      private function 
loadNextItem():void
      
{
         var 
item:Object queue.shift();
         
         if (
item==null)
            return;
         
crtTitle item.title;
         
         
loader = new Loader();
         
loader.contentLoaderInfo.addEventListener(Event.INITonItemLoaded);
         
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERRORonItemError);
         
loader.load(new URLRequest(item.url));
      }


      private function 
onItemLoaded(e:Event):void
      
{
         
trace("loaded "+crtTitle);
         
         
loadedItems++;
         
         var 
content:Bitmap Bitmap(loader.content);
         
content.xPos;
         
xPos += content.width PIC_SPACING;
         
yPos 500;
         
container.addChild(content);
         
titles.push(crtTitle);
         
         if (
queue.length>0)
            
loadNextItem();
         else
         {
            
/*var refFirst:Bitmap = Bitmap(container.getChildAt(0));
            var refLast :Bitmap = Bitmap(container.getChildAt(container.numChildren-1));
            
            var copyFirst:Bitmap = new Bitmap(refFirst.bitmapData);
            var copyLast:Bitmap  = new Bitmap(refLast.bitmapData);
            
            copyLast.x = -copyLast.width - PIC_SPACING;
            copyFirst.x = xPos;
            copyLast.alpha = .5;
            copyFirst.alpha = .5;
            
            
            container.addChild(copyFirst);
            container.addChild(copyLast);*/
            
gesamtBreite container.width PIC_SPACING;
         }
      }
      private var 
gesamtBreite:Number 0;
      private function 
onItemError(e:Event):void
      
{
         
trace("load error");
         
loadNextItem();
      }
      

      private function 
animate(e:TimerEvent):void
      
{            
         if (
loadedItems<1)
            return;
         
         if (
container.numChildren displayedItems)
         {
            var 
picToShow:Bitmap Bitmap(container.getChildAt(displayedItems));
            var 
targetX:int stage.stageWidth/2;
            var 
itemX:int picToShow.picToShow.width/container.x;
            
            var 
delta:int 5;//(itemX-targetX) / ANIMATION_SPEED_FACTOR;
         
}
         else
         {
            var 
picToShow:Bitmap Bitmap(container.getChildAt(displayedItems-1));
            var 
delta:int 0;
         }

         if (
delta<=0)
         {

            if (((
getTimer()-lastTime) >= ANIMATION_STILL_TIME 1000) && (container.numChildren displayedItems))
            {
               
lastTime getTimer();
               
displayedItems++;
               
titleField.text "";
            }
            else
            {

               if (
titleField.text == "" && titles[container.getChildIndex(picToShow)] != null)
                  
titleField.text titles[container.getChildIndex(picToShow)];
            }
         }

         else
         {
           
/* if ((displayedItems==loadedItems) && ((container.x + container.getChildAt(displayedItems-1).x) <=0))
            {
               var diff:int = 0 - (container.x + container.getChildAt(displayedItems-1).x);
               
               container.x = container.getChildAt(container.numChildren-1).width - diff;
               displayedItems = 0;
            }
               */
            //container.x -= delta; 
            
for(var i:int 0container.numChildreni++){
                var 
mc container.getChildAt(i);
                
mc.-= delta;
                if(
mc.< -mc.widthmc.+= gesamtBreite;
            }
         }
      }
      

      private function 
shuffle(arr:Array):Array
      {
         var 
shuffled:Array = arr.slice();
         for (var 
i:int=0i<arr.lengthi++)
         {
            var 
element:Object shuffled[i];
            var 
rnd:int Math.floor(arr.length Math.random());
            
shuffled[i] = shuffled[rnd];
            
shuffled[rnd] = element;
         }
         return 
shuffled;
      }
   }

__________________

flintfabrik.de

Geändert von shin10 (03-09-2010 um 21:41 Uhr)
shin10 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash CS3] Problem XML Slideshow abraxas323 Flash Einsteiger 5 21-04-2009 08:25
Slideshow Problem! dj_mk Flash MX 2004 3 05-11-2005 18:42
Problem mit Endlosschleife Citta_Rafa Flash MX 2004 1 04-10-2005 11:29
problem mit endlosschleife -=[Mad]=- ActionScript 1 1 24-01-2005 13:31
geturl problem... öffnen der seite hört nicht mehr auf.. endlosschleife Chris G. Flash 4 und Flash 5 2 07-11-2001 18:10


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele