API Docs for: 0.5.5
Show:

File: kick/core/EventQueue.js

define(["./Util"], function (util) {
    "use strict";

    /**
     * Event queue let you schedule future events in the game engine. Events are invoked just before the
     * Component.update() methods.<br>
     * An event can run for either a single frame or for multiple frames.
     * @class EventQueue
     * @namespace kick.core
     * @param {kick.core.Engine} engine
     */
    return function (engine) {
        var queue = [],
            queueSortFn = function (a, b) {
                return a.timeStart - b.timeStart;
            },
            time = engine.time;

        /**
         * Add a event to the event queue. Using timeStart = 0 will make the event run in the next frame.
         * @method add
         * @param {function} task
         * @param {Number} timeStart Number of milliseconds from current time
         * @param {Number} timeEnd=timeStart Number of milliseconds from current time
         * @return {Object} event object (used for 'cancel' event)
         */
        this.add = function (task, timeStart, timeEnd) {
            var currentTime = time.time + 1, // schedule for one millisecond in the future - this makes it legal for event call backs to schedule new events
                queueElement = {
                    task: task,
                    timeStart: timeStart + currentTime,
                    timeEnd: (timeEnd || timeStart) + currentTime
                };
            util.insertSorted(queueElement, queue, queueSortFn);
            return queueElement;
        };

        /**
         * Removes an event object from the queue.
         * @method cancel
         * @param {Object} eventObject (should be the object returned from the EventQueue.add method
         */
        this.cancel = function (eventObject) {
            util.removeElementFromArray(queue, eventObject);
        };

        /**
         * Run the event queue. This method is invoked by the Engine object just before the components are updated.
         * @protected
         * @method run
         */
        this.run = function () {
            var i,
                currentTime = time.time,
                queueLength = queue.length,
                queueElement;
            for (i = 0; i < queueLength && (queueElement = queue[i]).timeStart < currentTime; i++) {
                queueElement.task();
                if (queueElement.timeEnd < currentTime) {
                    queue.splice(i, 1);
                    queueLength--;
                }
            }
        };

        /**
         * Clears the queue
         * @method clear
         */
        this.clear = function () {
            queue = [];
        };
    };
});