Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 17-01-2007, 18:53   #1 (permalink)
class public{}
 
Benutzerbild von public
 
Registriert seit: Feb 2004
Ort: dessau
Beiträge: 1.406
[STUFF] Timer Klasse

niux weltbewegendes aber viell. kanns ja jemand gebrauchen

methoden:
start(interval:Number, loop:Number):Void
destroy():Void

events:
onTimer
onTimerComplete

Klasse:
PHP-Code:
class djpublic.utils.Timer {
    private var 
_interval:Number;
    private var 
_loop:Number;
    private var 
_intervalID:Number;
    private var 
_count:Number;
    
//
    
private var broadcastMessage:Function;
    private var 
addListener:Function;
    private var 
removeListener:Function;
    
//
    
public var onTimer:Function;
    public var 
onTimerComplete:Function;
    
//
    // KONSTRUKTOR
    //
    
function Timer () {
    }
    
//
    // start (interval:Number, loop:Number):Void
    //
    
public function start (interval:Numberloop:Number):Void {
        
clearInterval (this._intervalID);
        var 
ref:Object this;
        
this.removeListener (this);
        
AsBroadcaster.initialize (this);
        
this.addListener (this);
        
this._interval interval;
        
this._loop loop;
        
this._count 0;
        
this._intervalID setInterval (function ():Void {
            
ref.broadcastMessage ("onTimer");
            if (
ref._loop != null) {
                
ref._count++;
            }
            
updateAfterEvent ();
            if (
ref._loop != null) {
                if (
ref._count >= ref._loop) {
                    
ref.destroy ();
                }
            }
        }, 
this._interval);
    }
    
//
    // destroy()
    //
    
public function destroy ():Void {
        
this.broadcastMessage ("onTimerComplete");
        
this.removeListener (this);
        
clearInterval (this._intervalID);
    }

simple example
PHP-Code:
// Timer Package importieren
import djpublic.utils.Timer;
// Timer Object erstellen
var timer:Timer = new Timer ();
// counter
var counter:Number 0;
// onTimer Event setzen
timer.onTimer = function ():Void  {
    
counter++;
    
trace (counter);
};
// onTimerComplete Event setzen
timer.onTimerComplete = function ():Void  {
    
trace ("end");
};
// Timer starten
// start(interval:Number, loops:Number);
timer.start (50010);
// timer stoppen und counter auf 0 setzen
onMouseDown = function ():Void {
    
timer.destroy ();
    
counter 0;
};
// timer starten
onMouseUp = function ():Void {
    
timer.start (50010);
}; 
oder als timeOut verwenden...einfach den loop parameter auf 0 setzen
PHP-Code:
// Timer Package importieren
import djpublic.utils.Timer;
// Timer Object erstellen
var timer:Timer = new Timer ();
// onTimer Event setzen
timer.onTimer = function ():Void  {
    
trace ("hallo mit verzögerung");
};
// onTimerComplete Event setzen
timer.onTimerComplete = function ():Void  {
    
trace ("end");
};
// Timer starten
// start(interval:Number, loops:Number);
timer.start (50000); 
oder n endloss loop zum selber löschen ...einfach loop auf null setzen
PHP-Code:
// Timer Package importieren
import djpublic.utils.Timer;
// Timer Object erstellen
var timer:Timer = new Timer ();
// onTimer Event setzen
timer.onTimer = function ():Void  {
    
trace ("hallo");
};
// onTimerComplete Event setzen
timer.onTimerComplete = function ():Void  {
    
trace ("end");
};
// Timer starten
// start(interval:Number, loops:Number);
timer.start (100null);
onMouseDown = function ():Void {
    
timer.destroy ();
}; 
public ist offline   Mit Zitat antworten
Alt 18-01-2007, 13:51   #2 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Schön! Nur die anonyme Funktion, welche vom Interval aufgerufen wird, würde ich eher direkt in der Klasse definieren, und dann mit setInterval(this, "funcName" ..) starten, dann kannst du dir das ref-Getrickse sparen.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 18-01-2007, 18:57   #3 (permalink)
class public{}
 
Benutzerbild von public
 
Registriert seit: Feb 2004
Ort: dessau
Beiträge: 1.406
das mit dem ref getrickse is aber kürzer als zb Delegate.create usw....
public ist offline   Mit Zitat antworten
Alt 18-01-2007, 20:47   #4 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Hallo, das ist meine Version davon. Sie ist nicht so elegant, unterstützt aber mehrere Callback-Funktionen und übergibt die triggering-Anzahl an die Callbacks.

Ich möchte hier den Thread nicht hijacken, aber wieso kann setIntervall eigentlich auf intervalCallback zugreifen, obwohl es private ist?

ActionScript:
  1. /**
  2. * Encapsulates the setInterval() and clearInterval() calls into a handy class.
  3. *
  4. * @author David Nadlinger
  5. * @version $Id: Timer.as 3 2006-12-18 19:13:35Z aule $
  6. */
  7. class at.klickverbot.util.Timer {
  8.    
  9.     /**
  10.      * Constructor.
  11.      * @param interval The timer interval.
  12.      * @param numTriggerings The number of triggerings after which the timer is stopped
  13.      * @param numTriggerings (null for no limit).
  14.      * @param callback The callback function when the timer triggers.
  15.      */
  16.     public function Timer( interval :Number, numTriggerings :Number,
  17.         callback :Function ) {
  18.         m_running = false;
  19.         m_interval = interval;
  20.        
  21.         m_triggeringCount = 0;
  22.         m_numTriggerings = numTriggerings;
  23.        
  24.         m_callbackFunctions = new Array();
  25.         if ( callback != null ) {
  26.             addCallback( callback );
  27.         }
  28.     }
  29.    
  30.     /**
  31.      * Starts the timer.
  32.      * Keep in mind that this function doesn't reset the triggering count.
  33.      * @return If the timer could be started (resp. if it was not already running)
  34.      * @see #stop
  35.      * @see #resetCount
  36.      */
  37.     public function start() :Boolean {
  38.         // We can't start the timer if it's already running
  39.         if ( m_running ) {
  40.             return false;
  41.         }
  42.        
  43.         m_timerId = setInterval( this, "intervalCallback", m_interval );
  44.         m_running = true;
  45.     }
  46.    
  47.     /**
  48.      * Stops the timer.
  49.      * Keep in mind that this function doesn't reset the triggering count.
  50.      * @return If the timer could be stopped (resp. if it was running)
  51.      * @see #start  
  52.      * @see #resetCount
  53.      */
  54.     public function stop() :Boolean {
  55.         // We can't stop the timer if it isn't running
  56.         if ( !m_running ) {
  57.             return false;
  58.         }
  59.        
  60.         clearInterval( m_timerId );
  61.         m_running = false;
  62.     }
  63.  
  64.     /**
  65.      * Resets the triggering count to zero.
  66.      * Timer must be stopped to do this.
  67.      * @see #triggeringCount
  68.      * @see #numTriggerings
  69.      */
  70.     public function resetCount() :Boolean {
  71.         // The triggering count can't be reset when the timer is running.
  72.         // This is a design choice – it may cause two extra code lines, but it is
  73.         // better understandable.
  74.         if ( m_running ) {
  75.             return false;
  76.         }
  77.        
  78.         m_triggeringCount = 0;
  79.     }      
  80.    
  81.     /**
  82.      * Adds a function to the list of callback functions.
  83.      * The callback functions get called when the timer triggers.
  84.      * The 'callback'-parameter of the constuctor is the first item in the list,
  85.      * but you can add multiple other functions.
  86.      * @param callback The callback function to add to the list.
  87.      * @see #removeCallback
  88.      */
  89.     public function addCallback( callback :Function ) :Void {
  90.         removeCallback( callback );
  91.         m_callbackFunctions.push( callback );
  92.     }
  93.    
  94.     /**
  95.      * Remove a function from the list of callback functions.
  96.      * @param callback The callback function to remove from the list.
  97.      * @return If the function could be removed (resp. if it was in the list).
  98.      * @see #addCallback    
  99.      */
  100.     public function removeCallback( callback :Function ) :Boolean {
  101.         for ( var i :Number = 0; i < m_callbackFunctions.length; ++i ) {
  102.             if ( m_callbackFunctions[ i ] === callback ) {
  103.                 m_callbackFunctions.splice( i, 1 );
  104.                 return true;
  105.             }
  106.         }
  107.         return false;
  108.     }
  109.    
  110.     /**
  111.      * The interval between timer triggerings in milliseconds.
  112.      */
  113.     public function get interval() :Number {
  114.         return m_interval;
  115.     }
  116.     public function set interval( to :Number ) :Void {
  117.         // No interval shorter than one millisecond is possible
  118.         if ( to < 1 ) {
  119.             return;
  120.         }
  121.        
  122.         m_interval = to;
  123.         if ( m_running ) {
  124.             this.stop();
  125.             this.start();
  126.         }
  127.     }
  128.    
  129.     /**
  130.      * The number of triggerings after which the timer is stopped
  131.      * (zero for no limit).
  132.      */
  133.     public function get numTriggerings() :Number {
  134.         return m_numTriggerings;
  135.     }
  136.     public function set numTriggerings( to :Number ) :Void {
  137.         // So trigger limit smaller than 0 (which means no limit) is possible
  138.         if ( to < 0 ) {
  139.             return;
  140.         }
  141.        
  142.         m_numTriggerings = to;
  143.     }
  144.    
  145.     /**
  146.      * The current triggering count. (read-only)
  147.      * @see #numTriggerings
  148.      */
  149.     public function get triggeringCount() :Number {
  150.         return m_triggeringCount;
  151.     }
  152.    
  153.     /**
  154.      * Internal callback function.
  155.      */
  156.     private function intervalCallback() :Void {
  157.         ++m_triggeringCount;
  158.         if ( m_triggeringCount == m_numTriggerings ) {
  159.             this.stop();
  160.         }
  161.        
  162.         for ( var i :Number = 0; i < m_callbackFunctions.length; i++ ) {
  163.             m_callbackFunctions[ i ]( m_triggeringCount );
  164.         }      
  165.     }
  166.    
  167.     private var m_interval :Number;
  168.     private var m_triggeringCount :Number;
  169.     private var m_numTriggerings :Number;
  170.     private var m_running :Boolean;
  171.     private var m_timerId :Number;
  172.     private var m_callbackFunctions :Array;
  173. }

EDIT: Ich habe, um mir das Getrickse mit "ref" oder Delegate.create zu ersparen einfach die zweite Variante von setInterval verwendet. Ist zwar nicht so schön (und ist wahrscheinlich deprecated), aber wenn es schon keine vernünftigen Funktionszeiger bzw. -referenzen gibt...

Geändert von klickverbot (18-01-2007 um 20:51 Uhr)
klickverbot ist offline   Mit Zitat antworten
Alt 11-08-2007, 22:30   #5 (permalink)
industry painter
 
Benutzerbild von edding950
 
Registriert seit: Aug 2006
Ort: auf'm Pott
Beiträge: 760
Ist ja alles schön und gut...aber wieso nicht mit setTimeout() arbeiten?
__________________
mfg.
edding950 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 18:41 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele