tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
366
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    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:

    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

    (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.)

    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ß!
     

  2. #2
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    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:
    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();
          }
        }
      }
    }
    Aufruf z.B.:
    Code actionscript:
    1
    2
    3
    4
    5
    
    var ani = new Ani(meinMC);
     
    ani.slide(320, 240, 5);
     
    ani.fade(30, 8);

    Gruß
    .
     

  3. #3
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    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!
     

  4. #4
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    Hi,

    alternativ könntest Du eine onEnterFrame-Methode auf dem Zielclip erstellen, in der ein Animationshandler aufgerufen wird, der die verschiedenen Bewegungen durchführt:
    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];
        }
    }
    Aufruf z.B.:
    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ß
    .
     

  5. #5
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    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

  1. 2 Monitore und 2 unabhängige Laptops
    Von Dragonate im Forum Microsoft Windows
    Antworten: 6
    Letzter Beitrag: 18.12.09, 10:33
  2. Eine Listener-Klasse für mehrere JLists (elegantere Lösung gesucht)
    Von AvS im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 6
    Letzter Beitrag: 29.08.09, 16:04
  3. mehrere unabhängige objekte in acrobat 3d
    Von jasmin_bx im Forum Cinema 4D
    Antworten: 1
    Letzter Beitrag: 14.06.06, 08:13
  4. 2 unabhängige SELECT Abfragen
    Von RADA im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 21.07.04, 11:51
  5. Antworten: 3
    Letzter Beitrag: 11.04.04, 10:30