De Scratch Wiki en français
Faire une sauvegarde, c'est un peu enregistrer l'état d'un projet à un moment donné de son utilisation par un scratcheur pour permettre à celui-ci d'arrêter puis de reprendre plus tard au même point plutôt que de devoir tout recommencer.
Principe
Lorsqu'un scratcheur utilise un projet, il modifie plusieurs valeurs. Ce sont principalement les variables mais cela peut être aussi des listes, la position d'un sprite, le numéro d'un costume, etc... Si rien n'est sauvegardé lors de l'arrêt du projet, lorsque celui-ci redémarre toutes ces valeurs reprennent leurs valeurs par défaut défini par le créateur du projet. Faire un code de sauvegarde, c'est convertir les valeurs modifiées en une suite de caractères que le projet pourra ensuite demander pour revenir à l'état qu'il avait lorsqu'il a été arrêté.
Comment faire un système de sauvegarde
Premiers pas
Commençons par quelque chose de très simple. Allez dans votre page mes projets et créez un nouveau projet. Vous verrez comme d'habitude le Scratch Cat au centre de l'écran. Entrez ces scripts :
quand le drapeau vert pressé basculer sur le costume (costume1 v) quand ce sprite est cliqué basculer sur le costume (costume2 v) dire ([numéro v] du costume)
Maintenant lancez le projet et cliquez sur le Scratch Cat. Félicitations! Vous venez de faire votre premier code de sauvegarde : «2». Vous ne me croyez pas ? Arrêtez le projet et relancez le autant de fois que vous voulez, le Scratch Cat retourne sur le costume1. Mais modifiez maintenant le script de cette façon :
quand le drapeau vert pressé basculer sur le costume (costume1 v) demander [Code ?] et attendre basculer sur le costume (réponse) quand ce sprite est cliqué basculer sur le costume (costume2 v) dire ([numéro v] du costume)
Relancez le projet et entrez le code «2». Le Scratch Cat retourne alors sur le costume2 qu'il avait lorsqu'il vous a donné le code. Alors oui c'est rudimentaire mais ça vous montre le principe. Vous venez de dire au projet de retourner à l'état qu'il avait lorsque vous l'avez arrêté.
Approfondir
Voyons maintenant lorsqu'il y a plusieurs paramètres à sauvegarder. Effacez le script précédent et mettez celui-ci à la place:
quand le drapeau vert pressé basculer sur le costume (nombre aléatoire entre (1) et (2)) mettre la taille à (nombre aléatoire entre (50) et (150))% de la taille initiale s'orienter à (nombre aléatoire entre (0) et (360)) aller à (position aléatoire v)
Lancez le projet plusieurs fois. Vous allez voir le Scratch Cat aller à plusieurs endroits, grandir, rapetisser, changer de costume et tourner. La probabilité de faire deux fois la même chose est très, très faible (encore moins que gagner au loto). Nous avons 4, ou plutôt 5, valeurs à sauvegarder (puisque la position aléatoire se définit par une abscisse x et une ordonnée y). Pour cela créez une variable «compteur» ainsi que deux listes «sauvegarde» et «code».
(compteur)
(sauvegarde ::list)
(code ::list)
Il faut également choisir un élément déclencheur à la sauvegarde, par exemple quand la touche «s» (pour sauvegarde) est pressée.
quand la touche [s v] est pressée
Et surtout : il faut choisir un caractère qui n'a aucune chance de se trouver dans les valeurs sauvegardées. Ici par exemple le pont-virgule (;). Mais si le point-virgule peut être présent dans l'une des valeurs (comme un texte par exemple) il faut choisir autre chose. Si vraiment vous n'avez aucune possibilité, gardez le point-virgule mais vous serez obligé de chiffrer le code (voir chapitre «Chiffrer le code», paragraphe «convertir chaque caractère du code en nombre»). Ce caractère va servir à séparer les éléments du code.
Voyons maintenant le script de sauvegarde :
quand la touche [s v] est pressée // élément déclencheur de la sauvegarde supprimer tous les éléments de la liste [sauvegarde v] //on supprime les éléments d'une éventuelle sauvegarde précédente supprimer tous les éléments de la liste [code v] ajouter ((numéro v) du costume) à (sauvegarde v) //on place les valeurs à sauvegarder dans la liste sauvegarde ajouter (taille) à (sauvegarde v) ajouter (direction) à (sauvegarde v) ajouter (abscisse x) à (sauvegarde v) ajouter (ordonnée y) à (sauvegarde v) ajouter [Votre code est :] à (code v) //on commence à écrire le code dans la liste code ajouter [] à (code v) mettre (compteur) à (1) répéter (longueur de [sauvegarde v]) fois //on prend une par une les valeurs de la liste sauvegarde remplacer l'élément (2) de la liste [code v] par (regrouper (élément (2) de [code v]) et (regrouper (élément (compteur) de (sauvegarde v)) et [;])) //on ajoute chaque valeur dans le code en les séparant par le point-virgule. ajouter (1) à (compteur) fin montrer la liste (code v) //on affiche la liste code dont la première ligne est «Votre code est :» et la deuxième ligne est le code proprement dit composé des valeurs sauvegardées séparées par le point-virgule.
Voilà, sur la deuxième ligne de la liste code vous devriez voir quelque chose comme «2;98;-85;-188;-148;». C'est votre code. Vous pouvez cliquer dessus et le copier pour le coller ensuite où vous voulez.
Voyons maintenant comment l'utiliser. Il faut choisir un nouvel élément déclencheur. Les anglophones utilisent souvent la touche «l» (pour load), nous utiliserons donc la touche «c» (pour charger). Bien évidemment, si vous voulez que ça se passe dès le lancement du projet vous pouvez utiliser quand le drapeau vert pressé
.
Voici le script :
quand la touche [c v] est pressée // élément déclencheur de demande du code demander [Code ?] et attendre //demande du code supprimer tous les éléments de la liste [sauvegarde v] //on supprime les éléments d'une éventuelle sauvegarde précédente ajouter [] à (sauvegarde v) //on commence à placer la première valeur du code dans la liste sauvegarde mettre (compteur) à (1) répéter (longueur de (réponse)) fois //on prend un par un les caractères du code jusqu'au prochain point-virgule si <(lettre (compteur) de (réponse)) = [;]> alors //si on arrive au point-virgule ajouter [] à (sauvegarde v) //on passe à la valeur suivante sinon remplacer l'élément (longueur de [sauvegarde v]) de la liste [sauvegarde v] par (regrouper (élément (longueur de [sauvegarde v]) de [sauvegarde v]) et (lettre (compteur) de (réponse))) //sinon on ajoute chaque caractère du code dans le dernier élément de la liste sauvegarde. fin ajouter (1) à (compteur) fin basculer sur le costume (élément (1) de [sauvegarde v]) //on remet le Scratch Cat à la position sauvegardée mettre la taille à (élément (2) de [sauvegarde v])% de la taille initiale s'orienter à (élément (3) de [sauvegarde v]) aller à x:(élément (4) de [sauvegarde v]) y:(élément (5) de [sauvegarde v])
Après avoir copier le code de sauvegarde, relancez le projet en cliquant sur le drapeau vert pour faire bouger le Scratch Cat, puis appuyez sur la touche «c» et entrez le code. Le Scratch Cat revient à la position sauvegardée.
Chiffrer le code
Dans certains cas vous pouvez avoir envie de chiffrer le code. Par exemple dans un jeu, pour éviter que l'utilisateur augmente son nombre de vies ou son score. Dites vous bien que dans Scratch aucun chiffrement ne pourra éviter que certains ne trichent. En effet, en ouvrant votre projet pour en voir à l'intérieur les scripts, ils comprendront comment vous avez chiffré le code et donc comment le déchiffrer. Et si vous essayez de rendre vos scripts trop compliqués à lire, il reste de toute façon la possibilité de remixer votre projet puis de modifier la valeur des variables avant de générer un nouveau code. Voici quelques méthodes qui ont été proposées :
Mettre un texte dans une <string>
Utilisez cette page pour comprendre le terme anglais de "string".
Paramètres
Avant de vouloir mettre un texte dans une string, il faut définir pour cette méthode sans pertes deux paramètres :
- un symbole montrant le début et la fin de la string comme "
- un symbole permettant d'ignorer les propriétés du caractère qui suit comme §
Explications
L'idée est de créer une "string" un peu § comme celle-ci... deviendra "L'idée est de créer une §"string§" un peu §§ comme celle-ci...". Le but n'est pas de créer une string lisible par l'humain mais une string lisible pour le programme.
Codage
définir Coder la (string) (p1) (p2) mettre [i v] à (1) mettre [code v] à () répéter (longueur de (string)){ si <<(lettre (i) de (string)) = (p1)> ou <(lettre (i) de (string)) = (p2)>> alors { mettre [code v] à (regrouper (code) et (regrouper (p2) et (lettre (i) de (string))) } sinon { mettre [code v] à (regrouper (code) et (lettre (i) de (string))) }::control ajouter (1) à [i v] }@loopArrow::control
Lecture
définir Lire la (string) avec (limites) (ignorer) (début) mettre [j v] à (début) si <(lettre (j) de (string)) = (limites)> alors { ajouter (1) à [j v] mettre [lecture v] à () répéter jusqu'à ce que <(lettre (j) de (string)) = ()> { si <(lettre (j) de (string)) = (limites)> alors { mettre [ajouté v] à (((j) + (1)) - (début)) stop [ce script v] } sinon { si <(lettre (j) de (string)) = (ignorer)> alors { mettre [lecture v] à (regrouper (code) et (lettre ((j) + (1)) de (string))) ajouter (1) à [j v] } sinon { mettre [lecture v] à (regrouper (code) et (lettre (j) de (string))) }::control }::control ajouter (1) à [j v] }@loopArrow::control Dire [Une erreur est survenue lors de la lecture : pas de fin à la string] } sinon { Dire [Une erreur est survenue lors de la lecture : pas de début correct pour la string] }::control
Conclusion
Essayez de chiffrer un texte contenant vos paramètres, puis de le lire.
Ensuite, essayez de chiffrer la string obtenue, puis lisez le résultat.
Cette méthode ne perd aucune donnée, de plus, avec la variable (ajouté)
, vous pouvez savoir où la lecture s'est arrêtée. Vous pouvez donc coller bout à bout des strings pour faire un format de sauvegarde.
Multiplier les nombres par un nombre quelconque
Ceci ne fonctionne qu'avec les nombres. Par exemple si votre variable vaut 150 vous faites pendant la sauvegarde
ajouter ((variable) * (2468)) à (sauvegarde v)
Et bien sur après le déchiffrement du code vous faites
mettre [variable v] à ((variable) / (2468))
Convertir chaque caractère du code en nombre
Cette technique se base sur celle du chiffrement des variables cloud qui n'acceptent que les chiffres. Vous trouverez un tutoriel à cette adresse : Variables cloud : convertir chaque lettre en nombre. Avec cette technique le code «2;98;-85;-188;-148;» devient «02660908667008056670010808667001040866».
Algorithmes de cryptographie
N'importe quel algorithme de cryptographie depuis les anciens chiffrements par substitution (César, Vigenère, etc...) jusqu'aux plus modernes peuvent être utilisés. N'étant pas spécifiques à Scratch, ils ne seront pas développés dans ce tutoriel. Vous trouverez de nombreux projets traitant de ces sujets. N'oubliez pas que certains sont complexes à mettre en œuvre et qu'ils vont beaucoup alourdir votre script pour un résultat assez aléatoire.