Newer
Older
pixi.js / src / core / utils / Ticker.js

var eventTarget = require('./eventTarget'),
    EventData   = require('./EventData');

/**
 * A Ticker class that runs the main update loop that other objects listen to
 *
 * @class
 * 
 */
var Ticker = function()
{
    this.updateBind = this.update.bind(this);

    /**
     * Whether or not this ticker runs
     *
     * @member {boolean}
     */
    this.active = false;
    this.eventData = new EventData( this, 'tick', { deltaTime:1 } );

    /**
     * The deltaTime
     *
     * @member {number}
     */
    this.deltaTime = 1;

    /**
     * The time between two frames
     *
     * @member {number}
     */
    this.timeElapsed = 0;
    this.lastTime = 0;

    this.speed = 1;

    // auto start ticking!
    this.start();
};

eventTarget.mixin(Ticker.prototype);


Ticker.prototype.start = function()
{
    if(this.active)
    {
        return;
    }

    this.active = true;
    requestAnimationFrame(this.updateBind);
};


Ticker.prototype.stop = function()
{
    if(!this.active)
    {
        return;
    }

    this.active = false;
};

Ticker.prototype.update = function()
{
    if(this.active)
    {
        requestAnimationFrame(this.updateBind);

        var currentTime =  new Date().getTime();
        var timeElapsed = currentTime - this.lastTime;

        // cap the time!
        if(timeElapsed > 100)
        {
            timeElapsed = 100;
        }

        this.deltaTime = (timeElapsed * 0.06);

        this.deltaTime *= this.speed;

        // 60 ---> 1
        // 30 ---> 2

        this.eventData.data.deltaTime = this.deltaTime;

        this.emit( 'tick', this.eventData );

        this.lastTime = currentTime;
    }

};

module.exports = new Ticker();