Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 19-08-2003, 16:44   #1 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Unhappy function-zugriffs-konflickte

Hi, Leute.

Ich habe auf _Level0 eine function liegen, auf die drei Schaltflächen zugreifen, wenn man mit der Maus darüberrollt.
Diese function soll die Farbwerte der jeweiligen Schaltfläche dynamisch und mit fließendem Übergang verändern.

Wenn ich über eine Schalfläche rolle, dann geht alles glatt.
Rolle ich aber schnell über mehrere Schaltflächen, dann kommt die function durcheinander mit den Farbwerten und es gibt ein heilloses durcheinander.

Wie kann ich es schaffen, daß es kein Durcheinander gibt?
Mit einer Klasse, oder sowas? Wie stelle ich das an?
__________________
AS3 Lernhilfen
TheFreeman ist offline   Mit Zitat antworten
Alt 19-08-2003, 17:06   #2 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
hmm, machst du das in einer Rekursion?
Wie übergibst du die Refernz für das aktuelle Objekt?

Möglicherweise überschreibst du beim schnellen Drüberfahren immer wieder die Objektreferenz, sodass immer ein anderes Objekt angesprochen wird.

Könntest du die Funktion mal posten?

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 20-08-2003, 09:14   #3 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Also hier ist die Funktion, die von den Schaltflächen aufgerufen wird:

ActionScript:
  1. // Farbwechsel für die Schaltflächen
  2. function fwechsel1(co,sc,nc,st){
  3.         cnt=0;
  4.         this.startColor = sc;
  5.         this.newColor = nc;
  6.         this.col = new Color(_root[co]); // Farb-Objekt
  7.         this.col.setRGB(parseInt(this.startColor,16))// setzen des Startwerts
  8.         this.steps = st;
  9.         this.r = parseInt(this.startColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Startwerts
  10.         this.g = parseInt(this.startColor.substr(2,2),16);
  11.         this.b = parseInt(this.startColor.substr(4,2),16);
  12.        
  13.         this.newR = parseInt(this.newColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Endwerts
  14.         this.newG = parseInt(this.newColor.substr(2,2),16);
  15.         this.newB = parseInt(this.newColor.substr(4,2),16);
  16.        
  17.         this.diffR = (this.r - this.newR) / this.steps; // Berechnung der Differenzen
  18.         this.diffG = (this.g - this.newG) / this.steps;
  19.         this.diffB = (this.b - this.newB) / this.steps;
  20.  
  21.     this.onEnterFrame = function(){
  22.             cnt++;
  23.             if(cnt < this.steps+1) {
  24.                 this.rgb = this.col.getRGB().toString(16); // aktuelle Farbe auslesen
  25.                 this.r = parseInt(this.rgb.substr(0,2),16);
  26.                 this.g = parseInt(this.rgb.substr(2,2),16);
  27.                 this.b = parseInt(this.rgb.substr(4,2),16);
  28.                 this.newR = Math.floor(this.r-this.diffR).toString(16);
  29.                 this.newG = Math.floor(this.g-this.diffG).toString(16);
  30.                 this.newB = Math.floor(this.b-this.diffB).toString(16);
  31.                 if(this.newR.length == 1) this.newR = "0" + this.newR;
  32.                 if(this.newG.length == 1) this.newG = "0" + this.newG;
  33.                 if(this.newB.length == 1) this.newB = "0" + this.newB;
  34.                 this.newColString = this.newR + this.newG + this.newB;    // neue Farbe zusammensetzen und zuweisen
  35.                 this.col.setRGB(parseInt(this.newColString,16));
  36.             }else{
  37.                 cnt=0;
  38.                 delete this.onEnterFrame;   
  39.             }
  40.     }
  41. }

Und hier ist der Aufruf von einer Schalfläche:

ActionScript:
  1. send.onRollOver = function(){
  2.     fwechsel1("send", _root.Farbe1, _root.Farbe2, _root.Stufen);
  3. }

Vielen Dank für Deine schnelle Antwort.
__________________
AS3 Lernhilfen
TheFreeman ist offline   Mit Zitat antworten
Alt 20-08-2003, 09:29   #4 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi
so wie ich das sehe überschreibst du die varablen und den onenterframe bei jedem onrollover.
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 20-08-2003, 09:46   #5 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
Du verwendest in deiner Funktion die Referenz auf this.
Da diese Funktion auf der HZL liegt, ist this in diesem Fall immer _root. resp. _level0....

Du willst aber doch sicherlich das auslösende Objekt als Referenz nehmen.
Übergib sinnvollerweise nicht den Namen "send" des Objekts, sondern das Objekt selbst:

send.onRollOver = function() {
fwechsel1(this, _root.Farbe1, _root.Farbe2, _root.Stufen);
}

In der Funktion arbeitest du dann nicht mit this, sondern mit co, also deiner Objekt-Referenz.

So, wie es jetzt ist, bekommt auch immer _level0 den onEnterFrame, nicht die Instanz...daher das Kuddelmuddel.-..

Grüße
Sascha

PS: hab mir den restlichen Code jetzt nicht weiter angesehen, check das vielleicht erstmal.
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 20-08-2003, 10:02   #6 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Zitat:
Geschrieben von HAY
hi
so wie ich das sehe überschreibst du die varablen und den onenterframe bei jedem onrollover.
Ja, das weiß ich. Deswegen frage ich nach einer eleganten Lösung.

Zitat:
Geschrieben von ludabruda
Du verwendest in deiner Funktion die Referenz auf this.
Da diese Funktion auf der HZL liegt, ist this in diesem Fall immer _root. resp. _level0....

Du willst aber doch sicherlich das auslösende Objekt als Referenz nehmen.
Übergib sinnvollerweise nicht den Namen "send" des Objekts, sondern das Objekt selbst:

send.onRollOver = function() {
fwechsel1(this, _root.Farbe1, _root.Farbe2, _root.Stufen);
}


Das funzt aber nicht so wie vorgesehen, da Flash dann den Haupfilm in die Farben setzt.

Zitat:
Geschrieben von ludabruda
In der Funktion arbeitest du dann nicht mit this, sondern mit co, also deiner Objekt-Referenz.

So, wie es jetzt ist, bekommt auch immer _level0 den onEnterFrame, nicht die Instanz...daher das Kuddelmuddel.-..
Das funzt auch nicht richtig.

Kann ich das nicht mit Klassen lösen, oder so?
__________________
AS3 Lernhilfen

Geändert von TheFreeman (20-08-2003 um 10:05 Uhr)
TheFreeman ist offline   Mit Zitat antworten
Alt 20-08-2003, 10:29   #7 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi
wen du das weißst dann must du machen
änder mal die ganzen "this" in "this[co]"
ActionScript:
  1. this[co].cnt=0;
  2.         this[co].startColor = sc;
  3.         this[co].newColor = nc;
  4.         this[co].col = new Color(this[co]); // Farb-Objekt
  5.         this[co].col.setRGB(parseInt(this[co].startColor,16))// setzen des Startwerts
  6.         this[co].steps = st;
  7.         this[co].r = parseInt(this[co].startColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Startwerts
  8.         this[co].g = parseInt(this[co].startColor.substr(2,2),16);
  9.         this[co].b = parseInt(this[co].startColor.substr(4,2),16);
  10.        
  11.         this[co].newR = parseInt(this[co].newColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Endwerts
  12.         this[co].newG = parseInt(this[co].newColor.substr(2,2),16);
  13.         this[co].newB = parseInt(this[co].newColor.substr(4,2),16);
  14.        
  15.         this[co].diffR = (this[co].r - this[co].newR) / this[co].steps; // Berechnung der Differenzen
  16.         this[co].diffG = (this[co].g - this[co].newG) / this[co].steps;
  17.         this[co].diffB = (this[co].b - this[co].newB) / this[co].steps;
  18.        
  19.         this[co].onEnterFrame = function(){
bis hier und dann
ActionScript:
  1. send.onRollOver = function(){
  2.             fwechsel1("send", _root.Farbe1, _root.Farbe2, _root.Stufen);
  3. }
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 20-08-2003, 10:31   #8 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
wieso, geht doch?!

ActionScript:
  1. function fwechsel1(co,sc,nc,st){
  2.         cnt=0;
  3.         co.startColor = sc;
  4.         co.newColor = nc;
  5.         co.col = new Color(_root[co._name]); // Farb-Objekt
  6.         co.col.setRGB(parseInt(co.startColor,16))// setzen des Startwerts
  7.         co.steps = st;
  8.         co.r = parseInt(co.startColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Startwerts
  9.         co.g = parseInt(co.startColor.substr(2,2),16);
  10.         co.b = parseInt(co.startColor.substr(4,2),16);
  11.        
  12.         co.newR = parseInt(co.newColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Endwerts
  13.         co.newG = parseInt(co.newColor.substr(2,2),16);
  14.         co.newB = parseInt(co.newColor.substr(4,2),16);
  15.        
  16.         co.diffR = (co.r - co.newR) / co.steps; // Berechnung der Differenzen
  17.         co.diffG = (co.g - co.newG) / co.steps;
  18.         co.diffB = (co.b - co.newB) / co.steps;
  19.             
  20.         co.cnt = 0;
  21.         co.onEnterFrame = function(){
  22.                 this.cnt++;
  23.                 if(this.cnt < this.steps+1) {
  24.                         this.rgb = this.col.getRGB().toString(16); // aktuelle Farbe auslesen
  25.                         this.r = parseInt(this.rgb.substr(0,2),16);
  26.                         this.g = parseInt(this.rgb.substr(2,2),16);
  27.                         this.b = parseInt(this.rgb.substr(4,2),16);
  28.                         this.newR = Math.floor(this.r-this.diffR).toString(16);
  29.                         this.newG = Math.floor(this.g-this.diffG).toString(16);
  30.                         this.newB = Math.floor(this.b-this.diffB).toString(16);
  31.                         if(this.newR.length == 1) this.newR = "0" + this.newR;
  32.                         if(this.newG.length == 1) this.newG = "0" + this.newG;
  33.                         if(this.newB.length == 1) this.newB = "0" + this.newB;
  34.                         this.newColString = this.newR + this.newG + this.newB;    // neue Farbe zusammensetzen und zuweisen
  35.                         this.col.setRGB(parseInt(this.newColString,16));
  36.                 }else{
  37.                         this.cnt=0;
  38.                         delete this.onEnterFrame;
  39.                 }
  40.         }
  41. }
  42.  
  43. send.onRollOver = function(){
  44.         fwechsel1(this, _root.Farbe1, _root.Farbe2, _root.Stufen);
  45. }

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 20-08-2003, 14:03   #9 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Die Lösung von hudabruda geht nicht, weil sich da immer _level0 angesprochen fühlt.

Und die Lösung von Hay sollte eigentlich funktionieren, tut sie aber nicht.
Ich habe nun folgendes gemacht:

ActionScript:
  1. movieClip.prototype.fwechsel1 = function(co,sc,nc,st){
  2.     trace(this[co]);
  3.         this[co].cnt=0;
  4.         this[co].startColor = sc;
  5.         this[co].newColor = nc;
  6.         this[co].col = new Color(this[co]); // Farb-Objekt
  7.         this[co].col.setRGB(parseInt(this[co].startColor,16))// setzen des Startwerts
  8.         this[co].steps = st;
  9.         this[co].r = parseInt(this[co].startColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Startwerts
  10.         this[co].g = parseInt(this[co].startColor.substr(2,2),16);
  11.         this[co].b = parseInt(this[co].startColor.substr(4,2),16);
  12.        
  13.         this[co].newR = parseInt(this[co].newColor.substr(0,2),16); // ermitteln der einzelnen Komponenten des Endwerts
  14.         this[co].newG = parseInt(this[co].newColor.substr(2,2),16);
  15.         this[co].newB = parseInt(this[co].newColor.substr(4,2),16);
  16.        
  17.         this[co].diffR = (this[co].r - this[co].newR) / this[co].steps; // Berechnung der Differenzen
  18.         this[co].diffG = (this[co].g - this[co].newG) / this[co].steps;
  19.         this[co].diffB = (this[co].b - this[co].newB) / this[co].steps;
  20.  
  21.     this[co].onEnterFrame = function(){
  22.             this.cnt++;
  23.             if(this.cnt < this.steps+1) {
  24.                 trace(this);
  25.                 this.rgb = this.col.getRGB().toString(16); // aktuelle Farbe auslesen
  26.                 this.r = parseInt(this.rgb.substr(0,2),16);
  27.                 this.g = parseInt(this.rgb.substr(2,2),16);
  28.                 this.b = parseInt(this.rgb.substr(4,2),16);
  29.                 this.newR = Math.floor(this.r-this.diffR).toString(16);
  30.                 this.newG = Math.floor(this.g-this.diffG).toString(16);
  31.                 this.newB = Math.floor(this.b-this.diffB).toString(16);
  32.                 if(this.newR.length == 1) this.newR = "0" + this.newR;
  33.                 if(this.newG.length == 1) this.newG = "0" + this.newG;
  34.                 if(this.newB.length == 1) this.newB = "0" + this.newB;
  35.                 this.newColString = this.newR + this.newG + this.newB;    // neue Farbe zusammensetzen und zuweisen
  36.                 this.col.setRGB(parseInt(this.newColString,16));
  37.             }else{
  38.                 this.cnt=0;
  39.                 delete this.onEnterFrame;   
  40.             }
  41.     }
  42. }

Er legt Eventhandler nicht an bzw. führt den Eventhandler nicht aus. Warum denn nicht. Der Pfad stimmt doch.

Es gibt keinen Übergang, sondern ein spontanes Farbwechseln.
__________________
AS3 Lernhilfen
TheFreeman ist offline   Mit Zitat antworten
Alt 20-08-2003, 14:29   #10 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
also, bei mir funktioniert es so, wie ich es gepostet habe.
_level0 wird eben nicht angesprochen, weil ich ein Objekt übergebe, welches ich dann verwende.

Bei deinem Prototype brauchst du wohl wiederum nur this, da es einen direkten Bezug zum Objekt gibt; diese Funktion ist ja quasi ein Bestandteil deines Objekts.

Ich hab meins nochmal angehangen, wie es bei mir funktioniert.

Grüße
Sascha
Angehängte Dateien
Dateityp: zip farbbutton.zip (2,7 KB, 2x aufgerufen)
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 20-08-2003, 14:54   #11 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Naja, wenn ich Deine Scripts bei mir übertrage, dann funzt es nicht mehr.

Wie ich es im vorhergehenden Threat geschrieben habe, wird der EnterFrame _ Handler nicht angelegt. :-(

Ich dreh noch durch. Ich kapiers nicht.
__________________
AS3 Lernhilfen
TheFreeman ist offline   Mit Zitat antworten
Alt 20-08-2003, 15:26   #12 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
dabb schick doch mal deine fla...

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 21-08-2003, 12:56   #13 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Na gut. Hier ist es:
Angehängte Dateien
Dateityp: rar farben2.rar (4,0 KB, 3x aufgerufen)
__________________
AS3 Lernhilfen
TheFreeman ist offline   Mit Zitat antworten
Alt 22-08-2003, 11:20   #14 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
Hi,

ich habe dir meine Version angehngen, die funktioniert.
Ich habe wiederum direkt das Objekt übergeben.

Das eigentliche Problem ist aber, dass deine Objekte Schaltflächen waren und keine MCs. Die kennen natürlich auch kein onEnterFrame....

Grüße
Sascha
Angehängte Dateien
Dateityp: zip farb_button.zip (4,8 KB, 2x aufgerufen)
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 22-08-2003, 16:36   #15 (permalink)
Gedankengestalter
 
Benutzerbild von TheFreeman
 
Registriert seit: May 2002
Ort: Bayern
Beiträge: 486
Vielen Dank.

Das wußt ich noch nicht !

Du hast mir sehr geholfen.
__________________
AS3 Lernhilfen
TheFreeman 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 13:33 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele