Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV

Apprendre
RPG Maker

Guides
Tutoriels
Making-of

Dans le
Forum

Section Entraide

Tutos: Approximer les fonctions cos et (...) / News: RMN Music Pack 2 enfin sorti ! / Divers: RPG Maker Paper patch 1.5.6 / Interviews: FoxFiesta (Aurélien Dos (...) / News: Alex d'or 2020 : Fin des tests et (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

165 connectés actuellement

10767821 visiteurs
depuis l'ouverture

9 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Hellsoft

Planète Glutko

Guelnika & E-magination

Le Studio du Chat Vert

RPG Maker Détente

Lunae - le bazar d'Emz0

Tous nos partenaires

Devenir
partenaire



Ruby : écrire et LIRE un fichier.
Ecrit par RPG-Man le 17/02/2009

Bon, ceci est un tutoriel qui vous permettra d'écrire et de lire un fichier qui déterminera des paramètres dans votre jeu, et qui permettra à un joueur de modifier certains paramètres.
Et cela en incluant une sécurité !

Difficulté : moyenne

A connaître : Les bases du ruby, le reste est expliqué, certains points de base sont aussi repris.

On apprend en plus des bases:
-l'utilité de la méthode "split" et de la méthode "gsub!" .
-Lire et écrire un fichier
-Gestion de l'erreur avec la structure begin...rescue...end

ETAPE 1 : Les paramètres et la syntaxe du fichier
---Paramètres à inclure---
Nous allons donc choisir quelques paramètres à déterminer.
Prenons, par exemple, deux variables de RPGMaker :
-$fontface qui détermine la police du texte
-$fontsize qui détermine la taille du texte

---Syntaxe du fichier---
Alors, je vais vous montrer une syntaxe simple, que vous utiliserez pour pouvoir lire le fichier, et en tirer des informations:



Portion de code:





Paramètre1 = valeur ;

P a r a m è t r e2 = A r ial_Blac k

Pourquoi est-ce écrit ça comme ça??
Parce que notre syntaxe ne prendra pas en compte les espaces donc :
P a r a m è t r e2 revient à écrire paramètre2.
Pourquoi ce tiret "_" entre Arial et Black?
Parce que ce tiret sera transformé par la suite par un espace,et si on colle Arial et Black, la police ne sera pas reconnue.
Ensuite, ce point virgule, c'est quoi??
(Bon, ouais, je me suis un peu inspiré du C++)
C'est pour séparer nos instructions, vous verrez comment par la suite.
Donc, voilà pour ça, la syntaxe est établie! Rire grinçant
Maintenant, on va définir les paramètres par défaut du fichier ainsi que son nom.
Appelons le "Params.txt"
Et dedans, mettons:
Police = Arial;
Taille = 24

Remarques :
-la dernière instruction n'a pas besoin d'avoir un point virgule en sa fin.
-On crée le fichier une première fois pour tester, vous verrez pourquoi par la suite il se créera tout seul Rire grinçant


ETAPE 2: Lecture du fichier
Là, les choses sérieuses commencent ! Démon
Nous devons tout d'abord ouvrir le fichier en lecture seule, puis, enregistrer son contenu dans une variable.
Procédons comme ceci:



Portion de code:





file = File.open("Params.txt", "r")

fichier = file #Vous verrez pourquoi après, c'est pour fermer
fichier = fichier.read

Mais qu'est ce que c'est ça??
Tout d'abord, on demande d'ouvrir le fichier "Params.txt", puis...
Ce "r" là, comme deuxième argument Késako ??
Ça veut dire qu'on l'ouvre en lecture seule on écrira pas dessus pour le moment, le pointeur se placera aussi au début du fichier.
Puis on demande à ce que la variable fichier prenne le contenu du document texte.

Alors, ça y est, on à tout dedans, mais comment on fait pour interpréter ça?????

Tout d'abord, on va enlever les espaces et transformer les tirets ("_") en espaces, comme cela:



Portion de code:





fichier.gsub!(" ", "")

fichier.gsub!("_", " ")

La méthode gsub! permet de remplacer une chaîne de caractères par une autre. Un exemple plus flagrant :



Portion de code:





fichier.gsub("oui", "true")

Ici, tous les "oui", seront transformés en "true"

Ceci fait on va séparer les instructions comme suit:



Portion de code:





fichier = fichier.split(";") 

Késako ça aussi ??
Et bien, cela transforme la chaîne de caractère fichier, en un tableau, qui contient plusieurs chaînes de caractères : les parties séparées par les points virgules ! En fait, on a demandé de "couper" là où il y a un point virgule.
Donc, maintenant, pour avoir une vision:
fichier = ["Police = Arial", "Taille = 14"]
Voilà à quoi est égale notre variable fichier...
On peut rien faire avec ça non plus, il faut déjà mettre chaque partie du tableau dans une variable. Alors, on va faire:



Portion de code:





police = fichier[0]

taille = fichier[1]

Et voilà, on se retrouve avec 2 variables : police et fichier... police étant égale à la première partie du tableau et taille à la seconde...
Mais on peut encore rien faire avec ça...
On va donc séparer ce qui est d'un côté du "=", et ce qui est de l'autre côté et qui nous intéresse!
Alors on fait:



Portion de code:





police = police.split("=")

@police = police[1] #Pour qu'il soit reconnu plus tard
taille = taille.split("=")
@taille = taille[1].to_i #Pour qu'il soit reconnu plus tard

Une chose à noter : on convertit la chaîne de caractères "42" en un Integer (un entier) 42 grâce à la méthode to_i
Maintenant, on a les infos, ici on a:
police = "Arial"
taille = 24

Et pour la fin, on met cette ligne de code:



Portion de code:





file.close

Il ne nous reste plus qu'à mettre ça là où il faut.
C'est à dire, au commencement de tout... dans l'antre du script "main"!!!!
Donc, tout au début de main, mettez tout ce que je vous ai montré:



Portion de code:





file = File.open("Params.txt", "r")

fichier = file #Vous verrez pourquoi après, c'est pour fermer
fichier = fichier.read
fichier.gsub!(" ", "")
fichier.gsub!("_", " ")
fichier = fichier.split(";")
police = fichier[0]
taille = fichier[1]
police = police.split("=")
@police = police[1] #Pour qu'il soit reconnu plus tard
taille = taille.split("=")
@taille = taille[1].to_i #Pour qu'il soit reconnu plus tard
file.close

Et maintenant, pour appliquer ces modifs, nous restons dans "main" et nous changeons:
$fontface = "Arial"
$fontsize = 24
en



Portion de code:






$fontface = @police
$fontsize = @taille


ETAPE 3 : Gestion des erreurs
Alors, maintenant, imaginez un instant que le fichier soit supprimé, ou qu'il y ait une erreur à l'intérieur ! Hurle
Catastrophe, le joueur est dans la mouise.
Donc, on va appliquer une gestion de l'erreur grâce à la technique
begin... rescue... end
A quoi ça sert?
Et bien, celà, si il y a une erreur, au lieu de vous afficher un message d'erreur et de fermer, fait que vous pouvez passer à la commande dans rescue pour rétablir la situation.
Nous allons donc foutre un begin en haut de notre code et à la fin un rescue (avant le begin de main).
A la suite du rescue, nous allons informer le joueur que le fichier "Params.txt" n'existe pas où est corrompu, avec un:



Portion de code:





print "Le fichier 'Params.txt' n'existe pas ou est corrompu.

Appuyez sur entrée pour créer le fichier"

Puis, on va créer le fichier en question, et écrire dedans, ou, s'il est erroné le remplacer par un nouveau.
Pour cela, nous allons faire:



Portion de code:





fichier = File.open("Params.txt", "w+")

Mais qu'est-ce que c'est que ce "w+"?
Ca veut dire qu'on l'ouvre en lecture/écriture, et qu'on écrase toutes les données à l'intérieur, et que s'il n'existe pas, on le crée.
Puis, on va écrire nos données par défaut dedans :



Portion de code:





fichier.write("Police=Arial;

Taille=24)

Et on referme le fichier pour enregistrer les modifications...



Portion de code:





file.close

Note: dans l'éditeur de script de XP, la deuxième ligne ne va pas apparaître violette comme si elle était entre guillemets, cependant, elle l'est en réalité. Dans l'éditeur de VX, ce bug a été corrigé

Maintenant, on va informer le joueur que le fichier a été créé :



Portion de code:





print "Le fichier 'Params.txt' a été créé avec succès!"

puis, fini le rescue, on met la touche finale!! :



Portion de code:





end

Donc, dans le rescue on a:



Portion de code:






rescue
print "Le fichier 'Params.txt' n'existe pas ou est corrompu.
Appuyez sur entrée pour créer le fichier"
fichier = File.open("Params.txt", "w+")
fichier.write("Police=Arial;
Taille=24)
file.close
print "Le fichier 'Params.txt' a été créé avec succès!"
@taille = 24
@police = "Arial" #Parce qu'il ne relit pas le fichier après
end

Et voilà, c'est fin prêt!!

ANNEXES
Voici un petit quelque chose que j'ai sortit de je sais pas où qui donne les "flags" et leur fonction:

Citation:

'r' Ouvre en lecture seule, et place le pointeur de fichier au début du fichier.
'r+' Ouvre en lecture et écriture, et place le pointeur de fichier au début du fichier.
'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
'w+' Ouvre en lecture et écriture ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
'a' Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.
'a+' Ouvre en lecture et écriture ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.
'x' Créé et ouvre le fichier en lecture seule ; place le pointeur de fichier au début du fichier. Si le fichier existe déjà, fopen() va échouer, en retournant FALSE et en générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen() tente de le créer. Ce mode est l'équivalent des options O_EXCL|O_CREAT pour l'appel système open(2) sous-jacent. Cette option est supportée à partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.
'x+' Créé et ouvre le fichier en lecture et écriture ; place le pointeur de fichier au début du fichier. Si le fichier existe déjà, fopen() va échouer, en retournant FALSE et en générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen() tente de le créer. Ce mode est l'équivalent des options O_EXCL|O_CREAT pour l'appel système open(2) sous-jacent. Cette option est supportée à partir de PHP 4.3.2, et fonctionne uniquement avec des fichiers locaux.



Voilà, c'est tout, si vous avez des questions à poser... Rire grinçant

Tutoriel rédigé par RPG-Man. Clin d'oeil


Toy master - posté le 17/02/2009 à 20:18:47 (2553 messages postés)

❤ 0

Programmeur confirmé et à la retraite !

Cool ! :)

--Citation : L'homme n'est pas fait pour travailler, la preuve c'est que ça le fatigue !--Un petit rpg totalement debile !--Ma galerie !--Un petit rpg totalement débile 2 !


BotoX - posté le 17/02/2009 à 21:08:57 (237 messages postés)

❤ 0

Member 6120 !

Merci pour ce très bon tuto RPG-Man. facile à comprendre et utile dans l'ensemble, bien joué !


Tricky - posté le 17/02/2009 à 21:59:39 (205 messages postés)

❤ 0

Extrêmement bien expliqué et très intéressant. Super bon coup sur celui-là! :elusun


RPG-Man - posté le 18/02/2009 à 09:16:03 (0 messages postés)

❤ 0

J'aime mapper mais je sais pas mapper ...

Huhu, merci à tous! :)
C'est mon premier tuto, donc, j'ai abordé ça avec un peu d'apréhension étant donné que je traitais une chose assez complexe, et qu'il fallait beaucoup expliquer...
J'espère que ça pourra vous servir ^^


kilam1110 - posté le 18/02/2009 à 10:22:40 (9159 messages postés)

❤ 0

super tuto je pigeais quasi rien au ruby avant :)

New RPG Maker - Forum traitant du logiciel RPG Maker tout en français ! | SURVIVE V2.5 - Dégommez du zombie !


RPG-Man - posté le 18/02/2009 à 10:35:03 (0 messages postés)

❤ 0

J'aime mapper mais je sais pas mapper ...

Merci!
Mais ne te détrompe pas, ça ne se résume pas à ça le Ruby ;)
Il y a plein d'autres choses à savoir!


Grade - posté le 18/02/2009 à 18:43:12 (904 messages postés)

❤ 0

Le ruby est un langage orienté objet ?
Je savais pas :P.
Mais sinon c'est vrai que l'ouverture du fichier ressemble beaucoup au C++.

Par contre on met pas de point-virgule à chaque ligne ?
Quelle horreur :S.

MMORPG 2D Amateur | https://www.shinsekaionline.com


berka - posté le 18/02/2009 à 21:55:25 (493 messages postés)

❤ 0

planchant sur un script

tu peux en mettre si tu vraiment tu y tiens, mais ruby ne se formalise pas pour ses contraintes d'instructions, du moins dans l'interpreteur, car les ';' sont indispensables dans le fichier

RPG_MAN

joli tuto !

tu peux meme mettre la fermeture du fichier dans un ensure, pour le fermer proprement et eviter les doubles manipulations:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
begin #bloc prioritaire
    ouverture
    traitement
rescue #erreur
    gestion d'erreur
ensure #exécution forcée
    fermeture 
end



et puis pourquoi avoir instancié une deuxieme fois l'objet file ?

berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques


RPG-Man - posté le 19/02/2009 à 12:12:20 (0 messages postés)

❤ 0

J'aime mapper mais je sais pas mapper ...

Citation:

et puis pourquoi avoir instancié une deuxieme fois l'objet file ?


Tu parles d'ici? :

Citation:

Et on referme le fichier pour enregistrer les modifications...
Portion de code:
file.close


Je me suis trompé c'est fichier.close, mais on peut rajouter file.close pour fermer "file" quand il y a eu l'erreur, parce qu'il n'est pas fermé. On peut faire ça au lieu de mettre un ensure aussi...

Citation:

tu peux meme mettre la fermeture du fichier dans un ensure, pour le fermer proprement et eviter les doubles manipulations:


Mmm... tu veux dire si il n'est pas fermé dans la première partie.... ce n'est pas très gênant... surtout si on rajoute le file.close en plus du fichier.close dans le bloc rescue ça ferme les 2... (d'ailleurs, je sais pas pourquoi j'ai mit un coup file un coup fichier, sur mon code à moi, j'ai mit deux fois le même...)

Citation:

Le ruby est un langage orienté objet ?
Je savais pas :P.


Ouaip! ENTIEREMENT orienté objet! Même les opérateurs sont objets!
Par exemple écrire 2+3 revient à écrire 2.+(3)
Tout, tout, tout, tout est objet!

Citation:

Par contre on met pas de point-virgule à chaque ligne ?


En Ruby? Non (ou peut être que si mais que c'est optionnel, mais j'en mets jamais, dites le moi si ça existe).
Mais en C++ si j'ai bonne mémoire, les points virgules séparent les instructions.

Avec tout ça, une petite correction :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
begin
fichier = File.open("Params.txt", "r")
fichier = fichier.read
fichier.gsub!(" ", "")
fichier.gsub!("_", " ")
fichier = fichier.split(";")
police = fichier[0]
taille = fichier[1]
police = police.split("=")
@police = police[1]              #Pour qu'il soit reconnu plus tard
taille = taille.split("=")
@taille = taille[1].to_i         #Pour qu'il soit reconnu plus tard
fichier.close
rescue
print "Le fichier 'Params.txt' n'existe pas ou est corrompu.
Appuyez sur entrée pour créer le fichier"
fichier = File.open("Params.txt", "w+") # Donc, là, on réinstancie fichier, le même.
fichier.write("Police=Arial;
Taille=24)
fichier.close
print "Le fichier 'Params.txt' a été créé avec succès!"
@taille = 24
@police = "Arial"  #Parce qu'il ne relit pas le fichier après
ensure
fichier.close
end


Merci de m'avoir signalé les erreurs.


berka - posté le 19/02/2009 à 18:42:13 (493 messages postés)

❤ 0

planchant sur un script

je voulais dire
pourquoi avoir fait ca:

Portion de code : Tout sélectionner

1
fichier = file


ca ne sert a rien, sinon a provoquer des bugs !

et pour le ensure, c'est simple:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
begin
    @fich=File.open(...)
    @fich.eachlines{...} #zut une erreur !
rescue 
    p 'une erreur est arrivée !'
    #le fichier n'est pas fermé 
ensure 
    @fich.close # quoi qu'il arrive on ferme le fichier proprement !
end



berka

Twitter: Pensées politiques et juridiques. Réflexions informatiques


RPG-Man - posté le 19/02/2009 à 21:13:02 (0 messages postés)

❤ 0

J'aime mapper mais je sais pas mapper ...

Tu as pas vu que j'ai fait tout ça dans ma correction?
Regarde le message d'au dessus, j'ai corrigé ces 2 erreurs ;)
Sauf que y'a pas de tabulation, et le ensure ne se voit pas tout de suite ^^


berka - posté le 19/02/2009 à 23:23:27 (493 messages postés)

❤ 0

planchant sur un script

:oO désolé, j'avais pas vu...

Twitter: Pensées politiques et juridiques. Réflexions informatiques


Grade - posté le 20/02/2009 à 18:31:57 (904 messages postés)

❤ 0

Citation:

Ouaip! ENTIEREMENT orienté objet! Même les opérateurs sont objets!


Ah ouais quand même :p.

Citation:

Mais en C++ si j'ai bonne mémoire, les points virgules séparent les instructions.


Exact !

En ruby je suppose que ce qui sépare les instructions sont les \n (je sais pas si ce caractère n'existe qu'en C/C++).

Sinon c'est vraiment super de vouloir orienter les makers vers la programmation, reste plus qu'à ésperer qu'il vont le faire...

MMORPG 2D Amateur | https://www.shinsekaionline.com


RPG-Man - posté le 21/02/2009 à 17:39:53 (0 messages postés)

❤ 0

J'aime mapper mais je sais pas mapper ...

Citation:

En ruby je suppose que ce qui sépare les instructions sont les \n (je sais pas si ce caractère n'existe qu'en C/C++).


Non, rien de spécial ne sépare les instructions... regarde sur RMXP la structure des scripts, et tu verras...;)

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Articles perso | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Jeux complets | Tous les jeux | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers