Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 15-10-2004, 15:20   #1 (permalink)
doofer Nickname...
 
Benutzerbild von Axel Sartorius
 
Registriert seit: Jul 2001
Ort: Dortmund
Beiträge: 2.337
Problem: loading & tweening mehrerer Dateien

Hallo Forum,
beisse mir jetzt seit Tagen die Zähne an folgendem Problem aus:
Ich lade mit Hilfe Bokels LoaderClass drei jpgs in drei MC in denen wiederum jeweils ein "holder"-MC sowie ein Hintergrund-MC liegen.
Der Hintergrund-MC wird - nachdem der Ladevorgang abgeschlossen ist - sanft aufskaliert.

Solange ich nur ein oder zwei JPG lade ist alles kein Problem, sobald ich mehrere laden will, wird es sehr buggy...

Das Problem liegt unter anderem darin, daß die Tweenfunktion nicht mehr als einen MC gleichzeitig tweenen kann.
Der jetzige Ansatz sieht so aus, daß erst dann der Hintergrund eines frisch geladenen MC durch die Tweenfunktion geschickt wird, sobald diese das Tweening des vorhergehenden abgeschlossen hat.

Funzt aber auch nicht 100%ig, da z.B. offline der Ladevorgang der drei jpgs so schnell abgeschlossen ist, daß Hintergrund von jpg 1 noch getweent wird und jpg 3 bereits fertig geladen ist. Der Effekt: Es werden nur die Tweenings für jpg1 und jpg3 durchgeführt, jpg2 bleibt auf der Strecke.

Sobald ich mit dem Webspeedsimulator von xat.com ein 56k Modem simuliere funzt es logischerweise wunderbar, aber ich will jetzt nicht die Breitbandsurfer verärgern und evtl. soll das ganze auch mal Offline auf CD laufen können.

