ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
366
366
EMPFEHLEN
-
Leider ist der Titel des Themas etwas lang, aber mir ist kein kürzerer/aussagekräfiter Titel in den Sinn gekommen.
Da es bei mir oft vorkommt, dass verschiedene onEnterFrame Aktionen simultan in einem MovieClip ablaufen, kommt es dabei oft zu einem sehr verwirrenden Baum an MovieClips, daher würde ich gerne einmal wissen, ob es möglich ist, dafür eine etwas schönere Variante zu verwenden.
Hier einmal ein Beispiel von zwei verschiedenen Funktionen, welche gleichzeitig aufgerufen werden, um die Thematik zu verdeutlichen:
(Dies ist nur ein Beispiel. daher die kurzen onEnterFrame Aktionen. Und mir ist bewusst, das man in diesem Fall, beides in eine onEnterFrame Funktion ausführen könnte.)PHP-Code:var target:MovieClip = this.attachMovie("circle_mc", "circle_mc", 0)
target.createEmptyMovieClip("scaling", 0);
target.createEmptyMovieClip("slide", 1);
target.scaling.onEnterFrame = function():Void
{
this._parent._xscale += (150 - this._parent._xscale) / 5
}
target.slide.onEnterFrame = function():Void
{
this._parent._x += (250 - this._parent._x) / 5
}
Der Grund, wieso sich die Bewegungen in verschiedenen onEnterFrame Funktionen befinden ist, dass es durchaus vorkommt, dass sie zu absolut unterschiedlichen Zeitpunkten aufgerufen werden und auch alleine arbeiten können, ohne dabei anderes zu berechnen.
Mein "Problem" ist, dass diese Art und Weise leider jegliche ästhetik des Codes nimmt, da es bei anhäufung von solchen Aktionen sehr unübersichtlich wird, und es eine Menge unnötiger leerer Clips gibt, die eigentlich nur dazu dienen, um eine onEnterFrame Aktion aufzurufen.
Ich habe schon eine Klasse geschrieben, welches die Steuerung und Bewegungen übernimmt, was auch sehr einfach zu Handhaben ist, aber trotzdem gibt es immernoch diese Masse an unnötigen MovieClips.
Ich hoffe ich konnte die Problematik etwas verdeutlichen. Danke für jeden Denkanstoß!
-
Hi,
für jede Art der Animation einen neuen "Hilfssclip" zu erstellen, ist meiner Meinung nach in der Tat die sinnvollste Vorgehensweise.
Deine Klasse (bzw. Deine Prototypen) kann allerdings dafür sorgen, dass diese Clips automatisch erstellt und auch wieder entfernt werden:Aufruf z.B.:Code actionscript: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
class Ani { private var _tgt:MovieClip; public function Ani(t:MovieClip) { this._tgt = t; } public function slide(dx:Number, dy:Number, d:Number):Void { this._tgt["Ani_helper_slide"].removeMovieClip(); var helper:MovieClip = this._tgt.createEmptyMovieClip("Ani_helper_slide", this._tgt.getNextHighestDepth()); helper.onEnterFrame = function() { this._parent._x += (dx - this._parent._x) / d; this._parent._y += (dy - this._parent._y) / d; if (Math.abs(dx - this._parent._x) < 1 && Math.abs(dy - this._parent._y) < 1) { this._parent._x = dx; this._parent._y = dy; this.removeMovieClip(); } } } public function fade(da:Number, d:Number):Void { this._tgt["Ani_helper_fade"].removeMovieClip(); var helper:MovieClip = this._tgt.createEmptyMovieClip("Ani_helper_fade", this._tgt.getNextHighestDepth()); helper.onEnterFrame = function() { this._parent._alpha += (da - this._parent._alpha) / d; if (Math.abs(da - this._parent._alpha) < 1 ) { this._parent._alpha = da; this.removeMovieClip(); } } } }
Code actionscript:1 2 3 4 5
var ani = new Ani(meinMC); ani.slide(320, 240, 5); ani.fade(30, 8);
Gruß
.
-
Ja, meine Klasse ist bereits so aufgebaut, das sie bei aufrufen einer Funktion einen einzelnen MovieClip dafür erstell und ihn danach wieder entfernt, dachte nur, dass es dafür eventuell eine schönere Vorgehensweiße gibt.
Trotzdem vielen Dank für die schnelle ausführliche Hilfe!
-
Hi,
alternativ könntest Du eine onEnterFrame-Methode auf dem Zielclip erstellen, in der ein Animationshandler aufgerufen wird, der die verschiedenen Bewegungen durchführt:Aufruf z.B.:Code actionscript: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
class Ani { private var _tgt:MovieClip; private var _aniFramer:MovieClip; private var _events:Array = new Array(); public function Ani(t:MovieClip) { this._tgt = t; this._aniFramer = t.createEmptyMovieClip("_aniFramer_" + new Date().toString(), t.getNextHighestDepth()); var that:Ani = this; this._aniFramer.onEnterFrame = function() { that.handleEvents(); } } private function handleEvents():Void { for (var i in _events) { _tgt[_events[i]._propName] += (_events[i]._destVal - _tgt[_events[i]._propName]) / _events[i]._speed; if (Math.abs(_tgt[_events[i]._propName] - _events[i]._destVal) < 1) { _tgt[_events[i]._propName] = _events[i]._destVal; var _cb:Function = _events[i]._callback; var _pn:String = _events[i]._propName; _cb(_pn, stopAni(_events[i]._propName)); } } } public function startAni(propName:String, destVal:Number, speed:Number, callback:Function):Void { var overwrite:Boolean = false; for (var i in _events) { var obj:Object = _events[i]; if (obj._propName == propName) { obj._destVal = destVal; obj._speed = speed; obj._callback = callback; overwrite = true; } } if (!overwrite) { _events.push({_propName:propName, _destVal:destVal, _speed:speed, _callback:callback}); trace(_events[_events.length - 1]._destVal); } } public function stopAni(propName:String):Number { for (var i=0; i<_events.length; i++) { var obj:Object = _events[i]; if (obj._propName == propName) { _events.splice(i, 1); break; } } return _tgt[propName]; } }
Code actionscript:1 2 3 4 5 6 7 8 9 10 11
import Ani; var a = new Ani(mc); a.startAni("_alpha", 50, 10, onFinished); a.startAni("_x", 400, 20, onFinished); function onFinished(propName, v) { trace("fertig: " + propName + ", " + v); }
Bei dieser Methode läuft eine einzige onEnterFrame-Methode die gesamte Zeit - Animationen können zur Laufzeit hinzugefügt bzw. entfernt werden. Ist eine Animation abgelaufen, wird eine Callback-Funktion ausgeführt, der der jeweilige Eigenschaftsname und der Endwert der Transformation übergeben wird.
Gruß
.
-
Nocheimal vielen Danke für die Mühe.
Für dieses Projekt bietet sich diese Art der Eventverwaltung leider nicht richtig an, da einige Funktionen sehr individuell ausgeführt werden, aber ich bin mir sicher, dass ich auf diese Vorgehensweiße später nocheinmal zurückgreifen werde!
Ähnliche Themen
-
2 Monitore und 2 unabhängige Laptops
Von Dragonate im Forum Microsoft WindowsAntworten: 6Letzter Beitrag: 18.12.09, 10:33 -
Eine Listener-Klasse für mehrere JLists (elegantere Lösung gesucht)
Von AvS im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 6Letzter Beitrag: 29.08.09, 16:04 -
mehrere unabhängige objekte in acrobat 3d
Von jasmin_bx im Forum Cinema 4DAntworten: 1Letzter Beitrag: 14.06.06, 08:13 -
2 unabhängige SELECT Abfragen
Von RADA im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 21.07.04, 11:51 -
Mehrere Konstruktoren oder irgend eine andere Lösung?
Von undertaker im Forum PHPAntworten: 3Letzter Beitrag: 11.04.04, 10:30





Zitieren
Login





