Les Datas Comment ça marche ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Les Datas Comment ça marche ?

Message par comtois »

Déjà il faut lire la doc ,et si un point n'est pas clair dans la doc , il faut en parler ici , je pense que ça peut intéresser Fred de savoir sur quoi bute un débutant pour compléter l'aide au mieux .

Je te fais un petit exemple , si ce n'est toujours pas clair , comme d'habitude ,tu n'hésites pas à demander . Un autre essaiera de te l'expliquer autrement :)

Code : Tout sélectionner

;Les datas te permettent de stocker des données dans le programme 
;tu peux remplacer tes datas par un fichier , c'est juste une autre façon d'accéder à des données.

For a = 1 To 4
   Read Texte$
   Debug Texte$
Next

For a = 1 To 4
   Read Nombre
   Debug Nombre
Next
;Maintenant si je veux lire à nouveau les données Fruits ,
;j'ai besoin de me replacer en début de zone avec la commande Restore
;Tu peux essayer de la supprimer ,tu verras ce que ça fait 

Restore Fruits
For a = 1 To 4
   Read Texte$
   Debug Texte$
Next

DataSection
Fruits:
Data.s "Banane","Ananas","Pomme","Poire"
Valeurs:
Data.l 34,56,78,98
EndDataSection
CORBASE
Messages : 96
Inscription : mar. 24/févr./2004 14:06

Message par CORBASE »

Explications niquel !

J'avez pas vu les datas comme sa !

thx
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Pour moi c'est clair, mais uniquement dans le domaine du théorique.
Je voudrais si tu le veux bien dériver un petit peu et que tu m'expliques comment avec des datas je peux faire des maps pour un jeu.

Je prends l'exemple classique d'un casse brique.
Je sais qu'on peut créer des niveaux en glissant pour chacun en fin de code des sections datas.
Les chiffres utilisés (ou lettres ?) renvoient à un sprite correspondant qui sera affiché dans une disposition similaire à celle de son emplacement dans le bloc data.

C'est bien gentil mais comment ça marche ?
On appele ça des tiles c'est ça ?
Tu peux me glisser un petit tuto ici ?

Et comment utiliser le meme principe dans un fichier texte d'un sous répertoire "level" par exemple. ca permettrait de faire un jeu "skinnable" si l'utilisateur édite ces fameux fichiers texte, non ? Ou d'ajouter des niveaux sans recourir à la recompilation du source mais en créant de nouveaux fichiers.
Est-ce que j'ai bien saisi le système ?
SI oui je voudrais vraiment comprendre pour le mettre en oeuvre !

Merci de voir ce que tu peux faire si c'est pas trop long. :D
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ben c'est étonnant , tu décris à la perfection le fonctionnement ,tu as parfaitement compris le principe .

un exemple

Code : Tout sélectionner

OpenConsole()
For ligne = 1 To 3
   For colonne = 1 To 4
      Read Sprite
      If Sprite
         ConsoleLocate(colonne * 5, ligne * 5)
         Print(Str(Sprite))
      EndIf   
   Next colonne
Next ligne
Input()
DataSection
; les chiffres correspondent à tes tiles
Data.l 1,1,1,1
Data.l 1,0,0,3
Data.l 1,1,1,2
EndDataSection
Invité

Message par Invité »

Code : Tout sélectionner

