18-12-2017, 10:51 PM
Bonjour,
Alors voilà, j'utilise le "Framework js" Pixi pour faire un jeu. Un truc simple, du moins pour l'instant.
Le problème est le chargement des images qui se fait de manière asynchrone.
Si j'instancie deux classes qui font appel au loader il me sort une erreur: Cannot add resources while the loader is running.
Je ne vois pas comment faire celà proprement pour l'instant.
Peut être un loader général qui mettrai en queue le chargement de l'asset + le callback en attendant que le précédent soit chargé?
Je vous colle une de mes classe concernée par ce problème:
Alors voilà, j'utilise le "Framework js" Pixi pour faire un jeu. Un truc simple, du moins pour l'instant.
Le problème est le chargement des images qui se fait de manière asynchrone.
Si j'instancie deux classes qui font appel au loader il me sort une erreur: Cannot add resources while the loader is running.
Je ne vois pas comment faire celà proprement pour l'instant.
Peut être un loader général qui mettrai en queue le chargement de l'asset + le callback en attendant que le précédent soit chargé?
Je vous colle une de mes classe concernée par ce problème:
Code :
class ChanceChoice {
constructor(app, pixi) {
this.app = app;
this.loader = pixi.loader;
this.container = new PIXI.Container();
this.container.x = pixi.renderer.width *0.02;
this.container.y = pixi.renderer.height *0.02;
this.container.width = pixi.renderer.width *0.8;
pixi.stage.addChild(this.container);
this.assetsFunc = [];
}
loadAsset(name) {
var load = this.loader
.add({
name: name,
url: "/assets/" + name + ".png"
}).load(function () {
if (!(name in this.assetsFunc)) {
return;
}
var nbFuncs = this.assetsFunc[name].length;
while (nbFuncs--) {
this.assetsFunc[name][i]();
this.assetsFunc[name].splice(i,1);
}
}.bind(this));
}
setChances(chances) {
for (var i=0, j=chances.length; i<j; i++) {
if (!(chances[i].img in this.loader.resources)) {
var res = this.loadAsset(chances[i].img);
}
this.showChance(chances[i].id, chances[i].img, i);
}
}
showChance(id, imgPath, nb) {
if (!("texture" in this.loader.resources[imgPath])) {
if (!(imgPath in this.assetsFunc)) {
this.assetsFunc[imgPath] = [];
}
this.assetsFunc[imgPath].push(this.addChance(id, imgPath, nb));
return;
}
this.addChance(id, imgPath, nb)();
return true;
}
addChance(id, imgPath, nb) {
var func = function() {
let elmt = new PIXI.Sprite(this.loader.resources[imgPath].texture);
elmt.x = (elmt.width + 10) * nb;
elmt.y = 100;
elmt.id = id;
elmt.interactive = true;
elmt.buttonMode = true;
elmt.on('pointerdown', function(evt) {
this.sendChoice(evt.target.id);
}.bind(this));
this.container.addChild(elmt);
}.bind(this);
return func;
}
sendChoice(id) {
this.app.xhr.open("GET", "/test.json");
this.app.xhr.send();
}
}