enregistrement compacté

Voilà j’ai remarqué que beaucoup de personnes (surtout des nouveaux) se plaignaient de devoir tout enregistrer à la main, devenant ainsi fastidieux d’enregistrer pleins de données.
Je vous partage donc un moyen très connu de compacter votre enregistrement.
Si vous voulez enregistrer une variable booléenne pour savoir si un objet, un talent, une capacité,… est présent, débloqué,… Vous enregistriez jusqu’à présent chaque variable séparément. Vous avez pourtant un moyen de tout enregistrer en une seule variable. Cette technique utilise les puissances de 2.

Je pense arriver à mieux vous faire comprendre par un exemple :
Vous avez un personnage qui au fil du jeu acquiert et perd, indistinctement les uns des autres, 5 objets : une pioche, une pelle, une lampe, un lasso, une épée.
Jusqu’à présent dans votre fichier save vous enregistriez la variable “possédé” (prenant les valeurs 0 ou 1) de chaque objet.
Avec la nouvelle méthode, vous avez attribué aux objets une variable “ID” prenant respectivement pour valeur 1, 2, 4, 8, 16. Vous définissez ensuite une variable “possède” ayant pour valeur la somme de toutes les variables “ID”. Vous n’avez plus qu’à enregistrer cette variable “possède”.
On peut donc obtenir le tableau suivant (incomplet) :

Vous remarquerez qu’il est impossible d’obtenir 2 fois le même résultat, c’est ce principe que nous utilisons.

Lors du chargement, il nous suffit de tester la valeur de “possédé” et suite à de simples calculs savoir quels objets le sont ou pas.

Suite à cet exemple, vous pouvez me dire (et à juste titre) qu’il nous suffirait d’avoir les ID 1, 10, 100, 1000, 10 000. Cependant la technique que je vous présent à pour avantages de permettre d’enregistrer énormément d’objets (si on continue avec l’exemple) dans une assez petite valeur.

J’espère que vous en avez compris le principe. Cela pourrait vous paraître inutile mais cela pourrait aussi vous être utile un jour.

note : je suis en train de compléter/corriger le post et d’essayer de trouver un moyen d’expliquer cela en général ( pas par un exemple).

J’ai bien compris le principe, je voie comment sa peut fonctionné, mais ton calcul après pour savoir quel objet sont possédé tu le fait comment ?

Si possédé = 5 j’ai donc uniquement la lampe et la pioche
Mais comment je retrouve la pelle et la pioche.

Comme Bouh, je vois pas comment on peut récupérer les données.
Certe, c’est une technique très utilisée en programmation (pour les flags) mais on utilise alors un opérateur spécial “&” qui est un ET binaire. Or, cela n’existe pas dans Game Develop.

Je rentre chez moi et je vous réponds :wink:
(ce post est là pour indiquer que j’ai lu)

Oups désolé de mon retard :S

Bon alors pour récupérer la sauvegarde, cela se fait en 3 étapes + la préparation :
-Déterminer si la sauvegarde est paire ou impaire, et la ramener à paire
-Déterminer la plus grande puissance de 2 composant la sauvegarde
-Déterminer les objets (si on continue sur l’exemple)

On peut faire ainsi :
[spoiler]“objets” est un groupe contenant les objets.

A=0
B=valeur de la sauvegarde

Si B != 2*(int(B/2)) :
{Si variable ID de l’objet “objets” = 1 : faire =1 à la variable possédé de “objets”
B=B-1
}

Tant que A<=B :
{C=A
A=A+1}

Tant que C>=1 :
{Si variable ID de l’objet “objets” = C : faire =1 à la variable possédé de “objets”
C=C/2
}[/spoiler]
A noter qu’il me semble bien qu’il est possible de faire la deuxième étape en un seul calcul au lieu d’utiliser une boucle, mais je n’arrive pas à le retrouver.

En programation on utiliserai la récursivité :

sauvegarde -> varSauv
nombre d'Items -> varItem

Fonction     ChercheObjet(varSauv, varItem )
{
     varItem * 2 = varVarIDObjet ;           //On a notre plus grosse puissance de 2
     varSauv - varIDObjet = varTest;         //Est-il là ?
     
     if(varTest ==0)                         //Le dernier objet testé était positif sinon on serais passé en négatif, mais il n'y 
          {                                  //aura plus d'objets
          getObjet(varIDObjet);              //On récupère l'objet
          return 1;                          //Fin de la fonction
          }

     else if(varTest > 0)                    //Ca veut dire que l'objet était dans le nombre, sinon on serais passé en négatif, mais 
          {                                  //il reste des objets
          getObjet(varIDObjet);              //On récupère l'objet
          varItem--;                         //On passe à l'objet suivant
          ChercheObjet(varItem, varItem);    //La fonction se relance avec les paramètres mis à jour (objet retiré + objet suivant)
          }
    
     else if(varTest < 0)                    //Ca veut dire que l'objet testé n'était pas dans le groupe, mais il en reste peut-être
          {
          varItem--;                         //On passe à l'objet suivant
          ChercheObjet(varItem, varItem);    //La fonction se relance avec les paramètres mis à jour (objet suivant)
          }

     return 0;  //Ou -1 en fonction de vos codes d'erreur, car si on est arrivé jusque ici c'est qu'il y a une couille dans le potage
}

Maintenant, honnêtement je ne sais pas trop comment faire pareil dans GD

Pour la programmation , mais suite à certain choix j’ai dû m’arrêter au moment de commencer :’(
Après c’est le plus simple et le plus courts que j’ai trouvé pour GD mais je n’ai pas énormément cherché aussi.