Added new ProcessQueue struct for classes that need this pattern a lot

This commit is contained in:
Richard Davey 2017-11-09 23:55:59 +00:00
parent f165acfe5f
commit 484669c4bb
2 changed files with 101 additions and 0 deletions

View file

@ -0,0 +1,99 @@
// Phaser.Structs.ProcessQueue
var Class = require('../utils/Class');
var ProcessQueue = new Class({
initialize:
function ProcessQueue ()
{
this._pending = [];
this._active = [];
this._destroy = [];
this._toProcess = 0;
},
add: function (item)
{
this._pending.push(item);
this._toProcess++;
return this;
},
remove: function (item)
{
this._destroy.push(item);
this._toProcess++;
return this;
},
update: function ()
{
if (this._toProcess === 0)
{
// Quick bail
return this._active;
}
var list = this._destroy;
var active = this._active;
var i;
var item;
// Clear the 'destroy' list
for (i = 0; i < list.length; i++)
{
item = list[i];
// Remove from the 'active' array
var idx = active.indexOf(item);
if (idx !== -1)
{
active.splice(idx, 1);
}
}
list.length = 0;
// Process the pending addition list
// This stops callbacks and out of sync events from populating the active array mid-way during an update
list = this._pending;
for (i = 0; i < list.length; i++)
{
item = list[i];
this._active.push(item);
}
list.length = 0;
this._toProcess = 0;
// The owner of this queue can now safely do whatever it needs to with the active list
return this._active;
},
getActive: function ()
{
return this._active;
},
destroy: function ()
{
this._pending = [];
this._active = [];
this._destroy = [];
}
});
module.exports = ProcessQueue;

View file

@ -2,7 +2,9 @@
module.exports = { module.exports = {
List: require('./List'),
Map: require('./Map'), Map: require('./Map'),
ProcessQueue: require('./ProcessQueue'),
RTree: require('./RTree'), RTree: require('./RTree'),
Set: require('./Set') Set: require('./Set')