mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Ensure LinkedObjects managers are properly bound to their scene for HTML5 games
This commit is contained in:
@@ -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;
|
||||
|
73
Extensions/LinkedObjects/tests/linkedobjects.spec.js
Normal file
73
Extensions/LinkedObjects/tests/linkedobjects.spec.js
Normal 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);
|
||||
});
|
||||
});
|
@@ -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',
|
||||
|
Reference in New Issue
Block a user