Ok, hier mal die relevanten Teile des Skripts:
ActionScript:
  1. //==================LOADER CLASS========================
  2. #include "com.qlod.LoaderClass.as"
  3.  
  4. myLoader = new com.qlod.LoaderClass();
  5.  
  6. //Listener-Objekt erstellen:
  7. loadListener = new Object();
  8.  
  9. /*onLoadComplete übergibt die Layout-Werte erst einmal an die Funktion startWatch, diese
  10. startet wiederum die Funktion resizeMC:
  11. */
  12. loadListener.onLoadComplete = function(success, loaderObj){
  13.     var tg = loaderObj.getTarget();
  14.     var targ = eval(tg.substr(0,5));
  15.     var tgt = tg.substr(0,5);
  16.     switch (tgt.slice(-1))
  17.             {
  18.             case "1":
  19.             mcwidth = layout [0][0][0];
  20.             mcheight = layout [0][0][1];
  21.             break;
  22.             case "2":
  23.             mcwidth = layout [0][1][0];
  24.             mcheight = layout [0][1][1];
  25.             break;
  26.             case "3":
  27.             mcwidth = layout [0][2][0];
  28.             mcheight = layout [0][2][1];
  29.             break;
  30.              }
  31.     startWatch(targ.bg, mcwidth, mcheight);
  32. }
  33. //==================================================
  34. // ===================CONTENT============================
  35. _global.ready = true;
  36. this.createEmptyMovieClip("watcher", 1000);
  37. /*Funktion startWatch, um die MCs nacheinander durch die resizeMC-Funktion zu
  38. schicken, da ein mehrfacher, gleichzeitiger Aufruf von resizeMC auch nicht geht.
  39. Leider werden die einzelnen Bilder offline so schnell geladen, daß resizeMC noch
  40. den ersten MC tweent, in der Zwischenzeit bereits aber die beiden anderen geladen sind.
  41. Das Resultat: Offline wird nur der erste und der dritte MC getweent und angezeigt*/
  42. startWatch = function(mc, targetwidth, targetheight){
  43.     watcher.mc = mc;
  44.     watcher.tgWidth = targetwidth;
  45.     watcher.tgHheight = targetheight;
  46.     watcher.onEnterFrame = function(){
  47.             if (ready){
  48.             resizeMC(this.mc, this.tgWidth, this.tgHheight);
  49.             delete this.onEnterFrame;
  50.         }
  51.     }
  52. }
  53. //============== TWEENFUNKTION =====================
  54. Math.easeOutCubic = function (t, b, c, d) {
  55.     return c*((t=t/d-1)*t*t + 1) + b;
  56. };
  57. //==================== FUNKTION RESIZE-MC ===========================
  58.  
  59. resizeMC = function (mc, targetwidth, targetheight)
  60. {
  61.         //Ausgangsgröße
  62.         mc._visible = true;
  63.         mc.startWidth = mc._width;
  64.         mc.startHeight = mc._height;
  65.         //Zielgröße
  66.         mc.zielWidth = targetwidth;
  67.         mc.zielHeight = targetheight;
  68.         mc.changeWidth = mc.zielWidth - mc.startWidth;
  69.         mc.changeHeight = mc.zielHeight - mc.startHeight;
  70.         mc.duration = 20;
  71.         mc.time = 0;
  72.         mc.onEnterFrame  = function()
  73.         {
  74.             ready = false;
  75.                 with (this)
  76.                 {
  77.                    
  78.                     _width = Math.easeOutCubic(time++, startWidth, changeWidth, duration);
  79.                     _height = Math.easeOutCubic(time++, StartHeight, changeHeight, duration);
  80.                     if (time > duration)
  81.                     {
  82.                         switch (_parent._name.slice(-1))
  83.                         {      
  84.                         case "1":
  85.                         _parent.holder._x = this._x + 5;
  86.                         _parent.holder._y = this._y + 5;
  87.                         break;
  88.                         case "2":
  89.                         _parent.holder._x = (this._width - 5) * (-1);
  90.                         _parent.holder._y = this._y + 5;
  91.                         break;
  92.                         case "3":
  93.                         _parent.holder._x = this._x + 5;
  94.                         _parent.holder._y = (this._height - 5) * (-1);
  95.                         break;
  96.                         }
  97.                    
  98.                                        
  99.                     fadeIn(_parent.holder);
  100.                     delete onEnterFrame;
  101.                     }
  102.             }
  103.         }
  104. }
  105. this.createEmptyMovieClip("blender", 5);
  106. fadeIn = function(mc)
  107. {
  108.     blender.onEnterFrame = function()
  109.     {
  110.         if (mc._alpha<99)
  111.         {
  112.             mc._alpha += 9;
  113.         }
  114.         else
  115.         {
  116.             mc._alpha = 99;
  117.             ready = true;
  118.             delete this.onEnterFrame;
  119.         }
  120.     }
  121. }
  122. //===============================================================
  123. //================CONTAINER ERSTELLUNG===========================
  124. /* insgesamt werden 3 MC erzeugt, diese enthalten jeweils einen sogenannten
  125.    "holder" in den die Bilder geladen werden, sowie einen Hintergrund-MC ("bg").
  126.    Dieser Hintergund-MC wird später durch die ResizeMC-Funktion geschickt*/
  127. var contAnz = 3;
  128. for (j = 1;j < contAnz+1;j++){
  129. this.createEmptyMovieClip("cont"+j, j);
  130. //Zeichne den Hintergrund in MC "bg":
  131. this["cont"+j].createEmptyMovieClip("bg", 1);
  132. //... hier folgte noch Skript für das Zeichnen der Hintergründe, habe ich euch mal erspart...
  133. this["cont"+j].createEmptyMovieClip("holder",2);
  134. this["cont"+j].holder._alpha = 1;
  135. }
  136. //===========================================================
  137. //===========================LAYOUT===========================
  138. /*Mehrdimensionaler Array mit Angaben zur Zielbreite und -höhe der Content-Container (3 versch. Layouts),
  139. z.Zeit wird nur layA1-layA3 verwendet*/
  140. layA1=[205,229];
  141. layA2=[345,229];
  142. layA3=[550, 80];
  143. layB1=[275,180];
  144. layB2=[275,180];
  145. layB3=[550,129];
  146. layC1=[300,150];
  147. layC2=[250,150];
  148. layC3=[550,159];
  149. layA=[layA1,layA2,layA3];
  150. layB=[layB1,layB2,layB3];
  151. layC=[layC1,layC2,layC3];
  152. layout=[layA,layB,layC];
  153.  
  154. //====================================================
  155. //=========== LADE CONTENT ==================
  156. myLoader.load("cont1.holder", "pix/left.jpg", loadListener);
  157. myLoader.load("cont2.holder", "pix/right.jpg", loadListener);
  158. myLoader.load("cont3.holder", "pix/foot1.jpg", loadListener);
Ok, ok ist viel Holz, aber vielleicht hat jemand neben der Problemlösung noch ein paar tipps, wie man das ganze effizienter schreiben könnte? Bzw. einen ganz anderen Lösungsansatz im Ärmel?
Im Prinzip sollen nur die jpgs in container mit alpha = 1 geladen werden. Dann
soll sich der Hintergrund entsprechend der Layoutvorgaben getweent skalieren, das jpg in seinem Container bzgl. des skalierten Hintergrundes neu positionieren und dann langsam einblenden.

Für alle die das Wochenende noch nix vorhaben stell ich auch mal die *.fla hier rein :

Gruß und Dank an alle fleissigen Bienen da draussen!
Angehängte Dateien
Dateityp: zip prob.zip (34,6 KB, 6x aufgerufen)
__________________
Q:What happens if we nuke Great Cthulhu?
A: He reforms 20 Minutes later - but now he's RADIOACTIVE!

Geändert von Axel Sartorius (15-10-2004 um 15:29 Uhr)
Axel Sartorius ist offline   Mit Zitat antworten
Alt 15-10-2004, 16:38   #2 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
Zitat:
Das Problem liegt unter anderem darin, daß die Tweenfunktion nicht mehr als einen MC gleichzeitig tweenen kann.

....dann ist das eine schaißfunktion

definier sie als movieclip.prototype...blabla und handle sie entsprechend.
grz
warrantmaster ist offline   Mit Zitat antworten
Alt 15-10-2004, 17:02   #3 (permalink)
doofer Nickname...
 
Benutzerbild von Axel Sartorius
 
Registriert seit: Jul 2001
Ort: Dortmund
Beiträge: 2.337
Zitat:
Zitat von warrantmaster
....dann ist das eine schaißfunktion
Hi warrant!
Ich liebe Deine direkten Formulierungen
Aber Du hast natürlich recht und ich manchmal ein Brett vorm Kopp
btw: Haste noch weitere Verbesserungsvorschläge im Ärmel?
__________________
Q:What happens if we nuke Great Cthulhu?
A: He reforms 20 Minutes later - but now he's RADIOACTIVE!
Axel Sartorius ist offline   Mit Zitat antworten
Alt 15-10-2004, 17:11   #4 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
@axel

Zitat:
btw: Haste noch weitere Verbesserungsvorschläge im Ärmel?

...dann müßte ich ja erst dein script lesen...

muß jetzt aber wech...(freitags-billard)....

btw, was funzt ist gut ! (verbessern/optimieren kann man so ziemlich alles)

grz&prost
warrantmaster ist offline   Mit Zitat antworten
Alt 15-10-2004, 18:12   #5 (permalink)
doofer Nickname...
 
Benutzerbild von Axel Sartorius
 
Registriert seit: Jul 2001
Ort: Dortmund
Beiträge: 2.337
Wie, Du führst noch ein reales Leben neben Deinem Rechner???
__________________
Q:What happens if we nuke Great Cthulhu?
A: He reforms 20 Minutes later - but now he's RADIOACTIVE!

Geändert von Axel Sartorius (15-10-2004 um 18:14 Uhr)
Axel Sartorius ist offline   Mit Zitat antworten
Alt 15-10-2004, 21:04   #6 (permalink)
doofer Nickname...
 
Benutzerbild von Axel Sartorius
 
