Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-04-2007, 00:31   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2006
Beiträge: 32
Question onEnterFrame wird nicht beendet - bedingung zum abbruch falsch?

Hi,

sitz grad mal wieder ne Ewigkeit und finde den/die Fehler nicht.

Vorab: der Prototyp funktioniert - bis auf zwei Kleinigkeiten

1. Die onEnterFrame-Anweisung läuft und bricht nicht ab - so als ob meine Bedingung, die zum delete führen soll, im Nichts untergeht. Ich weiß nicht, wie ich das schreiben muss.

2. this.oncompletehandler(); >> funktioniert nicht, wie gewünscht.
Ich hatte vor, im Aufruf des Prototypes, eine Variable mit dem Namen der Funktion anzugeben, um diese nach abschluss der onEnterFrame-Anweisung ausführen zu lassen.
Kann sein, dass es nicht geht, weil 1. ja auch schon nicht funktioniert.

3. Und jetzt meine Rätselfrage:
Wie kann ich dafür sorgen, das die End-Positionen gerundet werden?
Math.round(Ziel) - funktioniert aber nicht.
wollt schreiben this._x = Math.round(this._x) - allerdings geht auch das erst, nach dem er fertig ist...

Endlosschleife... irgendwie



Aufgabe des Prototypes:
Objekt-Animation für Position, Größe, Alpha; Funktionsaufruf nach fertiggesteller Neupositionierung auf der Bühne; Einstellungsmöglichkeiten von Beschleunigung, Geschwindigkeit und Trägheit.

Code:
MovieClip.prototype.ll_pos = function(newHeight, newWidth, newX, newY, newSP, newSPD, newSPK, newAlpha, callback) {
	this._dx = newX;
	this._dy = newY;
	this._dh = newHeight;
	this._dw = newWidth;
	this._sp = newSP;
	this._spd = newSPD;
	this._spk = newSPK;
	this._da = newAlpha;
	this._cw = ComponentWidth;
	this.oncompletehandler = callback;
	this.onEnterFrame = function() {
		if (Math.abs(this._height-this._dh)<1 && Math.abs(this._width-this._dw)<1 && Math.abs(this.x-this._dx)<1 && Math.abs(this.y-this._dy)<1 && Math.abs(this._alpha-this._da)<1) {
			this._height = this._dh;
			this._width = this._dw;
			this._x = this._dx;
			this._y = this._dy;
			this._alpha = this._da;
			delete this.onEnterFrame;
			this.onEnterFrame = null;
			this.oncompletehandler();
			this.oncompletehandler = null;
		} else {
			trace("läuft!"
			this._height = this._height+(this._dh-this._height)*this._sp;
			this._width = this._width+(this._dw-this._width)*this._sp;
			this._x = this._x+(this._dx-this._x)*this._sp;
			this._y = this._y+(this._dy-this._y)*this._sp;
			this._alpha = this._alpha+(this._da-this._alpha)*this._sp;
			this._sp = this._sp+(this._spd-this._sp)*this._spk;
		}
	};
};
Aufruf:
Code:
mein_mc.ll_pos(Stage.height-150, Math.round((Stage.width/4))-5, Math.round((Stage.width/2))+Math.round((Stage.width/4))+5, 5, 0, 0.2, 0.2, 57, irgendwas);

das mit dem onEnterFrame ist erst, seit dem ich die Functionen in den Prototyp umgewandelt habe... die OriginalFunktionen stehen ganz unten:
hier funktioniert alles. Im Prototypen habe ich noch den Alpha-Wert eingebaut...

Original-Funktion (bei der ich mir nicht sicher bin, ob die schon ne Macke hat - allerdings funktioniert hier noch oncompletehandler()

Code:
function footer_mask_build() {
        trace(this+".footer_mask_build()");
        footer.mask._dh = 60;
        footer.mask._sp = 0;
        footer.mask._spd = 1.000000E-001;
        footer.mask._spk = 1.000000E-001;
        footer.mask.oncompletehandler = irgendwas()
        _root.footer.mask._build();
        
}
_root.footer.mask._build = function() {
        trace(this+"._build()");
        this.onEnterFrame = function() {
                if (Math.abs(this._height-this._dh)<1) {
                        this._height = this._dh;
                        this.onEnterFrame = null;
                        this.oncompletehandler();
                } else {
                        this._height = this._height+(this._dh-this._height)*this._sp;
                        this._sp = this._sp+(this._spd-this._sp)*this._spk;
                }
        };
};

Sieht mehr aus als es eigentlich ist...
Wär für jede Hilfe dankbar.

lg BdM
bill-da-machade ist offline   Mit Zitat antworten
Alt 13-04-2007, 01:01   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
if (Math.abs(this._height-this._dh)<1 && Math.abs(this._width-this._dw)<1 && Math.abs(this.x-this._dx)<1 && Math.abs(this.y-this._dy)<1 && Math.abs(this._alpha-this._da)<1) {

weniger wäre mehr?
lass dir halt die einzelnen werte austracken um zu sehen, ob es überhaupt irgendwann einmal eine situation gibt, die diese ganzen bedingungen erfüllt.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 13-04-2007, 01:13   #3 (permalink)
Neuer User
 
Registriert seit: Mar 2006
Beiträge: 32
Zitat:
Zitat von hgseib Beitrag anzeigen
if (Math.abs(this._height-this._dh)<1 && Math.abs(this._width-this._dw)<1 && Math.abs(this.x-this._dx)<1 && Math.abs(this.y-this._dy)<1 && Math.abs(this._alpha-this._da)<1) {

weniger wäre mehr?
lass dir halt die einzelnen werte austracken um zu sehen, ob es überhaupt irgendwann einmal eine situation gibt, die diese ganzen bedingungen erfüllt.
Mmh... also erst mal danke für den Hinweis... bin halt bissl N00b...

Hast du nen Vorschalg, wie ich es anstelle, dass die Bewegungen zeitgleich abgearbeitet werden (und nicht nach einander - möchte ineinendergreifende Bewegungen...)
wenn ich die funktion zerlege, wird ja auch mit dem zu bearbeitenden mc umgegangen, als würde ne liste abgearbeitet...

also wen ich schreibe:

1. Position neu setzen
2. Größe anpassen
3. Alpha verändern

das würde heißen, dass auf der bühne genau das mit dem mc passiert... das zerstört das gesamtbild...
oder gibts noch ne andere möglichkeit mit der ich alle 5 werte gleichzeitig ändern kann?
bill-da-machade ist offline   Mit Zitat antworten
Alt 13-04-2007, 08:41   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Zitat:
Zitat von bill-da-machade Beitrag anzeigen
Hast du nen Vorschalg, wie ich es anstelle
das was ich vorgeschlagen hatte: lass dir alle mal austracen

trace(Math.abs(this._height-this._dh)+" // "+Math.abs(this._width-this._dw)..

weil irgend jemand spielt offensichtlich nicht mit. sonst würde ja deine bedingung erfüllt werden.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 15-04-2007, 20:28   #5 (permalink)
Neuer User
 
Registriert seit: Mar 2006
Beiträge: 32
Update - Schleife funzt - Funktionsaufruf immer noch nicht

Hi,

hier das Update:

Code:
MovieClip.prototype.ll_pos = function(newHeight, newWidth, newX, newY, newSP, newSPD, newSPK, newAlpha, round, callback, debug) {
	this._dx = newX;
	this._dy = newY;
	this._dh = newHeight;
	this._dw = newWidth;
	this._sp = newSP;
	this._spd = newSPD;
	this._spk = newSPK;
	this._da = newAlpha;
	this._rnd = round;
	this.oncompletehandler = callback;
	this._dbg = debug;
	this.onEnterFrame = function() {
		if (Math.abs(this._height-this._dh)<1 && Math.abs(this._width-this._dw)<1 && Math.abs(this._x-this._dx)<1 && Math.abs(this._y-this._dy)<1 && Math.abs(this._alpha-this._da)<1) {
			this._height = this._dh;
			this._width = this._dw;
			this._x = this._dx;
			this._y = this._dy;
			this._alpha = this._da;
			delete this.onEnterFrame;
			this.onEnterFrame = null;
			//trace("\n۞ Transforming \""+this+"\" complete");
			//trace("۞ H"+this._height+"\t|\tW"+this._width+"\t|\tX"+this._x+"\t|\tY"+this._y+"\t|\tA"+this._alpha);
			//trace("۞ call: \""+this+".OnCompleteHandler()\"\n");
			this.oncompletehandler();
			this.oncompletehandler = null;
			if (this._rnd) {
				this._height = Math.round(this._height);
				this._width = Math.round(this._width);
				this._x = Math.round(this._x);
				this._y = Math.round(this._y);
				this._alpha = Math.round(this._alpha);
				if (this._dbg) {
					trace(this+"._rnd._height = \t\t"+this._height);
					trace(this+"._rnd._width = \t\t"+this._width);
					trace(this+"._rnd._x = \t\t\t\t"+this._x);
					trace(this+"._rnd._y = \t\t\t\t"+this._y);
					trace(this+"._rnd._alpha = \t\t"+this._alpha);
				}
			}
		} else {
			if (this._dbg) {
				trace(this+"._height = \t\t"+this._height);
				trace(this+"._width = \t\t"+this._width);
				trace(this+"._x = \t\t\t\t"+this._x);
				trace(this+"._y = \t\t\t\t"+this._y);
				trace(this+"._alpha = \t\t"+this._alpha);
			}
			this._height = this._height+(this._dh-this._height)*this._sp;
			this._width = this._width+(this._dw-this._width)*this._sp;
			this._x = this._x+(this._dx-this._x)*this._sp;
			this._y = this._y+(this._dy-this._y)*this._sp;
			this._alpha = this._alpha+(this._da-this._alpha)*this._sp;
			this._sp = this._sp+(this._spd-this._sp)*this._spk;
		}
	};
	if (this._da>this._alpha) {
		if (this._spd<0.34) {
			trace("\n|||\n|||\n||| ERROR:\n||| >>> "+this+"\n||| Alpha-Wert wurde erhöht: \n||| Variable this._spd muss min. Wert 0.34 haben.\n|||\n||| Aktueller Wert: "+this._spd+"\n||| Berechnung wird unendlich und die Schleife kann nicht beendet werden.\n|||\n|||\n");
			delete this.onEnterFrame;
			this.onEnterFrame = null;
			trace("\n|||\n|||\n||| ERROR:\n||| >>> "+this+"\n||| Die Schleife wurde zwangsweise beendet!\n||| Bitte korrigieren Sie den Wert der Variable auf min. "+this+"._spd=0.34");
		}
	}
};
Bei Erhöhung des Alpha-Wertes kann es zu einer Endlosschleife kommen, wenn _da einen MindestWert unterschreitet.
Außerdem habe ich statt "_x" den Underscore vergessen


Aufruf
this.my_mc.ll_pos(130, Stage.width, 5, 30, 0, 0.34, 0.1, 100, true, function_irgendwas, true);

die function wird jedoch nicht ausgeführt... woran das liegt, weiß ich nicht.
PfadProblem??? Hat jemand ne Idee, wie ich auf eine Funktion zugreifen kann?

lg BdM
bill-da-machade ist offline   Mit Zitat antworten
Alt 15-04-2007, 20:52   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
niemand kann hier hellsehen.

benütze mal:
trace(callback);
callback();

anstatt
this.oncompletehandler();

übergibst du eine funktion oder den namen einer funktion?
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 15-04-2007, 21:16   #7 (permalink)
Neuer User
 
Registriert seit: Mar 2006
Beiträge: 32
Zitat:
Zitat von hgseib Beitrag anzeigen
niemand kann hier hellsehen.

benütze mal:
trace(callback);
callback();

anstatt
this.oncompletehandler();

übergibst du eine funktion oder den namen einer funktion?
Hi,
den Namen der Funktion möchte ich übergeben... am ende der neupositionierung soll diese funktion aufgerufen werden.
Ich dachte des passt... irgendwie...
also ich geh davon aus dass die funktion im _root liegt. und diese funktion möchte ich ansprechen und ausführen...

PHP-Code:
my_mc.function_irgendwas = function() {
trace(this)
}

my_mc.ll_pos(130Stage.width53000.340.1100truefunction_irgendwastrue); 
warum geht das nicht?
bill-da-machade ist offline   Mit Zitat antworten
Alt 15-04-2007, 21:46   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
link auf die funktion übergeben wäre besser:
my_mc.ll_pos(130, Stage.width, 5, 30, 0, 0.34, 0.1, 100, true, _root.function_irgendwas, true);
...
callback();

wenn's ein name ist, dann so und auf den richtigen pfad achten:
my_mc.ll_pos(130, Stage.width, 5, 30, 0, 0.34, 0.1, 100, true, "function_irgendwas", true);
...
_root[callback]();
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (15-04-2007 um 21:49 Uhr)
hgseib 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 23:44 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele