hej alle.

jeg arbejder pt. på et banner, der skal læse en .xml hvori der er nogle billeder og retningslinier.

xml'en ser således ud:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<galleri>
  <tid>3</tid>
 
  <indhold>
    <billede>eksempel01.jpg</billede>
    <retning>n</retning>
  </indhold>  
  <indhold>
    <billede>eksempel03.jpg</billede>
    <retning>s</retning>
  </indhold>  
  <indhold>
    <billede>eksempel02.jpg</billede>
    <retning>nw</retning>
  </indhold>  
  <indhold>
    <billede>eksempel01.jpg</billede>
    <retning>n</retning>
  </indhold>
  <indhold>
    <billede>eksempel02.jpg</billede>
    <retning>nw</retning>
  </indhold>  
  <indhold>
    <billede>eksempel03.jpg</billede>
    <retning>s</retning>
  </indhold>    
</galleri>

en hurtig forklaring til xml'en.
brugeren skriver en tid ind, over hvilken billedet skal bevæge sig.
billedet bliver så loadet ind, og hvis retningen billedet skal bevæge sig i er n, skal billedet altså bevæge sig mod nord (opad).
er billedet 50 px større end scenen, flytter billedet sig så 50 px over det antal sekunder, der er skrevet i xml'en.

det er nogenlunde den opsætning kunden har ønsket, og resten er nu finpudsning.
her kan banneret ses:
http://campjohn.dk/AS3/Co3/Lubker/Topbanner/
en af de ting jeg allerhelst vil have kommentarer til, er om I synes at bevægelsen af billederne er ok.

jeg har sørget for at lave bitmaps ud af billederne, når de er loadede, for at kunne sætte smoothing til true:

1
2
3
4
5
6
7
8
private function doneLoading(e:Event) {
      
  var bit:Bitmap = e.target.content
  if(bit != null){
    bit.smoothing = true;
  }
 
...

men jeg synes ikke umiddelbart at kunne se nogen forskel på om denne del af koden er med eller udkommenteret.

er der nogle af jer, der har arbejdet så meget med bitmap smoothing, at I kan gennemskue om dette er slået igennem i min flash eller ej?

derudover, er der forslag til, hvordan dette kan optimeres?

på forhånd tak for hjælpen
felisan

http://campjohn.dk/wp/

alt koden kan ses her.
Preloader:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//imports
import NewCustomContextMenu;  
 
//global vars
var _bytestotal:Number;
var _bytesloaded:Number;
var _isInitiated:Boolean = false;
var _backgroundGraphic:Sprite = new Sprite();
var _preloadGraphic:Sprite = new Sprite();
var _color:uint;
var _sclbar:Number;
var _textfield:TextField = new TextField();
var _textformat:TextFormat = new TextFormat();
var _l:Loader = new Loader();
var _theParameter:String = String(root.loaderInfo.parameters.whatXML);
//var _theParameter:String = "galleri.xml";
 
//setup of CustomContextMenu
var menuData:Array = [];
menuData.push( {caption:"© 2009 Co3", url:"http://www.co3.dk"} );
var ncm:NewCustomContextMenu = new NewCustomContextMenu(menuData, this);
 
//the loader
_l.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loop);
_l.contentLoaderInfo.addEventListener(Event.COMPLETE, done);
_l.load(new URLRequest("LGRTopbannerContent.swf")); //the swf here
 
//
//functions 
//
function loop(e:ProgressEvent):void {
  doTheGraphics();
  init(e.bytesTotal, e.bytesLoaded, 0x000000); //change color of preloader here!
}
 
function init(bytesTotally:Number, bytesToLoad:Number, _colorToUse:uint):void {
  _bytestotal = bytesTotally;
  _bytesloaded = bytesToLoad;
  _color = _colorToUse;
  trace("completion = "+_bytesloaded+" / "+_bytestotal);
  _sclbar = Math.round(_bytesloaded/_bytestotal * 100) * 2;
  if (_bytesloaded >= _bytestotal) {
    trace("bytesloaded >= bytestotal");
  } 
}
 
function doTheGraphics():void {
  if (_isInitiated == false) {
    _isInitiated = true;
    _backgroundGraphic.graphics.lineStyle(0, 0, 0);
    _backgroundGraphic.graphics.beginFill(_color);
    _backgroundGraphic.graphics.lineTo(200, 0);
    _backgroundGraphic.graphics.lineTo(200, 10);
    _backgroundGraphic.graphics.lineTo(0, 10);
    _backgroundGraphic.graphics.lineTo(0, 0);
    _backgroundGraphic.graphics.endFill();
    _backgroundGraphic.alpha = 0.1;
    _backgroundGraphic.x = ((this.stage.stageWidth/2) - (_backgroundGraphic.width/2));
    _backgroundGraphic.y = ((this.stage.stageHeight/2) - (_backgroundGraphic.height/2));
    addChild(_backgroundGraphic);
    //
    _preloadGraphic.graphics.lineStyle(0, 0, 0);
    _preloadGraphic.graphics.beginFill(_color);
    _preloadGraphic.graphics.lineTo(200, 0);
    _preloadGraphic.graphics.lineTo(200, 10);
    _preloadGraphic.graphics.lineTo(0, 10);
    _preloadGraphic.graphics.lineTo(0, 0);
    _preloadGraphic.graphics.endFill();
    _preloadGraphic.alpha = 1;
    _preloadGraphic.x = _backgroundGraphic.x;
    _preloadGraphic.y = _backgroundGraphic.y;
    addChild(_preloadGraphic);
    //
    _textformat.font = "FFF Harmony";
    _textformat.size = 8;
    _textfield.border = false;
    _textfield.embedFonts = true;
    _textfield.width = 90;
    _textfield.height = 30;
    _textfield.selectable = false;
    _textfield.y = _preloadGraphic.y - 20;
    
    addChild(_textfield);
  }
  _textfield.text = (_sclbar/2)+" % loaded";
  _textfield.setTextFormat(_textformat);
  _textfield.x = _preloadGraphic.x + _sclbar;
  _preloadGraphic.width = _sclbar;
}
 
function done(e:Event):void {
  removeChild(_backgroundGraphic);
  removeChild(_preloadGraphic);
  removeChild(_textfield);
  trace("done loading");
  addChild(_l);
  
  trace("_theParameter = "+_theParameter);
  Object(_l.content ).init(_theParameter);
}

Koden til den flash, der loades ind i preloaderen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package {
  
  import caurina.transitions.Tweener;
  import flash.display.MovieClip;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import MovingFadeGallery;
 
  public class LGRTopbannerContent extends Sprite {
    
    private var _theXML:String;
    private var _logo:MovieClip;;
    private var _xml:XML;
    private var _pictureArray:Array = [];
    private var _movementArray:Array = [];
    private var _movingFadeGallery:MovingFadeGallery;
    private var _time:Number;
    
    public function LGRTopbannerContent() {
      //
    }
    
    public function init(someURL:String):void {
      _theXML = someURL;      
      //trace("_theParameter passed to the loaded flash = "+_theXML);
    
      getXML();
      setupLogo();
    }
    
    private function getXML():void {
      var xmlLoader:URLLoader = new URLLoader();
      xmlLoader.addEventListener(Event.COMPLETE, parseXML);
      xmlLoader.load(new URLRequest(_theXML));
    }
    
    private function parseXML(e:Event):void {
      try {
        _xml = new XML(e.target.data);
      } catch (e:TypeError) {
        trace("error = "+e.message);
      }
 
      XMLcontentIntoArray();
    }
    
    private function XMLcontentIntoArray():void {
      var i:Number = 0;
      while(i < _xml.indhold.length()){
        _pictureArray.push(_xml.indhold[i].billede);
        _movementArray.push(_xml.indhold[i].retning);
        i++;
      }
      
      _time = Number(_xml.tid);
      
      _movingFadeGallery = new MovingFadeGallery();
      _movingFadeGallery.init(_pictureArray, _movementArray, _time, 930, 184);
      addChildAt(_movingFadeGallery, 0);
    }
    
    private function setupLogo():void{
      _logo = new Logo();
      _logo.x = 900;
      _logo.y = 30;
      addChild(_logo);
      Tweener.addTween(_logo, {x:765, time: 0.7, delay:1, transition:"easeinsine"});
    }
  }
}

koden til class'en MovingFadeGallery:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
package {
  
  import caurina.transitions.Tweener;
  import flash.display.Loader;
  import flash.display.MovieClip;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.ProgressEvent;
  import flash.display.Bitmap;
  import flash.net.URLRequest;
 
  public class MovingFadeGallery extends Sprite {
    
    private var _pictureArray:Array;
    private var _movementArray:Array;
    private var _movingFadeGallery:MovieClip;
    private var _initPreloader:Boolean = true;
    private var _numLoadedItems:Number = 0;
    private var _preloader:Preloader;
    private var _loader:Loader;
    private var _arrayContent:Array = [];
    private var _myDelay:Number;
    private var _movementTime:Number;
    private var _j:Number = 1;
    private var _theWidth:Number;
    private var _theHeight:Number;
    private var _initY:Number;
    private var _initX:Number;
    
    public function MovingFadeGallery() {
      //
    }
    
    public function init(firstArray:Array, secondArray:Array, delayTime:Number, theWidth:Number, theHeight:Number) {
      
      _movingFadeGallery = new MovieClip();
      _movingFadeGallery.buttonMode = true;
      
      _pictureArray = firstArray;
      _movementArray = secondArray;
      _myDelay = delayTime;
      _movementTime = delayTime;
      _theWidth = theWidth;
      _theHeight = theHeight;
            
      var switchexpression:Number = _pictureArray.length;
      switch(switchexpression) {
        case 1:
          setUpSeveralPictures();
          break;
        case 2:
          setUpSeveralPictures();
          break;
        default:
          setUpSeveralPictures();
      }
    }
    
    private function setUpSinglePicture():void {
      
      var l:Loader = new Loader();
      l.load(new URLRequest(_pictureArray[0]));
      
      _movingFadeGallery.addChild(l);
      
      addItToStage();     
    }
    
    private function setUpDoublePicture():void {
      
      var l:Loader = new Loader();
      l.load(new URLRequest(_pictureArray[0]));
      
      _movingFadeGallery.addChild(l);
      
      addItToStage();     
    }
    
    private function setUpSeveralPictures():void {
      
      var i:Number = 0;
      while(i < _pictureArray.length) {
        _loader = new Loader();
        _loader.alpha = 0;
        _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, showLoading);
        _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, doneLoading);                           
        _loader.load(new URLRequest(_pictureArray[i]));
      
        _arrayContent.push(_loader);
        
        _movingFadeGallery.addChild(_loader);
        i++
      }
    }   
    
    private function showLoading(e:Event):void {
      if(_initPreloader){
        _preloader = new Preloader();
        _preloader.x = 386;
        _preloader.y = 215;
        addChild(_preloader);
        _initPreloader = false;
      }
    }
    
    private function doneLoading(e:Event) {
      
      var bit:Bitmap = e.target.content
      if(bit != null){
        bit.smoothing = true;
      }
 
      _numLoadedItems++;
      
      if(_numLoadedItems == _pictureArray.length){
        _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, showLoading);
        _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, doneLoading);
        removeChild(_preloader);
      }
      correctOrderAndVisibility();
    }
    
    private function correctOrderAndVisibility():void {
      var i:Number = 0;
      while(i < _arrayContent.length) {
        _movingFadeGallery.addChild(_arrayContent[i]);
        i++;
      }
      //addChild(_pictureHolder);
      var bottomPicture = _movingFadeGallery.getChildAt(0);
      bottomPicture.alpha = 1;
      addItToStage();
      startAutofading();
    }
    
    //HER SÆTTES ALLE BILLEDERNE TIL AT FADE IND; DOG MED LØBENDE FORSINKELSE
    private function startAutofading():void {
      trace("function startAutofading");
      var i:Number = 0;
      var delay:Number = _myDelay;
      while(i < _arrayContent.length) {
        var theCurrentPicture = _movingFadeGallery.getChildAt(i);
        
        var theX:Number = 0;
        var theY:Number = 0;        
        
        var switchExpression:String = _movementArray[i];
 
        switch(switchExpression){
          case "n":
            theCurrentPicture.y = 0;
            theY = _theHeight - theCurrentPicture.height;
            break;
          case "s":
            theY = 0;
            theCurrentPicture.y = _theHeight - theCurrentPicture.height;
            break;
          case "e":
            theX = 0;
            theCurrentPicture.x = _theWidth - theCurrentPicture.width;
            break;
          case "w":
            theCurrentPicture.x = 0;
            theX = _theWidth - theCurrentPicture.width;
            break;
          case "nw":
            theCurrentPicture.y = 0;
            theCurrentPicture.x = 0;
            theY = _theHeight - theCurrentPicture.height;
            theX = _theWidth - theCurrentPicture.width;           
            break;
          case "ne":
            theCurrentPicture.y = 0;
            theCurrentPicture.x = _theWidth - theCurrentPicture.width;            
            theY = _theHeight - theCurrentPicture.height;
            theX = 0;           
            break;
          case "se":
            theCurrentPicture.x = _theWidth - theCurrentPicture.width;          
            theCurrentPicture.y = _theHeight - theCurrentPicture.height;
            theY = 0;
            theX = 0;           
            break;
          case "sw":
            theCurrentPicture.y = _theHeight - theCurrentPicture.height;
            theCurrentPicture.x = 0;
            theX = _theWidth - theCurrentPicture.width;
            theY = 0;
            break;            
          default:
            trace("default found");
        }
        
        if(i > 0) {
          if(i == 1){
            Tweener.addTween(theCurrentPicture, {alpha:1, time:1, delay:delay, transition:"linear", onComplete:fadedIn});
            Tweener.addTween(theCurrentPicture, {x:theX, y:theY, time:_movementTime, delay:delay+1,  transition:"easeinoutsine"});
            delay += _myDelay;
          } else {
            trace("i = "+i);
            Tweener.addTween(theCurrentPicture, {alpha:1, time:1, delay:delay+i, transition:"linear", onComplete:fadedIn});
            Tweener.addTween(theCurrentPicture, {x:theX, y:theY, time:_movementTime, delay:delay+i+1,  transition:"easeinoutsine"});
            delay += _myDelay;
          }
        } else {
          trace("first picture");
          _initX = theCurrentPicture.x;
          _initY = theCurrentPicture.y;
          Tweener.addTween(theCurrentPicture, {x:theX, y:theY, time:_movementTime, transition:"easeinoutsine", onComplete:moveBottomPictureBack});
        }
        i++;
      }
    }
    
    //HVER GANG ET BILLEDE ER FADED IN KØRES DENNE. NÅR ALLE BILLEDER ER FADEDE IN KØRES FUNKTIONEN hideMiddlePictures
    private function fadedIn():void {
      if(_j == _arrayContent.length -1){
        hideMiddlePictures();
        _j = 1;
      } else {
        _j++
      }
    }
    
    //ALLE BILLEDER UNDTAGET DET ØVERSTE OG DET NEDERSTE GØRES USYNLIGT
    private function hideMiddlePictures():void {
      var i:Number = 1;
      while(i < _arrayContent.length - 1) {
        var theCurrentPicture = _movingFadeGallery.getChildAt(i);
        theCurrentPicture.alpha = 0;
        i++;
      }
      restartAutofading();
    }
    
    //DET ØVERSTE BILLEDE FADES UD
    private function restartAutofading():void {
      var theCurrentPicture = _movingFadeGallery.getChildAt(_arrayContent.length - 1);
      var delay:Number = _myDelay;
      Tweener.addTween(theCurrentPicture, {alpha:0, time:1, delay:delay, transition:"linear", onComplete:startAutofading});
    }
    
    //NÅR DET ØVERSTE BILLEDE ER FADED UD SÅ STARTES DET HELE FORFRA
    private function fadedOut():void{
      startAutofading();
    }
    
    private function moveBottomPictureBack():void {
      var theCurrentPicture = _movingFadeGallery.getChildAt(0);
      if(_arrayContent.length == 1){
        Tweener.addTween(theCurrentPicture, {x:_initX, y:_initY, time:_movementTime, delay:1, transition:"easeinoutsine", onComplete:perhapsStartOver});
      } else {
        Tweener.addTween(theCurrentPicture, {x:_initX, y:_initY, time:.5, delay:1.5, transition:"easeinoutsine"});
      }
    }
    
    //DENNE FUNKTION BRUGES KUN NÅR DER KUN FINDES 1 BILLEDE PÅ STAGE
    private function perhapsStartOver():void {
      if(_arrayContent.length == 1){
        trace("der er kun et billede på stage!");
        var theCurrentPicture = _movingFadeGallery.getChildAt(0);
        Tweener.addTween(theCurrentPicture, {alpha:1, time:1, transition:"linear", onComplete:startAutofading});
      }
    }
    
    private function addItToStage():MovieClip {
      addChild(_movingFadeGallery);
      return _movingFadeGallery;
    }
 
  }
}