Construct 2 fournit un moyen facile de réaliser des sauvegardes. Cela permet à vos joueurs de sauvegarder la partie, puis de revenir plus tard et de la recharger exactement là où ils l'avaient laissée. C'est important pour les jeux longs, spécialement quand les niveaux sont longs. Alors qu'il est possible d'avoir une sauvegarde de type "dernier niveau atteint" en utilisant le plugin Local Storage, il est très difficile de l'utiliser pour sauvegarder l'état complet de chaque objet. Les actions save et load de l'objet System vous permettrons de le faire, vous permettant d'ajouter une fonctionnalité de sauvegarde de la partie sophistiquée au prix de très peu d'efforts.
Sauvegarde basique
Une manière simple d'ajouter une sauvegarde est d'utiliser le actions save et load de l'objet système quand une touche précise est enfoncée, par exemple :
Pour les jeux sur mobile vous devrez évidement ajouter un bouton quelque part, mais pour rester simple nous allons nous concentrer sur les jeux pour ordinateur.
Les sauvegarde sont stockées sur le disque par le navigateur. Cela signifie que les joueurs peuvent éteindre leur ordinateur, revenir le jour suivant, et que la sauvegarde pourra toujours être chargé. Notez que cependant la sauvegarde est associée au navigateur utilisé. Par exemple, Chrome et Firefox stockeront les sauvegardes séparément; si un joueur utilise Chrome puis passe à Firefox, il ne pourra pas charger sa sauvegarde.
Les sauvegardes ne sont pas enregistrées dans le cache. Le cache du navigateur est plus un stockage temporaire utilisé pour stocker des choses comme des images provenant de pages internet, il est utilisé pour ne pas avoir à les re télécharger à chaque fois, et il est régulièrement vidé. les sauvegardes ne sont pas placées là (heureusement), elles sont stockées dans le WebStorage ou IndexedDB, qui sont des stockages permanent qui ne sont pas affectés lorsque l'utilisateur vide son cache.
Emplacements de sauvegarde (save slot)
Il est souvent utile de permettre au joueur d'avoir plusieurs sauvegardes. C'est ce que permet l'emplacement de sauvegarde. Chaque emplacement est comme un fichier différent qui stockerai une sauvegarde différente.Vous pourriez proposer au joueur un ensemble d'emplacements pour ses sauvegarde, ou lui permettre de donner un nom aux sauvegardes.
Attention la plupart des navigateurs imposent une limite à la quantité de données qu'une page internet peut enregistrer sur le disque. Cela ne posera pas de problème pour la plupart des jeux, mais si vous avez un grand nombre d'emplacements vous pourriez atteindre cette limite. C'est pourquoi limiter le nombre d'emplacements utilisés est une bonne façon de s'assurer que cette limite ne sera pas franchie. Une utilisation judicieuse du comportement no save (pas de sauvegarde) peut aussi aider à contenir la taille des sauvegardes (voir plus bas).
événements terminés
Sauvegarder peut prendre du temps, et le jeu continue à tourner durant ce temps. Une fois la sauvegarde terminée, le système déclenche l'événement On save complete (quand la sauvegarde est terminée). De la même façon charger une sauvegarde peut prendre du temps aussi, dans ce cas le système déclenche l'événement On load complete (quand le chargement est terminé). Notez que si des changement sont fait après l'action Save, mais avant l'événement On save complete, ils devront toujours être sauvegardés.
Si vous essayez de charger depuis un emplacement qui ne contient pas de sauvegarde, l'événement On load failed sera invoqué. Si l'utilisateur choisi de charger un tel emplacement vous pourriez décider de commencer une nouvelle partie.
comportement 'No Save' (pas de sauvegarde)
Tous ce qui a le comportement No Save ne sera pas sauvegardé, et ne sera pas concerné par le chargement. Une bonne pratique est d'affecter le comportement no save à tous les objets statiques, tels que les arrière plans. On peut aussi l'allouer aux objets qui sont automatiquement mis à jour tel que les textes ou les HUD qui sont mis à jour à chaque tick. Cela ne fera aucune différence pour le jeu mais ça rend les sauvegardes plus petites et plus rapide à charger ou sauvegarder car toutes les informations inutiles seront omises. (C'est aussi nécessaire pour permettre à l'aperçu en continu de fonctionner correctement.)
Modifier le projet après une sauvegarde
Les sauvegardes devraient être résistantes aux changements. Vous devriez être capable d'ajouter, supprimer ou modifier différentes choses comme des variables, comportements et autres objets, tout en continuant à pouvoir utiliser d'anciennes sauvegardes correctement. Notez que chaque ajout n’aura pas de donnée sauvegardées et ne sera donc pas affecté par le chargement. Notez aussi que si vous supprimez quoi que ce soit, ce ne pourra plus être chargé à nouveau. Vous pouvez supprimer des instances individuelles sans affecter les sauvegardes mais si vous supprimez complètement un type d'objet, layout ou layer, ils ne pourront plus être chargés depuis les sauvegardes.
Fonctions avancées
Tout ce que nous venons de voir jusqu'à présent suffit à ajouter une fonction de sauvegarde à la plupart des jeux. Cependant des utilisateurs plus avancés pourraient être intéressés par une étude plus approfondie du système de sauvegarde.
Tracer quels emplacements sont utilisés
Le système de chargement/sauvegarde ne permet pas de savoir quels emplacements sont utilisés. La meilleure façon de le tracer et de stocker des méta données vous même dans un objet WebStorage. Par exemple, chaque fois que vous sauvegardez dans un emplacement, vous écrivez aussi une clé de WebStorage qui indique que l'emplacement à été utilisé. Vous pourriez aussi ajouter d'autres méta données comme le nom du joueur ou même une petite capture d'écran du jeu en tant qu'URI. Vous pourrez alors dire quels emplacements sont utilisés et faire d'autres opérations comme mettre à zéro des sauvegardes juste en modifiant ces méta données, par exemple en les supprimant pour faire comme si l'emplacement était de nouveau vide.
Ce qui est et n'est pas sauvegardé
L'état complet du jeu - y compris les variables d'instance, les variable locales et globales, les comportements, effets, particules, audio en train d'être joué, etc. - est sauvegardé. Cependant il y a quelques exceptions, heureusement aucune d'elles n'est surprenante. Les choses suivantes ne sont pas sauvegardées et ne seront pas affectées par le chargement:
- Les états des saisies (i.e. position de la souris, ou touches enfoncées)
- Requêtes AJAX
- Connexion WebSocket
- L'objet XML
- Les entrées audios ou vidéos de l’utilisateur
- Le login FaceBook
- L'état du WebStorage
- L'état CocoonJS/Windows 8
- Les achats in app de toutes les plateformes
- Tout ce qui a le comportement 'No Save'
Utilisation directe des données JSON
Dans les deux événements On save complete et On load complete, l'expression système SaveStateJSON renvoie une chaine de toutes les données JSON pour la sauvegarde. Notez que l'expression SaveStateJSON reverra une chaine vide depuis l'extérieur de ces événements, ils sont l'unique opportunité d'accéder aux données directement.
Si vous possédez votre propre serveur il est possible de créer des sauvegardes partagées en en envoyant les données JSON au serveur avec l'objet AJAX et de les stocker dans la base de données du serveur. Sinon les plateformes comme Windows 8 et Clay.io vous permettent de stocker des données pour l'utilisateur connecté. C'est utile pour permettre aux utilisateurs d'emporter leurs sauvegardes avec eux où qu'ils aillent.
Une fois que vous avez récupéré la chaine JSON, vous pouvez charger la partie à partir d'elle en utilisant l’action système Load from JSON.
Gestion des versions
Habituellement vous pourrez changer vos projets et vos vieux jeu tout en continuant à pouvoir charger correctement les sauvegardes. Cependant certains utilisateurs avancés peuvent vouloir savoir de quelle version du jeu une sauvegarde est issue. Vous pouvez le faire en utilisant un valeur globale. Appelez la variable Version et initialisez la à 1. Plus tard, quand vous publierez une nouvelle version de votre jeu, changez sa valeur initiale e.g. 2. Maintenant quand l'événement On load complete a été invoqué, la variable globale à été chargée avec la valeur de "Version" en cours au moment de la sauvegarde. Cela peut être utile si vous avez de nombreux nouveaux objets dans le jeu mais que vous voulez être sur qu'il sont cachés ou détruits lors du chargement d'une ancienne sauvegarde.