Ensure LinkedObjects managers are properly bound to their scene for HTML5 games

This commit is contained in:
Florian Rival
2015-07-27 10:13:45 +12:00
parent 7ed8c2f15e
commit 5a2a6b4341
3 changed files with 96 additions and 7 deletions

View File

@@ -15,6 +15,20 @@ gdjs.LinksManager = function()
this.links = {};
};
/**
* Get the links manager of a scene.
*
* @method getManager
* @static
*/
gdjs.LinksManager.getManager = function(runtimeScene) {
if (!runtimeScene.linkedObjectsManager) { //Create the shared manager if necessary.
runtimeScene.linkedObjectsManager = new gdjs.LinksManager();
}
return runtimeScene.linkedObjectsManager;
};
gdjs.LinksManager.prototype.getObjectsLinkedWith = function(objA) {
if ( !this.links.hasOwnProperty(objA.id) )
this.links[objA.id] = [];
@@ -68,38 +82,39 @@ gdjs.LinksManager.prototype.removeLinkBetween = function(objA, objB) {
* @static
* @private
*/
gdjs.evtTools.linkedObjects = gdjs.evtTools.linkedObjects || {managers: new Hashtable()};
gdjs.evtTools.linkedObjects = {};
gdjs.evtTools.linkedObjects.gdjsCallbackRuntimeSceneLoaded = function(runtimeScene) {
gdjs.evtTools.linkedObjects.managers.put(runtimeScene.getName(), new gdjs.LinksManager());
//Manager is created on demand, no need to instanciate it now.
//gdjs.LinksManager.getManager(runtimeScene);
};
gdjs.evtTools.linkedObjects.gdjsCallbackObjectDeletedFromScene = function(runtimeScene, obj) {
gdjs.evtTools.linkedObjects.managers.get(runtimeScene.getName()).removeAllLinksOf(obj);
gdjs.LinksManager.getManager(runtimeScene).removeAllLinksOf(obj);
};
gdjs.evtTools.linkedObjects.linkObjects = function(runtimeScene, objA, objB) {
if (objA === null || objB === null) return;
gdjs.evtTools.linkedObjects.managers.get(runtimeScene.getName()).linkObjects(objA, objB);
gdjs.LinksManager.getManager(runtimeScene).linkObjects(objA, objB);
};
gdjs.evtTools.linkedObjects.removeLinkBetween = function(runtimeScene, objA, objB) {
if (objA === null || objB === null) return;
gdjs.evtTools.linkedObjects.managers.get(runtimeScene.getName()).removeLinkBetween(objA, objB);
gdjs.LinksManager.getManager(runtimeScene).removeLinkBetween(objA, objB);
};
gdjs.evtTools.linkedObjects.removeAllLinksOf = function(runtimeScene, objA) {
if (objA === null) return;
gdjs.evtTools.linkedObjects.managers.get(runtimeScene.getName()).removeAllLinksOf(objA);
gdjs.LinksManager.getManager(runtimeScene).removeAllLinksOf(objA);
};
gdjs.evtTools.linkedObjects.pickObjectsLinkedTo = function(runtimeScene, objectsLists, obj) {
if (obj === null) return false;
var linkedObjects =
gdjs.evtTools.linkedObjects.managers.get(runtimeScene.getName()).getObjectsLinkedWith(obj);
gdjs.LinksManager.getManager(runtimeScene).getObjectsLinkedWith(obj);
return gdjs.evtTools.object.pickObjectsIf(function(obj) {
return linkedObjects.indexOf(obj) !== -1;

View File

@@ -0,0 +1,73 @@
describe('gdjs.LinksManager', function() {
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
var runtimeScene = new gdjs.RuntimeScene(runtimeGame, null);
runtimeScene.loadFromScene({
layers:[{name:"", visibility: true}],
variables: [],
automatismsSharedData: [],
objects: [],
instances: []
});
var manager = gdjs.LinksManager.getManager(runtimeScene);
var object1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: ""});
var object1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: ""});
var object1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: ""});
var object2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: ""});
var object2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: ""});
var object2C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: ""});
runtimeScene.addObject(object1A);
runtimeScene.addObject(object1B);
runtimeScene.addObject(object1C);
runtimeScene.addObject(object2A);
runtimeScene.addObject(object2B);
runtimeScene.addObject(object2C);
it('can link two objects', function() {
manager.linkObjects(object1A, object2A);
var linkedObjects = manager.getObjectsLinkedWith(object1A);
expect(linkedObjects.length).to.be(1);
expect(linkedObjects[0]).to.be(object2A);
linkedObjects = manager.getObjectsLinkedWith(object2A);
expect(linkedObjects.length).to.be(1);
expect(linkedObjects[0]).to.be(object1A);
});
it('can link more objects', function() {
manager.linkObjects(object1A, object2A); //Including the same objects as before
manager.linkObjects(object1A, object2B);
manager.linkObjects(object1A, object2C);
var linkedObjects = manager.getObjectsLinkedWith(object1A);
expect(linkedObjects.length).to.be(3);
linkedObjects = manager.getObjectsLinkedWith(object2C);
expect(linkedObjects.length).to.be(1);
expect(linkedObjects[0]).to.be(object1A);
});
it('supports removing links', function() {
manager.removeLinkBetween(object1A, object2B);
var linkedObjects = manager.getObjectsLinkedWith(object1A);
expect(linkedObjects.length).to.be(2);
manager.linkObjects(object2B, object2C);
manager.removeAllLinksOf(object1A);
manager.removeAllLinksOf(object1A);
linkedObjects = manager.getObjectsLinkedWith(object1A);
expect(linkedObjects.length).to.be(0);
linkedObjects = manager.getObjectsLinkedWith(object2A);
expect(linkedObjects.length).to.be(0);
linkedObjects = manager.getObjectsLinkedWith(object2C);
expect(linkedObjects.length).to.be(1);
expect(linkedObjects[0]).to.be(object2B);
});
});

View File

@@ -44,6 +44,7 @@ module.exports = function(config) {
'../../Extensions/DraggableAutomatism/draggableruntimeautomatism.js',
'../../Extensions/PlatformAutomatism/platformerobjectruntimeautomatism.js',
'../../Extensions/PlatformAutomatism/platformruntimeautomatism.js',
'../../Extensions/LinkedObjects/linkedobjects.js',
//All tests files:
'../../Extensions/**/tests/**.spec.js',