Registriert seit: Jul 2001
Ort: Dortmund
Beiträge: 2.337
So, hab jetzt mal gemäß warrants vorschlag 'nen Prototypen daraus gebastelt - allerdings erbt bei gleichzeitigem Tweening von drei MC der erste und zweite MC die Parameter des dritten MC. Wo steckt mein Fehler
ActionScript:
  1. //============== TWEENFUNKTION =====================
  2. Math.easeOutCubic = function (t, b, c, d) {
  3.     return c*((t=t/d-1)*t*t + 1) + b;
  4. };
  5. //==================== FUNKTION RESIZE-MC ===========================
  6.  
  7. MovieClip.prototype.resize = function (targetwidth, targetheight)
  8. {
  9.    
  10.     with (this)
  11.     {
  12.         //Ausgangsgröße
  13.         _visible = true;
  14.         startWidth = _width;
  15.         startHeight = _height;
  16.         //Zielgröße
  17.         zielWidth = targetwidth;
  18.         zielHeight = targetheight;
  19.         changeWidth = zielWidth - startWidth;
  20.         changeHeight = zielHeight - startHeight;
  21.         duration = 40;
  22.         time = 0;
  23.     }
  24.         this.onEnterFrame  = function()
  25.         {
  26.             this._width = Math.easeOutCubic(time++, startWidth, changeWidth, duration);
  27.             this._height = Math.easeOutCubic(time++, StartHeight, changeHeight, duration);
  28.                 if (time > duration)
  29.                 {
  30.                     switch (this._parent._name.slice(-1))
  31.                     {      
  32.                     case "1":
  33.                     this._parent.holder._x = this._x + 5;
  34.                     this._parent.holder._y = this._y + 5;
  35.                     break;
  36.                     case "2":
  37.                     this._parent.holder._x = (this._width - 5) * (-1);
  38.                     this._parent.holder._y = this._y + 5;
  39.                     break;
  40.                     case "3":
  41.                     this._parent.holder._x = this._x + 5;
  42.                     this._parent.holder._y = (this._height - 5) * (-1);
  43.                     break;
  44.                     }            
  45.                 delete this.onEnterFrame;
  46.             }
  47.        
  48.        
  49.     }
  50. }
  51.  
  52. //===============================================================
  53. //================CONTAINER ERSTELLUNG===========================
  54. /* insgesamt werden 3 MC erzeugt, diese enthalten jeweils einen sogenannten
  55.    "holder" in den die Bilder geladen werden, sowie einen Hintergrund-MC ("bg").
  56.    Dieser Hintergund-MC wird später durch die ResizeMC-Funktion geschickt*/
  57. var contAnz = 3;
  58. for (j = 1;j < contAnz+1;j++){
  59. this.createEmptyMovieClip("cont"+j, j);
  60. //Zeichne den Hintergrund in MC "bg":
  61. this["cont"+j].createEmptyMovieClip("bg", 1);
  62. this["cont"+j].bg.lineStyle(0,0x8D0C0C,80);
  63. this["cont"+j].bg.beginFill(0x800B0B,65);
  64. this["cont"+j].bg.moveTo(0, 0);
  65. //Um von links nach rechts bzw. rechts nach links und von unten nach oben
  66. // zu tweenen, muss der Registerpunkt für jeden "bg"-MC woanders angelegt sein:
  67. switch (j){
  68.     case 1:
  69.     this["cont"+j].bg.lineTo(100,0);
  70.     this["cont"+j].bg.lineStyle(0,0x2C0303,80);
  71.     this["cont"+j].bg.lineTo(100,100);
  72.     this["cont"+j].bg.lineTo(0,100);
  73.     this["cont"+j].bg.lineStyle(0,0x8D0C0C,80);
  74.     break;
  75.     case 2:
  76.     this["cont"+j].bg.lineTo(-100,0);
  77.     this["cont"+j].bg.lineTo(-100,100);
  78.     this["cont"+j].bg.lineStyle(0,0x2C0303,80);
  79.     this["cont"+j].bg.lineTo(0,100);
  80.     break;
  81.     case 3:
  82.     this["cont"+j].bg.lineStyle(0,0x2C0303,80);
  83.     this["cont"+j].bg.lineTo(100,0);
  84.     this["cont"+j].bg.lineTo(100,-100);
  85.     this["cont"+j].bg.lineStyle(0,0x8D0C0C,80);
  86.     this["cont"+j].bg.lineTo(0,-100);
  87.     break;
  88. }
  89. this["cont"+j].bg.lineTo(0,0);
  90. this["cont"+j].bg.endFill();
  91. this["cont"+j].bg._width = 20;
  92. this["cont"+j].bg._height = 20;
  93. }
  94. //Container-Positionierung:
  95. cont1._x = 0;
  96. cont1._y = 31;
  97. cont1.bg._visible = false;
  98. cont2._x = 550;
  99. cont2._y= 31;
  100. cont2.bg._visible = false;
  101. cont3._x = 0;
  102. cont3._y = 339;
  103. cont3.bg._visible = false;
  104. //===========================================================
  105.  
  106. cont1.bg.resize(205, 229);
  107. cont2.bg.resize(345, 229);
  108. cont3.bg.resize(300, 80);
Angehängte Dateien
Dateityp: zip proto.zip (6,6 KB, 8x aufgerufen)
__________________
Q:What happens if we nuke Great Cthulhu?
A: He reforms 20 Minutes later - but now he's RADIOACTIVE!
Axel Sartorius ist offline   Mit Zitat antworten
Alt 16-10-2004, 14:21   #7 (permalink)
doofer Nickname...
 
Benutzerbild von Axel Sartorius
 
Registriert seit: Jul 2001
Ort: Dortmund
Beiträge: 2.337
Hab mir die Werte mal tracen lassen:
Obwohl die Variable targetwidth je nach MC auch nach Start des enterFrames ihre unterschiedlichen Werte beibehält, werden die Werte der anderen Variablen an die Parameter des zuletzt gestarteten MC angeglichen.

Die MC bekommen folgende Parameter mit auf den Weg:
ActionScript:
  1. cont1.bg.resize(205, 229);
  2. cont2.bg.resize(345, 229);
  3. cont3.bg.resize(300, 80);

Trace gibt mir dann folgendes aus:

cont1.bg: targetwidth=205 changewidth=280 zielWidth=300
cont2.bg: targetwidth=345 changewidth=280 zielWidth=300
cont3.bg: targetwidth=300 changewidth=280 zielWidth=300


hier nochmal die relevanten Skriptstellen:
ActionScript:
  1. MovieClip.prototype.resize = function (targetwidth, targetheight)
  2. {
  3.    
  4.     with (this)
  5.     {
  6.         //Ausgangsgröße
  7.         _visible = true;
  8.         startWidth = _width;
  9.         startHeight = _height;
  10.         //Zielgröße
  11.         zielWidth = targetwidth;
  12.         zielHeight = targetheight;
  13.         changeWidth = zielWidth - startWidth;
  14.         changeHeight = zielHeight - startHeight;
  15.         duration = 40;
  16.         time = 0;
  17.     }
  18.         this.onEnterFrame  = function()
  19.         {
  20.             this._width = Math.easeOutCubic(time++, startWidth, changeWidth, duration);
  21.             this._height = Math.easeOutCubic(time++, StartHeight, changeHeight, duration);
  22.                 if (time > duration)
  23.                 {
  24.                 delete this.onEnterFrame;
  25.             }   
  26.     }
  27. }

Bin ratlos...
__________________
Q:What happens if we nuke Great Cthulhu?
A: He reforms 20 Minutes later - but now he's RADIOACTIVE!

Geändert von Axel Sartorius (16-10-2004 um 14:25 Uhr)
Axel Sartorius ist offline   Mit Zitat antworten
Alt 17-10-2004, 13:41   #8 (permalink)
doofer Nickname...
 
Benutzerbild von Axel Sartorius
 
Registriert seit: Jul 2001
Ort: Dortmund
Beiträge: 2.337
Eigentlich machen diese Selbstgespräche keinen Spass, ich hab's aber nichts destotrotz gelöst. Vielleicht wills ja der eine oder andere ebenfals Wissen. Der Haken lag natürlich am Scoping, war mir auch ziemlich schnell klar, nur wie sieht der richtige Scope aus? Hier isser:

ActionScript:
  1. MovieClip.prototype.resize = function (targetwidth, targetheight)
  2. {
  3. //Ausgangsgröße
  4. this._visible = true;
  5. this.startWidth = this._width;
  6. this.startHeight = this._height;
  7. //Zielgröße
  8. this.zielWidth = targetwidth;
  9. this.zielHeight = targetheight;
  10. this.changeWidth = this.zielWidth - this.startWidth;
  11. this.changeHeight = this.zielHeight - this.startHeight;
  12. this.duration = 40;
  13. this.time = 0;
  14.     this.onEnterFrame  = function()
  15.     {
  16.         with (this)
  17.                {
  18.        
  19.         _width = Math.easeOutCubic(time++, startWidth, changeWidth, duration);
  20.         _height = Math.easeOutCubic(time++, StartHeight, changeHeight, duration);
  21.               if (time > duration)
  22.             {            
  23.               delete onEnterFrame;
  24.             }
  25.         }
  26.     }
  27. }
  28. //Aufruf:
  29. cont1.bg.resize(205,229);
  30. cont2.bg.resize(345, 229);
  31. cont3.bg.resize(550, 80);

Alles wird gut
__________________
Q:What happens if we nuke Great Cthulhu?
A: He reforms 20 Minutes later - but now he's RADIOACTIVE!
Axel Sartorius 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



Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele