[Résolu]Chargement d'un fichier .map

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

[Résolu]Chargement d'un fichier .map

Message par Geo Trouvpatou »

Salut à tous.

Bon, j'ai créé un petit éditeur de niveau pour le ladyBug. C'était surtout pour avoir des textures sous la patte ;)
Je l'ai fait partir de ce petit tuto qui aurait bien sa place dans la rubrique Tuto de ce forum (Au passage j'ai convertis les codes de comtois pour la 4.30, bon y'a pas grand chose à modifier.)

Voici le code (Le code de la sauvegarde est fonctionnel) :

Code : Tout sélectionner

Global Dim TableauMap(12, 12)

Procedure Sauver()
    ; Sauvegarde de la Map sous ce format :
    ; 1111111111111
    ; 1444244444441
    ; 1424242222241
    ; 1424242444241
    ; 1424444424441
    ; 1422242224241
    ; 1444444444241
    ; 1424224244241
    ; 1424444444241
    ; 1422224222241
    ; 1444444444441
    ; 1111111111111   
    
    Protected ligne.i, colonne.i
    
    If CreateFile(0, "niveau1bis.map")
        
        ; Fonctionnel
        For ligne = 0 To 12
            For colonne = 0 To 12
                TableauMap(colonne, ligne) = Random(4) ; Pour simuler des id de texture.
                
                If colonne <> 12
                    WriteString(0, Str(TableauMap(colonne, ligne))) 
                Else
                    WriteStringN(0, Str(TableauMap(colonne, ligne))) 
                EndIf
                
                
            Next colonne
        Next ligne
        
        ; Solution 2 opérationnelle.
        ; For ligne = 0 To Map\TailleY - 1
        ; For colonne = 0 To Map\TailleX - 1
        ; 
        ; WriteStringN(0, Str(TableauMap(colonne, ligne))) 
        ; 
        ; Next colonne
        ; Next ligne
        
        CloseFile(0) ; ferme le fichier précédemment ouvert et enregistre les données
    Else
        MessageRequester("Information","Impossible de créer le fichier!")
    EndIf
    
EndProcedure 

; Génère le fichier Map.
Sauver()


Procedure Charger()
    Protected ligne.i, colonne.i
    Protected a$
    Protected Resultat.i
    
    If OpenFile(0, "niveau1bis.map")
        
        For ligne = 0 To 12
            For colonne = 0 To 12
                
                ;??????????????????????????????????????????????????
                
            Next colonne
        Next ligne
        
        ;; Solution 2 opérationnelle.
        ; For ligne = 0 To Map\TailleY - 1
            ; For colonne = 0 To Map\TailleX - 1
                ; 
                ; a$ = ReadString(0)
                ; Resultat = Val(a$)
                ; ;Debug Resultat 
                ; 
                ; TableauMap(colonne, ligne) = Resultat    
                ; 
            ; Next colonne
        ; Next ligne
        
        CloseFile(0)
    EndIf 
    
EndProcedure
Mon problème, c'est que depuis hier je me prend la tête pour lire ce fichier .map et je n'y arrive pas.

Ce que je voulais surtout, c'est que les données soient écrites en clair, pas charabia de binaire.

Dans mes 2 procédures il y a une autre solution que j'ai utilisé et qui fonctionne en enregistrant chaque donnée sur une ligne (1 donnée = 1 ligne).

Mais je préfèrerais l'autre solution plus compacte et mieux visuellement.

Au début je m'étais dit, les doigts dans le nez, ça va être fastoche à faire, et ben hélas non :(

Si une âme charitable passait par-là.

Bye.
Dernière modification par Geo Trouvpatou le mar. 09/juin/2009 15:10, modifié 1 fois.
Anonyme

Message par Anonyme »

Bonsoir , pourquoi vouloir te prendre la tete en pensant que les string c'est plus simple :D ! c'est faux , écrire octet par octet est plus simple ! :)

voila le code corrigé :

Code : Tout sélectionner

Global Dim TableauMap.c(12, 12)

Procedure Sauver()
    ; Sauvegarde de la Map sous ce format :
    ; 1111111111111
    ; 1444244444441
    ; 1424242222241
    ; 1424242444241
    ; 1424444424441
    ; 1422242224241
    ; 1444444444241
    ; 1424224244241
    ; 1424444444241
    ; 1422224222241
    ; 1444444444441
    ; 1111111111111   
   
    Protected ligne.i, colonne.i
   
    If OpenFile(0, "niveau1bis.map")
       
        ; Fonctionnel
        For ligne = 0 To 12
            For colonne = 0 To 12
               WriteCharacter(0,TableauMap(colonne, ligne))
            Next colonne
        Next ligne

       
        CloseFile(0) ; ferme le fichier précédemment ouvert et enregistre les données
    Else
        MessageRequester("Information","Impossible de créer le fichier!")
    EndIf
   
EndProcedure


Procedure Charger()
    Protected ligne.i, colonne.i
    Protected a$
    Protected Resultat.i
   
    If ReadFile(0, "niveau1bis.map")
       
        For ligne = 0 To 12
            For colonne = 0 To 12
               
               TableauMap(colonne, ligne) = ReadCharacter(0)
               debuger$ + Str(TableauMap(colonne, ligne))
               
            Next colonne
            Debug debuger$:debuger$=""
        Next ligne
       
       
        CloseFile(0)
    EndIf
   
EndProcedure



; Sauvegarde
; Restore level
; 
; 
;         For ligne = 0 To 12
;             For colonne = 0 To 12
;                 Read.c TableauMap(colonne, ligne)
;             Next colonne
;         Next ligne
; 
; Sauver()
; End 



; Lecture
Charger()








DataSection
level:
Data.c 1,1,1,1,1,1,1,1,1,1,1,1,1
Data.c 1,4,4,4,2,4,4,4,4,4,4,4,1
Data.c 1,4,2,4,2,4,2,2,2,2,2,4,1
Data.c 1,4,2,4,2,4,2,4,4,4,2,4,1
Data.c 1,4,2,4,4,4,4,4,2,4,4,4,1
Data.c 1,4,2,2,2,4,2,2,2,4,2,4,1
Data.c 1,4,4,4,4,4,4,4,4,4,2,4,1
Data.c 1,4,2,4,2,2,4,2,4,4,2,4,1
Data.c 1,4,2,4,4,4,4,4,4,4,2,4,1
Data.c 1,4,2,2,2,2,4,2,2,2,2,4,1
Data.c 1,4,2,2,2,2,4,2,2,2,2,4,1
Data.c 1,4,4,4,4,4,4,4,4,4,4,4,1
Data.c 1,1,1,1,1,1,1,1,1,1,1,1,1   
EndDataSection       




j'ai relevé aussi quelques incohérence dans le code :

Code : Tout sélectionner

If colonne <> 12
                    WriteString(0, Str(TableauMap(colonne, ligne)))
                Else
                    WriteStringN(0, Str(TableauMap(colonne, ligne)))
                EndIf 
peut importe le resultat , le string sera toujours écrit

Code : Tout sélectionner

OpenFile
Utilise ReadFile pour la lecture , Openfile créer le fichier si il n'existe pas.



les octets (byte ou char suivant la donnée a stocker) est plus simple à gerer :

exemple d'un header "maison"
1 byte : 77
2 byte : 65
3 byte : 80

les 3° premiers byte sont les code ascii du mot "MAP" , ca peut servir a vérifier la validité du fichier par exemple...

le 4° byte , peut servir a définir la taille de la map en X
le 5° en Y
les données peuvent commencer au 6° byte


voila voila...


@++

:wink:
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Merci pour ton code, je zieute ça, j'essaie de comprendre et je te réponds.
Parce que là, je bug déjà sur :

Code : Tout sélectionner

For ligne = 0 To 12
            For colonne = 0 To 12
               
               TableauMap(colonne, ligne) = ReadCharacter(0)
               debuger$ + Str(TableauMap(colonne, ligne))
               
            Next colonne
            Debug debuger$:debuger$=""
        Next ligne 
Même si apparement, je viens juste de comprendre en faisant mon copier-coller que : debuger$ + Str(TableauMap(colonne, ligne)) et Debug debuger$:debuger$="" ne servent qu'à avoir un visuel de la map dans le débogueur.

Mais sinon est-il possible de lire les valeurs de "niveau1bis.map" en clair, c'est à dire voir 1, 2, 3 ou 4 directement.
Parce que dans notepad++ je ne vois que des "nul".

Bon puisque j'y suis je réponds à tes questions :wink:.
peut importe le resultat , le string sera toujours écrit
Ce qui se passe c'est qu'il enregistre toutes les données de la 1ère ligne de la map et arrivé au bout (13ème case) il passe à la ligne.
Tu n'as peut-être pas vu le WriteString et WriteStringN
J'aurai peut-être dû mettre

Code : Tout sélectionner

If colonne <= 12
          WriteString(0, Str(TableauMap(colonne, ligne))) 
      Else
          WriteStringN(0, Str(TableauMap(colonne, ligne))) 
      EndIf
Utilise ReadFile pour la lecture , Openfile créer le fichier si il n'existe pas.
Effectivement, si on ne doit pas écrire dedans mieux vaut utiliser un ReadFile.


Et pour ton chinois que tu m'as écrit ensuite, si je comprends bien dans le fichier "niveau1bis.map" au lieu de m'écrire des 1, 2, 3 ou 4 qui correspond au numéro de mes textures, il m'écrit des bytes : 49 à 52

Bon, maintenant il est un peu tard, mais demain, je teste dans le vrai code ta solution et je te dirais ce qu'il en est.

A plus.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Geo Trouvpatou a écrit :je bug déjà sur : debuger$ + Str(TableauMap(colonne, ligne)) et Debug debuger$:debuger$=""
Bon ben le bug est résolu.
J'ai remplacé : Debug debuger$:debuger$="" par Debug debuger$ parce que c'est surtout cette ligne que je ne comprenais pas et cela m'a fait un joli petit escalier, donc j'en ai déduis qu'à chaque tour de boucle cela me recopiait l'ancienne ligne plus la nouvelle et donc qu'en mettant debuger$="" cela permettait de vider la variable et au prochain tour de boucle de ne copier que la dernière ligne.

Sinon tout fonctionne à merveille dans mon vrai code, j'en ai profité pour remplacer mon OpenFile par ReadFile dans la procédure Charger()

Concernant ton explication concernant le header perso, j'imagine qu'en mettant par exemple les dimensions de la map dans le fichier lui-même, cela éviterait d'avoir à mettre les constantes en dur dans le code.
Enfin cela à surtout de l'intérêt si les maps sont de dimensions différentes.
L'idée est intéressante et peut servir pour d'autres choses qu'un jeu.

Merci à toi Cpl.Bator.
allasktulu
Messages : 34
Inscription : sam. 29/nov./2008 22:42

Message par allasktulu »

Debug debuger$:debuger$="" est la même chose que :

Code : Tout sélectionner

Debug debuger$
debuger$="" 
...
Les : ces juste pour mettre le code "plus petit"
Donc, il Debug les info et les efface pour plus tard. :)
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut allasktulu.

Oui je sais.
Ce que je n'avais pas compris, c'était l'intérêt de cette variable debuger$ égale à rien.
C'est pour ça que je l'ai supprimée pour voir ce qu'il se passait sans elle.
Répondre