Newer
Older
pixi.js / src / extras / Ticker.js
var EventEmitter = require('eventemitter3').EventEmitter;

/**
 * A Ticker class that runs an update loop that other objects listen to
 *
 * @class
 * @memberof PIXI.extras
 */
var Ticker = function()
{
    EventEmitter.call(this);

    this.updateBind = this.update.bind(this);

    /**
     * Whether or not this ticker runs
     *
     * @member {boolean}
     */
    this.active = false;

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

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

    /**
     * The time at the last frame
     *
     * @member {number}
     */
    this.lastTime = 0;

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

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

Ticker.prototype = Object.create(EventEmitter.prototype);
Ticker.prototype.constructor = Ticker;

/**
 * Starts the ticker, automatically called by the constructor
 *
 */
Ticker.prototype.start = function()
{
    if(this.active)
    {
        return;
    }

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

/**
 * Stops the ticker
 *
 */
Ticker.prototype.stop = function()
{
    if(!this.active)
    {
        return;
    }

    this.active = false;
};

/**
 * The update loop, fires the 'tick' event
 *
 */
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;

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

        this.lastTime = currentTime;
    }

};

module.exports = new Ticker();