(1) 2 »


Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
03/09/2007 09:46
Post(s): 295
Bonjour / Bonsoir à tous

Je me suis remis il y a peu à Blender, et j'ai comme objectif aujourd'hui de devancer le problème auquel j'ai toujours eu à faire face : réaliser un concept de sauvegardes.

Etant ridiculeusement faible en Python, je n'exigerais pas un concept vachement lourd et soudé, mais quelque chose de simpliste et efficace.

A ce juste titre, j'aimerais juste créer un fichier python, dans lequel je pourrais répertorier les propriétés de tel ou tel objet (considérons par exemple le personnage principal). Le but serait de faire une manipulation (touche S pour sauvegarder) qui permettrait de modifier ce même fichier en affectant les propriétés au moment de la sauvegarde aux variables présentes dans le fichier python. J'imagine qu'il doit y avoir du "from objet import propriete", mais je ne sais pas du tout comment m'y prendre pour le coup.
Naturellement, le GE chargerait ce fichier à chaque lancement du jeu, afin de réobtenir les propriétés préalablement enregistrées.

La sauvegarde de positions des objets ne m'intéresse pas vraiment. Si déjà j'arrive à aboutir à cela, ce sera un grand cap de passé pour moi

Je pense que quelqu'un qui maîtrise davantage le Python a de quoi m'éclairer la lanterne.

Je m'excuse d'avance si un topic similaire a déjà été créé. Loin de là mon intention de venir encombrer le site.
Désolé également si mon message manque de clarté, j'ai du m'empresser de l'écrire.

Merci aux éventuelles futures réponses. Bye

Contribution le : 08/07/2011 16:23
_________________
Shake your coconuts !
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
28/11/2007 12:15
De Bretagne, et fier d'y être ! ou pas...
Post(s): 271
Salut,

Écrire dans un script python est un mauvais moyen de sauvegarde. Pourquoi ? Parce que voilà : en quittant le jeu, tu perdras tout. Il faut en fait écrire dans un fichier texte : pas forcément un .txt, mais ce que tu veux : .sav, .pouet...

Pour y arriver (avec quand même une petite maîtrise de python), je te conseille de regarder
ici et .

Bonne chance

Contribution le : 08/07/2011 16:44
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
03/09/2007 09:46
Post(s): 295
Malheureusement, je n'ai pas assez de connaissances pour pouvoir m'y jeter

Ce que j'ai du mal expliquer, c'est que j'aimerais, concrètement, modifier le fichier (qu'il soit en py, txt ou autre ...) VIA le Game Engine. En utilisant la touche sauvegarde, le truc serait d'attribuer (jusqu'à renouvellement de la sauvegarde) un certain nombre aux variables. Si le fichier texte est effectivement modifé, en le rechargeant à chaque lancement du jeu, cela ferait une sorte de sauvegarde.

Contribution le : 08/07/2011 17:31
_________________
Shake your coconuts !
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
17/02/2010 12:11
Post(s): 238
Yo !

Normalement, si tu a vu les boucles, les incrementations, l'ecriture dans les fichiers, et un peu de logique, ça devrait se faire.

D'abord: Recuperer ce que tu veux stocker.
Tu créé donc un objet, tu met deux sensors keybord pour les touches de sav/load, que tu relie a un controller python, pointant le script.
Ensuite tu crée tout l'attirail pour pourvoir se mouvoir, histoire que l'on puisse le bouger dans le game engine, le but sera de pouvoir sauvegarder sa position.

Une fois tout cela fait, attaquons le script:
/!\ Je suis encore et toujours sur la 2.49b, mais la transposition n'est pas compliquée !
# Je commenterais tout au long du script afin qu'il soit le plus clair possible.

# Avant tout je créé des raccourcis:
gl = GameLogic
x, y, z = 0, 1, 2

# Je recupere le controller:
cont = gl.getCurrentController()

# Je recupere l'objet:
obj = cont.owner

# Je recupere les touches de sav/load:
sav = cont.sensors["le_nom_du_sensors_de_ta_touche_sav"]
load = cont.sensors["le_nom_du_sensors_de_ta_touche_load"]

# Je recupere la position de l'objet:
pos = obj.position


Ensuite, a partir de la, plusieurs methodes.
Je vais donc faire la plus simple, du moins je pense.

# Systeme de sauvegarde/chargement:
nomFichier = "nom_fichier.extension"

# Est ce que le sensor sav est activé ?
if sav.positive == 1:

     # Dans ce cas, ouvrir le fichier en mode ecriture seulement ("w" = write)
     fichier = open(nomFichier, "w")
     # J'ecris la position:
     fichier.write(pos)
     # Et je ferme le fichier:
     fichier.close()

if load.positive == 1:

     # Là, j'ouvre le fichier en mode lecture seulement ("r" = read)
     fichier = open(nomFichier, "r")
     # Je lit la position:
     posF = fichier.read()
     # Je ferme le fichier, j'ai eu ce que je voulais
     fichier.close()

     # Et enfin j'assigne la position à l'objet:
     obj.position = eval(posF)


Et voila ! normalement, tout fonctionne !
Je dit bien normalement, et je te rappel bien que c'est pour la 2.49b. Etant donné que je l'ai pas testé (j'ai pas blender sous la main...) il se peut qu'il y est EVENTUELLEMENT une toute petite erreur... Auquel cas tu peux m'envoyer le blend, et je verrais pour trouver blender afin de corriger ça...

Bref, le script et relativement simple là, dès que l'on souhaite sauvegarder plus de variables, ca devient un peu plus folklorique

Ah et encore, essaye de ne pas charger avant de sauvegarder, comme le fichier de sauvegarde n'est créé que lorsque tu sauvegarde, il va renvoyer une erreur comme quoi il trouve pas. Mais si tu as deja sauvegarder avant, tu peux fermer blender et relancer le chargement sans probleme, le fichier sera toujours la.

Voili voilo !

Contribution le : 09/07/2011 15:24
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
17/02/2010 12:11
Post(s): 238
EDIT: tu constatera meme que dans mon script j'utilise meme pas d'incrementations, ou de boucles ! C'est parce que la methode que j'ai utilisé là est vraiment la plus simple qui soit ! Apres un script c'est comment dire... Une fois que tu connais les fonctions, etc... C'est comme un lego:
Faut assembler ce que tu as appris (les blocs) de maniere a realiser ce que tu souhaite, il faut donc etre le plus astucieux possible, et le plus rigoureux, sinon ca ressemble a rien, et ça marche pas

+ Note aux modos: le double post est du a l'incapacité du site a me laisser editer le message precedant...
"Could not insert post blablabla blablabla..."

Contribution le : 09/07/2011 15:29
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
03/09/2007 09:46
Post(s): 295
Merci beaucoup pour ta réponse claire et rapide
Toutefois, elle ne répond pas exactement à mes attentes

Je vais essayer d'être le plus explicite possible (au temps pour moi si j'ai manqué de rigueur et de clarté dans mes propos) :

Je crée un jeu de plateaux par exemple. Je crée un fichier python, dans lequel j'écris clairement une variable à laquelle j'attribue la valeur "0" (on a donc nombre_de_plateaux_finis = 0). Maintenant j'aimerais, par exemple, que si je finis le plateau Numéro 1 (j'en sais rien moi, avec une simple Collision avec un tel ou tel objet 'finish'), cette valeur s'incrémente de 1. On aura donc nombre_de_plateaux_finis = 1. Le joueur n'aurait pas à sauvegarder sa progression, elle serait donc effectuée à chaque fois qu'il remplit un plateau.
Et le but serait que si je relance le jeu (je manipule les actuators pour avoir une relecture à chaque fois du fichier python), ce dernier se souvienne, via la variable, quel plateau j'ai su atteindre. En ouvrant le fichier, Blender comprendrait donc explicitement : le joueur a déjà fini le plateau Numéro 1, il peut commencer directement au 2.

Je maîtrise les briques logiques de Blender, faire un perso et des plateaux, je peux m'en sortir allègrement. Ce qu'il me manque, c'est une sorte de fichier "mémoire" dans lequel une variable indique la progression dans le jeu, et qui est lu à chaque lancement du jeu.
Et c'est là que, clairement, je ne connais pas la manipulation à établir.

Ce qui m'intéresse donc, c'est ce bout de code que tu m'as gentiment proposé :

# Systeme de sauvegarde/chargement:
nomFichier = "nom_fichier.extension"

# Est ce que le sensor sav est activé ?
if sav.positive == 1:

# Dans ce cas, ouvrir le fichier en mode ecriture seulement ("w" = write)
fichier = open(nomFichier, "w")
# J'ecris la position:
fichier.write(pos)
# Et je ferme le fichier:
fichier.close()

if load.positive == 1:

# Là, j'ouvre le fichier en mode lecture seulement ("r" = read)
fichier = open(nomFichier, "r")
# Je lit la position:
posF = fichier.read()
# Je ferme le fichier, j'ai eu ce que je voulais
fichier.close()

# Et enfin j'assigne la position à l'objet:
obj.position = eval(posF)


Sauf qu'à la place de la position, j'aimerais sauvegarder une propriété d'un objet. La valeur de cette même propriété permettrait de repérer la progression du joueur. Si cette propriété est égale à 2, je sais que le joueur a complété les deux premiers niveaux. Via mes briques logiques je pourrai facilement faire en sorte que le joueur ait accès aux plateaux 1, 2, et naturellement le 3.

Bref, je pense que le vif du problème est tout là

[EDIT] : Voilà un blend cadeau (super méga basique, soyons d'accord) qui je l'espère, peut vous éclaircir davantage.

http://dl.free.fr/mC2eoaMw2

J'ai laissé comme propriété de base : disponible = 1. Seul le premier plateau est accessible. Essayer vous-même en lançant le jeu, il n'y a rien de sorcier là-dessous. Si vous quittez le jeu et que vous attribuez la valeur 2 à la propriété 'disponible', deux plateaux seront alors accessibles. Même principe pour la valeur 3 (mais je me suis arrêté ici hein ). Utilisez les flèches Haut et Bas pour diriger le curseur.
Il faudrait qu'à chaque lancement du jeu, l'objet 'menu' exécute une lecture du fichier python contenant la variable concernant les niveaux préalablement terminés, permettant d'attribuer à sa propriété 'disponible' la valeur indiquée dans ce fichier python. Les niveaux accessibles dépendent directement de la propriété 'disponible' détenue par l'objet 'menu'.
C'est pas très esthétique, mais il n'y a aucune raison pour que ce concept de sauvegarde ne marche pas

Contribution le : 09/07/2011 21:06
_________________
Shake your coconuts !
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
17/02/2010 12:11
Post(s): 238
Tu veux simplement incrementer une variable ?
J'aimerais bien te donner le code pour te montrer, mais c'est trop facile.
J'aimerais tout autant que tu reflechisse afin de te faire un peu a la logique pythonniene !

Indices: (Et si tu seche VRAIMENT, t'aura la soluce...)
1. J'ai utiliser les fonctions "open()", ".read()", et ".write()".
2. On peut passer comme arguments a la fonction open:
fichier = open("nom_du_fichier.txt", "a"/"w"/"r")
Respectivment "append" (ajouter a la suite), "write" (effacer tout le fichier puis ecrire jusqu'a la fermeture), "read" (lire... On peut utiliser ".read()" seulement avec ce mode.)
3. Le principe est de connaitre la valeur stockée afin de l'incrementer en consequence.

Grosso modo:
Si Touche_Sav == Appuyée:
     Var = A combien est egale la valeur du fichier de sav ?
     Effacer puis ecrire dans le fichier(Var+1)


Et pour info le deuxieme bout de code ne marche pas sans le premier.

Je te laisse t'inspirer de ce que je t'ai donné, et faire ton script

Contribution le : 09/07/2011 23:32
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
17/02/2010 12:11
Post(s): 238
EDIT: Et je viens de remarquer que j'ai créé le raccourcis "x, y, z = 0, 1, 2" pour rien. (p1)

Raaaah ! "Could not insert forum post"

Contribution le : 09/07/2011 23:36
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
03/09/2007 09:46
Post(s): 295
Merci encore de ton aide

Je méditerai tout ça à tête reposée. Puis je viendrai poster à nouveau pour donner mes résultats, concluants ou non

Contribution le : 09/07/2011 23:58
_________________
Shake your coconuts !
Créer un fichier PDF de la contribution Imprimer


Re: Sauvegarder des propriétés : modifier un script python via le GE
Fou Furieux du Clan
Inscrit:
09/12/2008 15:22
Post(s): 300
A la lecture de tes posts, je pense que tu n'as pas bien compris comment fonctionne python.
Python est un langage de script interprété ce qui signifie qu'il n'est pas compilé. Il est exécuté à partir du fichier texte contenant le code.

Mais quand le code est exécuté, python ne modifie pas le fichier texte à la volée. Le code du fichier que tu exécutes à un instant T est chargé en mémoire et transformé par l'interpréteur (en réalité python est semi-interprété comme JAVA). Lorsque tu changes la valeur d'une variable durant l'exécution par exemple en faisant :
x=y+1
Elle ne se modifie pas dans ton fichier texte mais dans la mémoire du PC.

Pour ton problème, si ton niveau courant est contenu dans une variable, il ne faut pas modifier le fichier python qui déclare cette variable.
Il faut, comme on te l'a conseillé, sauver cette valeur dans un autre fichier et la charger au démarrage. Plusieurs raisons à cela :
- Si tu modifies directement le fichier, comment je fais moi si je veux recommencer à 0 le jeu et que tu n'as pas prévu une fonction qui remette tout aux valeurs d'origine.
- Bonjour la difficulté, si tu modifies les variables, pour trouver les problèmes à l'exécution.

Pour ton système de sauvegarde automatique, il suffit de déclencher la sauvegarde au moment ou l'événement "niveau terminé" se déclenche

Contribution le : 10/07/2011 10:38
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
The Blender Clan 'tchat Architecture / squelette du futur BC2.0    [1][2][3]...[6] 52 2765 Hier 20:46:43
meltingman 
Questions & Réponses Animation et Rendu 6 26 Hier 20:30:40
AIKO 
Questions & Réponses Vidéo autour d'un objet 1 27 Hier 19:19:58
moonboots 
[WIP] et travaux terminés [WIP] La gabarre '' Le Gros Ventre''    [1][2][3] 28 1165 Hier 15:14:35
Guiu 
Questions & Réponses wireframe 9 84 Hier 14:55:06
maddjex 
[WIP] et travaux terminés [terminé] Imprimante à jet d'encre industrielle    [1][2] 13 2630 Hier 14:05:22
dj3dim 
Questions & Réponses Fonction appareil photo qui ne prend pas de photos 5 101 Hier 05:03:08
meltingman 
Questions & Réponses Bool Tool et le le modificateur Subdivise 3 93 04/12 16:57:40
Guiu 
[WIP] et travaux terminés [WIP] Coming Home (Animation de Noël)    [1][2][3] 20 608 04/12 16:27:04
Bibi09 
The Blender Clan 'tchat Benchmark EEVEE    [1][2][3][4] 35 2950 04/12 10:50:39
Bibi09 
Hors Sujet !! Tutoriels "Bonhomme de neige avec EEVEE" 9 170 04/12 10:27:13
Bibi09 
Questions & Réponses Animation 2D débutant 9 141 03/12 21:05:42
BailandIbelin 
[WIP] et travaux terminés [WIP] BUDY3000 prochain tuto spécial : modélisation semi mécanique    [1][2] 10 315 03/12 13:58:42
Guiu 
Python & Plugins ajouter plusieurs fois le même objet avec le même retard 1 54 03/12 13:25:46
meltingman 
Hors Sujet !! Comment se servir du Vertex Group- créer une fiole sans déplacer un vertex 0 74 03/12 12:32:01
meltingman 
Questions & Réponses [WIP] Typo 6 199 02/12 22:45:30
Laorz 
Questions & Réponses [physique] patte à modeler 2 57 02/12 22:00:39
prometheusx 
The Blender Clan 'tchat Blender 2.8x : Actus, tests, feedback..    [1][2][3]...[7] 66 38061 02/12 19:10:37
lucky 
Questions & Réponses Particules qui tombent puis restent collées à la surface 3 95 02/12 13:17:11
Bibi09 
[WIP] et travaux terminés [WIP] Les wips à Chikin    [1][2] 11 2582 01/12 19:24:49
chikin 

Qui est en ligne
165 utilisateur(s) en ligne (dont 125 sur Forums)

Membre(s): 1
Invité(s): 164


AngieMaxte, plus...
Nouveaux membres
GregCronan 6/12/2020
LynetteHam 6/12/2020
TyroneGarr 6/12/2020
IndiraMots 6/12/2020
HelenaTomk 6/12/2020
CeliaMonta 6/12/2020
OrenRek10 6/12/2020
MatthiasMa 6/12/2020
ChanceCarr 6/12/2020
MarkusJack 6/12/2020
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Dec 29
Anniversaire d'ebrain
Jan 9
BUG de Lyon
Fev 15
Anniversaire de Dany
plus 263 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445