OpenConsole() 
fichier$ = "Toto.dat"
If OpenFile(0,fichier$)
   For ligne = 1 To 3 
      For colonne = 1 To 4 
         Read Sprite 
         ;Enregistre le fichier ( c'est juste pour créer un fichier pour la suite)   
         WriteString(Str(Sprite)) ; WriteString > c'est pour que tu puisses relire le fichier avec un éditeur de texte
         If Sprite 
            ConsoleLocate(colonne * 5, ligne * 5) 
            ;tu peux remplacer print par Displaysprite ou DrawImage ( avec startdrawing() )...
            Print(Str(Sprite)) 
         EndIf    
      Next colonne 
      WriteStringN("")
   Next ligne 
   CloseFile(0)  
   PrintN("")
   PrintN("")
   Print("Presse la touche [Entree] ")
EndIf
Input() 
ClearConsole()

; Et ici , autre exemple qui utilise uniquement le fichier 
fichier$ = "Toto.dat"
If OpenFile(0,fichier$)
   PrintN("Deuxieme exemple avec un fichier")
   For ligne = 1 To 3 
      Ligne$ = ReadString()
      For colonne = 1 To 4 
         Sprite = Val(Mid(Ligne$,colonne,1))
         If Sprite 
            ConsoleLocate(colonne * 5, ligne * 5) 
            ;tu peux remplacer print par Displaysprite ou DrawImage ( avec startdrawing() )...
            Print(Str(Sprite)) 
         EndIf    
      Next colonne 
   Next ligne 
   CloseFile(0)  
EndIf 
Input()

DataSection 
; les chiffres correspondent à tes tiles 
Data.l 1,1,1,1 
Data.l 1,0,0,3 
Data.l 1,1,1,2 
EndDataSection
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

merci pour ta réponse rapide !!!
Tu sais entre la compréhension et la mise en pratique il y a parfois un pas mais je me penche sur ça sans faute demain (boulot--> crevé là).
J'abuserai en te faisant part de mes commentaires et/ou interrogations s'il y a encore des zones d'ombre.

Ce qui serait bien pour le forum c'est peut-être d'épingler ce post dans la rubrique jeu, paske l'édition de maps ç'est incontournable la plupart du temps.

Te remercie encore !
@+
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Bon voilà, j'ai testé ton bout de code et le resultat obtenu est tout à fait celui que je recherchais.
Cependant je dois être un peut bête mais y'a deux trucs que je necomprends pas.

1/ pourquoi str(sprite) quand sprite vaut 0 n'a pas pour résultat d'afficher le caractère "0" mais au lieu de ça n'affiche rien.

2/comment le compilateur arrive à s'y retrouver avec les variables "sprite", "ligne" et "colonne" alors qu'aucune n'a été déclarée.
Je veux dire, comment il sait que "read sprite" renvoie à la datasection d'en bas ? Parce qu'il n'y en a qu'une ?
Et quelle différence fait il entre "ligne" et "colonne" ?
Quand on lui demande de lire une data section, il la lit de gauche à droite ou de bas en haut ?

Bref ça marche, mais comme la vache qui rit... on ne sait toujours pas pourquoi...

Excuse mon esprit lent encore une fois.

Une dernière chose, voir si j'ai bien compris. Dans le cas d'un programme en fullscreen, je dois remplacer "ligne*5" ou "colonne*5" par "ligne*largeur_sprite" ou "colonne*longueur_sprite, c'est bien ça ?

Quoiqu'il en soit je te remercie une nouvelle fois !
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

ok je viens de comprendre pourquoi "0" ne s'affiche pas, c'est à cause de l'expression "if sprite", sous entendu "si sprite n'est pas égal à 0 alors brave ordinnateur que tu es tu l'affiches à l'écran, sinon ben merci d'avoir joué avec nous".

ET une angoisse existentielle de moins !
Me sens déjà moins niais ! (enfin, tout est relatif...)
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

1/ pourquoi str(sprite) quand sprite vaut 0 n'a pas pour résultat d'afficher le caractère "0" mais au lieu de ça n'affiche rien.
bon , ça , tu as compris :)

2/Je veux dire, comment il sait que "read sprite" renvoie à la datasection d'en bas ? Parce qu'il n'y en a qu'une ?
Et quelle différence fait il entre "ligne" et "colonne" ?
Quand on lui demande de lire une data section, il la lit de gauche à droite ou de bas en haut ?


Et bien , il lit les premières données dispos , c'est pour ça que tu as Restore étiquette , pour te positionner dans la bonne zone si nécessaire ,sinon il lit les premières données qu'il trouve , de gauche à droite ,et de haut en bas ,comme un livre arlequin :lol:

Une dernière chose, voir si j'ai bien compris. Dans le cas d'un programme en fullscreen, je dois remplacer "ligne*5" ou "colonne*5" par "ligne*largeur_sprite" ou "colonne*longueur_sprite, c'est bien ça ?
oui presque

"ligne*Hauteur_sprite" ou "colonne*largeur_sprite
ou DisplaySprite(#Sprite,Colonne*spriteWidth(),ligne*SpriteHeight())
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Les datas , ça marche comme un ascenseur
DataSection c'est le premier étage , ou l'étage 0
Enddatasection , c'est le dernier étage

à chaque fois que tu fais un Read , tu montes d'un étage .

et quand tu fais un Restore fruits , tu rappelles l'ascenseur à l'étage fruits !
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Ok c'est parfaitement clair maintenant !

J'ai bien saisi comment fonctionne les datas et à quoi peuvent servir les labels et la commande restore.

Je vais m'empresser d'employer tout ça maintenant !

merci pour la clarté et la patience de tes explications !
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Invité

Message par Invité »

Désolé comtois, mais j'ai encore besoin de ta science !!!!

Avec tes explications J'ai réussi à disposer mes tiles à l'écran grâce aux datas mais j'anticipe un problème : :?
Peut on éditer les datasections au cours du déroulement du programme ?
je m'explique :

Je reprends mon exemple du casse brique :
Grâce aux datas elles s'affichent toutes selon mon bon vouloir. mais comment les faire disparaître individuellement lorsqu'il y a une collision avec la balle ?
Je dois aller éditer la valeur "1" de ma data section pour la remplacer par "0" ???
Si oui comment ? 8O
Si non, comment est-ce qu'on fait ? 8O

J'espère que tu pourras m'éclairer (une énième fois) !

P.S : je crois que tu as bien fait de lancer ce post pour les pauvres débuttants dont je fais partie !
merci !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

admettons que ton jeu affiche 20 tiles sur la largeur et 15 en hauteur , tu fais un tableau Map(20,15) ,

et quand tu lis tes datas , tu stockes la valeur dans le tableau

Code : Tout sélectionner

For ligne = 1 To 3 
   For colonne = 1 To 4 
      Read Sprite 
      Map(Colonne,Ligne)=Sprite  
   Next colonne 
Next ligne 
ensuite dans ton jeu , tu testes ton tableau pour placer tes tiles ,et pour supprimer un tile , tu as juste à faire Map(3,5) = 0
ça supprime le tile à la position colonne = 3 et ligne = 5

il y a d'autres solutions , tout dépend de ce que tu fais , et de l'humeur du moment :)
Répondre