2015-08-11 1 views
0

Donc je transfère mon jeu de cocos2d C++ à js et j'ai déjà trié beaucoup de différences reliées à js, mais je n'arrive pas à comprendre ni trouver en ligne la solution à un problème particulier impliquant la commutation des scènes avec cc.director .runScene().cocos2d js 3.7 runScene question

j'ai donc une scène de jeu complexe qui je charge comme ça:

cc.LoaderScene.preload(gameplay_resources, function() { 

    cc.director.runScene(new GameScene(level, epoch)); 
}, this); 

qui prend params de scène et de niveau et retourne l'objet de scène qui contient tous les éléments de gameplay.

Fragment de la scène du jeu ressemble à ceci:

var GameNode = cc.Node.extend({ 
levelID:null, 
epoch:null, 
platforms:null, 
boardSize:null, 
numberOfMovesLeft:null, 
numberOfMovesAllowed:null, 
sessionInfo:null, 
ctor:function (levelID, epochID) 
{ 
    this._super(); 

    this.levelID = levelID; 
    this.setEpoch(Epoch.epochForNumber(epochID)); 
    this.platforms = []; 

    var self = this; 

    var gameplayUI = ccs.load(gameplayRes.GameplayUI, "res/"); 
    this.addChild(gameplayUI.node); 

    var replayButton = gameplayUI.node.getChildByName("replay"); 
    cc.assert(cc.sys.isObjectValid(replayButton), "Replay button not valid"); 
    replayButton.addTouchEventListener(function (sender, type) { 

     if(type != ccui.Widget.TOUCH_ENDED) return; 

     cc.LoaderScene.preload(gameplay_resources, function() { 

      cc.director.runScene(new GameScene(self.levelID, self.epoch.ID)); 
     }, this); 

    }, this); 

    return true; 
} 

    //... Other methods 

}); 

var GameScene = cc.Scene.extend({ 
    ctor:function (levelID, epochID) { 
     this._super(); 
     var gameNode = new GameNode(levelID, epochID); 
     this.addChild(gameNode); 
    } 
}); 

Tout fonctionne très bien à la fin de la scène elle-même, mais dire si je change la scène par la même méthode au menu principal, puis aller au gameplay encore une fois, il semble que le «nouvel» objet de scène de jeu ait des valeurs d'objet antérieures (supposées être libérées). Donc, si j'appuie sur le bouton 'Replay', il utilise aussi les anciennes valeurs de scènes de jeu. Je veux dire en C++ lorsque vous remplacez des scènes, la mémoire de l'ancienne scène est libérée par le moteur Cocos. Et si vous allez à cette scène en créant un nouvel objet - son nouveau.

Donc, ma question est: pourquoi cela se passe-t-il? Peut-être que je ne sais pas quelque chose sur la gestion de la mémoire de cocos2d js, donc je dois faire quelque chose de plus pour libérer la vieille scène?

Ce que je me suis assuré:

  • Quand je tends les moteurs des classes toutes mes variables ajoutées un null'ed et des objets de valeurs sont affectées à l'aide de cteur this.value = ...; ne pas avoir de valeurs statiques pour tous les objets de cette manière.
  • Il n'y a pas d'enfants qui conservent la scène Gameplay (ou il semble que ce ne soit pas le cas) donc je suppose qu'il devrait être libéré quand je remplace la scène?
  • Je n'utilise pas retain()/release(), et tous les enfants sont ajoutés à la table de jeu pour être conservés.

Toutes les suggestions seraient appréciées.

À la votre!

+0

Si vous n'avez plus de question, veuillez supprimer celle-ci. SO n'est pas un forum de discussion. Si vous avez une solution utile à la communauté, affichez-la comme une réponse et acceptez-la. – isherwood

Répondre

0

Donc, je l'ai résolu - j'utilisais le gestionnaire d'événements donc l'envoi d'événements et de scènes de jeu avec ses enfants ont été enregistrés pour certains d'entre eux. Je supposais que eventManager conserve les nœuds sur une base "faible", mais il semble que vous deviez appeler removeListeners() pour chaque nœud enregistré dans sa méthode onExit pour supprimer les écouteurs manuellement. Alors maintenant, il semble bien fonctionner.