Page 1 sur 2

Code en BDD [RESOLU]

Publié : sam. 01/sept./2012 4:30
par Yrahen
Bonjour a tous, enfin, bonne nuit en l'occurence, vu qu'il est 5h du mat.

Je suis Yra, et cela fait maintenant quelques temps que j'ere sur le forum dans l'ombre, lisant les sujets afin de debuter puis m'ameliorer en purebasic. Ayant des connaissances dans d'autres langages, cela ne fut pas une tache insurmontable, mais tout de meme, il me reste beaucoup de travail avant de devenir le futur admin de ce forum ( je suis ambitieux muwahahaaa )

Quoi qu'il en soit, je viens a mon tour demander de l'aide.

En effet, je souhaite realiser un rpg textuel, en console. Pourquoi la console? Je trouve que ca donne un effet retro, et je trouve que les rpg en mode texte sont beaucoup plus amusant que les nouveaux jeux style FF, qui misent tout sur le graphisme, et qui ne laissent plus aucune place a l'imagination. Après chacun son point de vue, mais personnellement je trouve qu'un bon "Livre dont vous etes le heros" est beaucoup plus sympa que toutes ces nouvelles technologies qui visent la perfection graphique.

Mais je me pose devant un certain probleme.

Je souhaite diviser le jeu en divers lieux, objets, quetes ect.. Mais voila, comment faire?

J'ai d'abord pensé a mettre une bonne centaines de fichiers differents, un pour chaque lieu/objet/monstre/quete/sort( et sans doutes tout un tas d'autres choses), j'aurais ensuite fait une armée d'include pour rajouter tout ca au code source, et une fois l'executable fait, tout aurait marché. Mais voila, j'ai pas vraiment envi de me retrouver avec 32000 fichiers differents.

J'ai ensuite pensé a stocker les codes de chacun de mes objets/lieux.. dans une bdd, ca presentait moultes avantages :

- Une seule BDD, pas 500000 fichiers
- En cas de mise a jour, la bdd etant externe au fichier, il est facile de modifier certains trucs, refaire des ajustement, il suffisait de changer ce qui me plaisait pas dans un des codes stockés pour que le jeu soit mis a jour, alors qu'avec les fichiers, il aurait fallu faire retelecharger l'exe a l'utilisateur.
- exe plus petit
- et certainement d'autres

Mais je me suis vite heurté a un mur. Bah oui, le code est en BDD, comment le faire lire par l'executable?

Après plein d'essai, je pensais qu'une methode fonctionnerait.

A chaque fois que le joueur utilisé un objet, ou combatait un monstre par exemple, j'extrayais de la BDD le code qui y etait enregistré, et je le mettais dans un fichier txt temporaire, je fesais ensuite un simple Include("temp.txt") puis deletefile("temp.txt") , et basta! Mais une fois l'executable créé, plusieurs problemes ont fait que cette methode ne marchait pas.

1.Il fois qu'a l'execution, un fichier temp.txt existe deja, car la fonction include refusait de fonctionner sinon ( Logique. )
2.Quelques soit les modifications du fichier temp.txt, le code inclu etait toujours le meme. J'imagine qu'il etait figé dans l'executable.

Bref, faut il que j'en revienne a la methode des 4242 fichiers, ou y a t'il une facon de gerer avec une base?

Merci d'avoir lu jusqu'au bout ( si vous avez lu jusqu'au bout evidement ), et merci d'avance si quelqu'un peut m'aider.

Et sur ce, bonne nuit!

Re: Code en BDD

Publié : sam. 01/sept./2012 9:41
par Mesa
Bienvenue sur le forum, ça fait toujours plaisir de voir de nouveaux adeptes.

Pour ma part, je pense que le jeu est un monde un peu à part car le jeu suit un scénario et que le scénario conditionne une partie de la programmation.

En effet, il faut prévoir les interactions entre le joueur et sa machine (clavier, souris,...) pendant le jeu.

La première chose à faire et d'écrire le scénar : Nombre de niveaux, lieux, personnages, leurs aptitudes, les armes, ...

Ici on pend du recul.
Pour l'utilisation des données, on prend la décision d'utiliser plutôt un tableau, ou une liste ou une map voire une base de données et même des pointeurs. Chacun a ses avantages et ses inconvénients (voir la doc). Les bases de données ne me paraissent pas être une bonne idée car elles sont en général assez lente et leur mise en place est délicate. Au pire, il faudrait faire des essais avec sqlLite. Un fichier XML pourrait être une bonne solution aussi.
Pour stocker les données sur disque, outre la BDD ou XML, le mieux est d'en mettre un max dans un seul fichier.
Moins on fait d'accès au disque est mieux c'est.

Le problème des jeux est, et reste, la gestion de la mémoire. Il faut se débrouiller pour avoir en mémoire (RAM) tout ce qui est utile pour le niveau de jeu en cours, afin d'assurer une fluidité suffisante. Et pour assurer cette fluidité, il faut que la boucle principale du jeu (gestion du clavier, souris, intelligence artificielle des personnages = action/réaction entre le jeu et le joueur,...) soit la plus courte possible. D'où un scénario au petits oignons...

Tu pourrais essayer de créer un fichier par niveau. Ce fichier contiendrait tout, dans des rubriques différentes, comme un fichier ini : rubrique texte, personnages, ... Chaque rubrique serait chargée en mémoire dans une map, qui elle même contiendrait des structures probablement.
Les personnages sont souvent des structures.

Je pense que ta façon de faire avec des includes aboutira à une impasse.

En résumé :
Dans une boucle principale
Chargement d'un niveau en mémoire (à partir d'1 fichier)
exécution du niveau ( création des maps, structures, IA, gestion clavier,...)
si fin du niveau alors on vide la mémoire (map, structure,...) et on charge le niveau suivant
si pas fin du jeu alors retour à la boucle principale
sinon fin

Mine de rien, un jeu même en console reste un gros travail. Il faudra compter plusieurs mois ou années...

Voilà, j'espère avoir aidé un peu.

Mesa.

Re: Code en BDD

Publié : sam. 01/sept./2012 11:09
par Yrahen
Merci pour cette reponse.

Pour avoir gouté a la prog il y a de ca une dizaine d'années, je connais les contraintes de la creation d'un jeu. Je connais deja le background, le monde est bien clair dans ma tete, chaque monstre/objet/sort est bien defini.

Pour ce qui est de la ram, je ne me fais pas vraiment de soucis, si les ordinateurs peuvent faire tourner les jeux actuels ( ou meme les ordinateurs anciens qui peuvent gerer certains programmes ), je pense qu'un simple rpg textuel ne devrait pas poser de soucis.

Je ne comprend pas vraiment ton decoupage par niveau. Mais c'est de ma faute, j'ai mal presenté mon projet ( deja bien entammé ).

Le RPG textuel serait plus dans le style d'un livre comme vous etes le heros :

Chaque lieu/objet/mob contiendrait, dans leur fichier, du code purebasic, dans ce style la :

Code : Tout sélectionner

Printn("Vous voyez une vieille dame.")
Printn("1.L'aider a traverser la route")
Printn("2.Lui mettre un coup de pied")
choix=GetChoix()

If choix=1
  Printn("Vous etes gentil.")
  AjouterOr(10)
elseif choix=2
  Printn("Oh, vous etes mechant! Un garde arrive pour vous casser la gue**e")
  SetMechancete(1)
  DemarrerCombat(Garde de la ville)
Endif
Du coup, je ne pense pas utiliser quelque chose d'exterieur a l'executable, tout simplement parce que le joueur pourrait modifier le code. Et je ne vois pas comment inclure ce genre de code dans un fichier .ini.

L'avantage d'utiliser du code comme ca, c'est que chaque objet du jeu sera entierement modelable comme je le souhaite, dans la limite de purebasic.

Vois tu ce que je veux dire?

Re: Code en BDD

Publié : sam. 01/sept./2012 11:17
par Ar-S
Un fichier pref non ?

Code : Tout sélectionner

If CreatePreferences("c:\Preferences.prefs")
  PreferenceGroup("Heroe")
  WritePreferenceString("NOM", "NomParDefaut")
  WritePreferenceString("SEXE", "M")
  
  PreferenceComment(" Info heroe")
  PreferenceComment("")
  
  PreferenceGroup("Alignement")
  WritePreferenceLong ("Gentil", 5)
  WritePreferenceLong ("Mechant", 5)
  WritePreferenceLong("Ruse", 2)
  
  PreferenceGroup("Argent")
  WritePreferenceLong ("Or", 5)
  WritePreferenceLong ("Argent", 20)
  WritePreferenceLong("Cuiver", 12)
  
  ClosePreferences()
EndIf


OpenPreferences("Preferences.prefs")

PreferenceGroup("Alignement")
Debug ReadPreferenceLong ("Gentil", 0)
Debug ReadPreferenceLong ("Ruse", 0)
Debug ReadPreferenceLong("Mechant", 0)
    
    
ClosePreferences()


Re: Code en BDD

Publié : sam. 01/sept./2012 11:27
par Yrahen
Effectivement, pour stocker les informations concernant le joueur, c'est une très bonne alternative a la BDD, merci :)
( existe t'il une solution pour que ce fichier soit ouvrable en lecture seule, ou caché? ( Ou alors je le met dans un sous dossier de C:/, comme ca l'utilisateur ne pourrait pas le trouver facilement ) )

Cependant, pour stocker chacun de mes lieux, je ne vois pas comment faire avec les prefs.

Imaginez ca :

Code : Tout sélectionner

Printn("Bienvenue a l'auberge.")
Printn("1.Aller dans le salon")
Printn("2.sortir")
Printn("3.Frapper un poivrau")

choix=GetChoix()

if choix=1
  DeplacerJoueur(Lieu18) ; Le lieu n°18 correspond au salon de l'auberge
if choix=2
  DeplacerJoueur(Lieu4) ; Le lieu n°4 correspond a la place du marché
  Printn("Le grand air vous revigore!")
  SetVie(50)
if choix=3
  ; on s'en fou
endif
Je veux en fait, pouvoir programmer a ma guise, chaque lieu.

Re: Code en BDD

Publié : sam. 01/sept./2012 11:35
par Ar-S
Le tout est de bien penser tes "groupes"
C'est là même chose en créant un groupe pour les lieux et des (sous) groupes pour les choix dans chaque lieu

Code : Tout sélectionner


PreferenceGroup("Lieux")

WritePreferenceString("Lieu1", "Auberge")
WritePreferenceString("Lieu2", "Lupanar")
WritePreferenceString("Lieu3", "Grotte")

PreferenceGroup("Auberge")
WritePreferenceString("Choix1", "Salon")
WritePreferenceString("Choix2", "Poivreau")
WritePreferenceString("choix3", "Sortir")

PreferenceGroup("Lupanar")
WritePreferenceString("Choix1", "Femme")
WritePreferenceString("Choix2", "Homme")
WritePreferenceString("choix3", "LesDeux") ; ^^


Re: Code en BDD

Publié : sam. 01/sept./2012 17:44
par G-Rom
Bonjour et bienvenu, tu devrais te créer un "éditeur de niveau" pour te facilité la tâche.
ton jeu à une structure d'arbre, c'est facile à réalisé.
Question
..../\
.../..\
.R1..R2
tu pourrais enregistré des questions / actions dans un fichier .lvl
dans lequel tu écrits par exemple les questions sous cette forme :
question[string] | nbr reponse [byte] | < reponse [string] | action [byte] | jumpToQuestion [integer] >
le fichier sera donc inexploitable par un néophyte car il ne peut connaitre le format employé. La question possède deux ou trois voir plus de choix , selon ces choix ( les réponses ) , cela active des actions sous forme de byte, par exemple :

Code : Tout sélectionner

#ADD_OR = $FF
if Action = #ADD_OR
 OR + 10
endif 

Re: Code en BDD

Publié : sam. 01/sept./2012 20:06
par Yrahen
Merci a vous deux.

J'en déduit par vos reponses qu'il est impossible de stocker du code purebasic en dehors de l'executable, je m'en passerais donc.

La solution de Ar-S semble beaucoup plus simple a mettre en place, cependant la facon de faire de G-Rom offre je pense plus de possibilités.
Je vais essayer les deux de toute facon. ( Au pire j'ai le temps, les serveurs GW2 doivent encore etre HS.. )

En tout cas, merci!

Re: Code en BDD

Publié : sam. 01/sept./2012 20:37
par G-Rom
Yrahen a écrit :Merci a vous deux.

J'en déduit par vos reponses qu'il est impossible de stocker du code purebasic en dehors de l'executable, je m'en passerais donc.

La solution de Ar-S semble beaucoup plus simple a mettre en place, cependant la facon de faire de G-Rom offre je pense plus de possibilités.
Je vais essayer les deux de toute facon. ( Au pire j'ai le temps, les serveurs GW2 doivent encore etre HS.. )

En tout cas, merci!
Le code purebasic est compilé , c'est à dire qu'il est transformé en code asm puis en fichier executable, donc , ton code d'origine n'a plus rien à voir avec ton executable, ton executable ne contient que du code machine , les noms de variables & co n'existe pas dans ce contexte , elles n'ont plus aucun sens.
tu peu à la rigueur executé des scripts ( lua ) , mais je ne connais pas de bindings ( liaison entre une bibliothèque d'un langage X vers un programme d'un langage Y ).
si tu sèches sur la conception , n'hésites pas à poser les bonnes question sur le forum.

Re: Code en BDD

Publié : sam. 01/sept./2012 21:21
par G-Rom
voici un exemple de ce que tu peu faire :

Code : Tout sélectionner

Structure s_Reponse
  reponse.s
  jumpToQuestion.i
EndStructure

Structure s_Question
  question.s
  nbrReponse.i
  Array reponse.s_Reponse(10)
EndStructure

Structure s_Level
  levelName.s
  Array question.s_Question(10)
EndStructure



niveau.s_Level


niveau\levelName = "Préambule..."


; QUESTION 0
niveau\question(0)\question   = "Salut, tu arrives près d'une personne agée , que fait tu ?"
niveau\question(0)\nbrReponse = 3

niveau\question(0)\reponse(0)\reponse = "Tu l'agresses et lui vole son porte monaie"
niveau\question(0)\reponse(0)\jumpToQuestion = 1

niveau\question(0)\reponse(1)\reponse = "Tu lui dit que les vieux on devrais les piquer à la naissance"
niveau\question(0)\reponse(1)\jumpToQuestion = 2

niveau\question(0)\reponse(2)\reponse = "Tu passes ton chemin"
niveau\question(0)\reponse(2)\jumpToQuestion = 3

; QUESTION 1
niveau\question(1)\question   = "Le vieux se défend , il sort un magnum 357 et le pointe vers toi , que fait tu ?"
niveau\question(1)\nbrReponse = 2

niveau\question(1)\reponse(0)\reponse = "Tu chies dans ton froc , et tu t'évanouis dans ta propre pisse."
niveau\question(1)\reponse(0)\jumpToQuestion = 4

niveau\question(1)\reponse(1)\reponse = "Tu l'insultes de tout les noms"
niveau\question(1)\reponse(1)\jumpToQuestion = 4


; QUESTION 2
niveau\question(2)\question   = "Il te crache sur la gueule, il te dit aussi que par le passé il à baisé ta mère , que fait tu ?"
niveau\question(2)\nbrReponse = 2

niveau\question(2)\reponse(0)\reponse = "Tu lui coupe la bite, et tu lui fourre dans sa grande gueulle"
niveau\question(2)\reponse(0)\jumpToQuestion = 4

niveau\question(2)\reponse(1)\reponse = "Tu lui dit que tu as 2 pères..."
niveau\question(2)\reponse(1)\jumpToQuestion = 5


; QUESTION 3
niveau\question(3)\question   = "tu as passé ton chemin, mais le vieux te crache son dentier dans le dos , que fait tu ?"
niveau\question(3)\nbrReponse = 2

niveau\question(3)\reponse(0)\reponse = "Tu part en courant en laissant derrière toi une trainée de pisse"
niveau\question(3)\reponse(0)\jumpToQuestion = 4

niveau\question(3)\reponse(1)\reponse = "Tu lui colle un high kick suivi d'un triple coup de boule rotatif"
niveau\question(3)\reponse(1)\jumpToQuestion = 4


; QUESTION 4

niveau\question(4)\question = "Fin..."
niveau\question(4)\nbrReponse = 0
niveau\question(4)\reponse(1)\jumpToQuestion = 4


; QUESTION 5
niveau\question(5)\question   = "il te dit qu'il est pédé comme un phoque et qu'il veut t'enculé"
niveau\question(5)\nbrReponse = 2

niveau\question(5)\reponse(0)\reponse = "tu baisses ton pantalon et tu te colle un doigt dans le fion"
niveau\question(5)\reponse(0)\jumpToQuestion = 4

niveau\question(5)\reponse(1)\reponse = "tu le fend en deux !"
niveau\question(5)\reponse(1)\jumpToQuestion = 4





OpenConsole()
EnableGraphicalConsole(1)



current_question.i = 0



BEGIN:

ClearConsole()

PrintN( niveau\question( current_question )\question )

For i = 0 To niveau\question( current_question )\nbrReponse - 1
  PrintN( Str(i+1) + " = " + niveau\question( current_question )\reponse(i)\reponse )
Next 

Print("CHOIX = ")
Resultat.i = Val(Input()) - 1

If Resultat < 0
  Resultat = 0
EndIf 

current_question = niveau\question(current_question)\reponse( Resultat )\jumpToQuestion

Goto BEGIN

ensuite à toi de créer des fonctions qui permet de créer des questions/réponse à la volée.
Tu peu aussi parsé un fichier texte , via les fonctions readstring()/stringfield() , etc...
et au moment du parsing tu executes tes fonctions qui créer les questions réponse.
tu peut ensuite inclure ton fichier texte dans ton executable.
tu peu aussi edité ton niveau dans un fichier .cvs , Dobro avait écrit un truc la dessus pour la lecture/écriture sur ce type de format.
ou , tu peut aussi passé par des .dll qui contiens ton niveau ( regarde ds la section tuto & programme à base de plugin )

Re: Code en BDD

Publié : dim. 02/sept./2012 1:16
par Yrahen
Je vois, le plus etonnant est que j'ai absolument tout compris, mis a part l'utilisation des structures, mais en meme temps a 2h du mat le cerveau est un peu moins performant.

En tout cas super, j'ai enfin une ligne a suivre qui semble fiable :)

Merci!

Re: Code en BDD [RESOLU]

Publié : dim. 02/sept./2012 10:06
par G-Rom
une structure permet "d'étendre" les informations sur une variable.
par exemple :

au lieu d'écrire des coordonnées comme ceci :

Code : Tout sélectionner

PositionX.f = 50
PositionY.f = 25
tu peut faire :

Code : Tout sélectionner

Structure Coordonnee
 X.f
 Y.f
EndStructure

Position.Coordonnee
Position\x = 50
Position\y = 25
tout est contenu dans "Position", tu peut mettre dans ta structure ce que tu veut , des tableaux , liste chaînée , tout type de variable , d'autre structures , etc...
Voici un exemple plus complet avec des particules :

Code : Tout sélectionner

Structure s_Position
  x.f
  y.f
EndStructure

Structure s_Particule
  Position.s_Position
  Direction.s_Position
  Speed.f
  TimeToLife.i
  Size.f
EndStructure

Structure s_Particule_Emeteur
  Position.s_Position
  List particule.s_Particule()
  Timer.i
  CreateTimer.i
EndStructure



Procedure CreateParticule(*p.s_Particule_Emeteur, speedToCreate.i = 250)
  
  AddElement(*p\particule())
    *p\particule()\Position\x = *p\Position\x
    *p\particule()\Position\y = *p\Position\y
    
    ;-1 to 1
    *p\particule()\Direction\x = (-Random(100) + Random(100)) / 100
    *p\particule()\Direction\y = (-Random(100) + Random(100)) / 100
    
    *p\particule()\TimeToLife  = ElapsedMilliseconds() + 2500

    *p\particule()\Speed = 1 + Random(19)
    *p\CreateTimer = speedToCreate
    *p\Timer       = ElapsedMilliseconds() + *p\CreateTimer
EndProcedure



Procedure RunParticle(*p.s_Particule_Emeteur)
  
  ; Creation particule
  ;
  If *p\Timer < ElapsedMilliseconds()
    *p\Timer = ElapsedMilliseconds() + *p\CreateTimer
    CreateParticule(*p,*p\CreateTimer)
  EndIf 
  
  
  ForEach *p\particule()
    
    ; Mouvement particule
    ;
     *p\particule()\Position\x = *p\particule()\Position\x + (*p\particule()\Direction\x * *p\particule()\Speed)
     *p\particule()\Position\y = *p\particule()\Position\y + (*p\particule()\Direction\y * *p\particule()\Speed)
     
   
    ; Suppression particule
    ;
    If *p\particule()\TimeToLife < ElapsedMilliseconds()
      DeleteElement(*p\particule(),1)
      Continue
    EndIf
    
    
    Circle(*p\particule()\Position\x,*p\particule()\Position\y,1,$FFFFFF)
    
  Next 
EndProcedure



InitSprite()
OpenWindow(0,0,0,800,600,"")
OpenWindowedScreen(WindowID(0),0,0,800,600,1,0,0)



A.s_Particule_Emeteur

A\Position\x  = 400
A\Position\y  = 300
A\CreateTimer = 10


B.s_Particule_Emeteur
B\Position\x  = 200
B\Position\y  = 100




Repeat
  event = WindowEvent()
  
  If event = #PB_Event_CloseWindow
    quit = 1
  EndIf 
  
  
  ClearScreen(0)
  
  StartDrawing(ScreenOutput())
    RunParticle(@A)
    RunParticle(@B)
  StopDrawing()
  
  
  
  FlipBuffers()
  
Until quit = 1

Re: Code en BDD [RESOLU]

Publié : dim. 02/sept./2012 10:30
par Ar-S
version psyché :mrgreen:

Code : Tout sélectionner

Structure s_Position
  x.f
  y.f
EndStructure

Structure s_Particule
  Position.s_Position
  Direction.s_Position
  Speed.f
  TimeToLife.i
  size.f
EndStructure

Structure s_Particule_Emeteur
  Position.s_Position
  List particule.s_Particule()
  Timer.i
  CreateTimer.i
EndStructure



Procedure CreateParticule(*p.s_Particule_Emeteur, speedToCreate.i = 250)
  
  AddElement(*p\particule())
  *p\particule()\Position\x = *p\Position\x
  *p\particule()\Position\y = *p\Position\y
  
  ;-1 to 1
  *p\particule()\Direction\x = (-Random(100) + Random(100)) / 100
  *p\particule()\Direction\y = (-Random(100) + Random(100)) / 100
  
  *p\particule()\TimeToLife  = ElapsedMilliseconds() + 2500
  
  *p\particule()\Speed = 1 + Random(19)
  *p\CreateTimer = speedToCreate
  *p\Timer       = ElapsedMilliseconds() + *p\CreateTimer
EndProcedure



Procedure RunParticle(*p.s_Particule_Emeteur)
  
  ; Creation particule
  ;
  If *p\Timer < ElapsedMilliseconds()
    *p\Timer = ElapsedMilliseconds() + *p\CreateTimer
    CreateParticule(*p,*p\CreateTimer)
  EndIf
  
  
  ForEach *p\particule()
    
    ; Mouvement particule
    ;
    *p\particule()\Position\x = *p\particule()\Position\x + (*p\particule()\Direction\x * *p\particule()\Speed)
    *p\particule()\Position\y = *p\particule()\Position\y + (*p\particule()\Direction\y * *p\particule()\Speed)
    
    
    ; Suppression particule
    ;
    If *p\particule()\TimeToLife < ElapsedMilliseconds()
      DeleteElement(*p\particule(),1)
      Continue
    EndIf
    
      DrawRotatedText(Random(800), Random(600), "Pure Basic !", Random(360), RGB(Random(255), Random(255), Random(255)))
      Circle(*p\particule()\Position\x,*p\particule()\Position\y,Random(5),Random($FFFFFF))
    
  Next
EndProcedure



InitSprite()
OpenWindow(0,0,0,800,600,"")
OpenWindowedScreen(WindowID(0),0,0,800,600,1,0,0)



a.s_Particule_Emeteur

a\Position\x  = 600
a\Position\y  = 300
a\CreateTimer = 10


b.s_Particule_Emeteur
b\Position\x  = 200
b\Position\y  = 300



Repeat
  event = WindowEvent()
  
  If event = #PB_Event_CloseWindow
    quit = 1
  EndIf
  
  
  ClearScreen(0)
  
  StartDrawing(ScreenOutput())
    RunParticle(@a)
    RunParticle(@b)
  StopDrawing()
  
  
  
  FlipBuffers()
  
Until quit = 1

Re: Code en BDD [RESOLU]

Publié : dim. 02/sept./2012 10:43
par Yrahen
Je vois.. Les structures sont en fait des big variables, avec plein de petites variables dedans en gros.

Ca me rappelle un peu le style OO. Je pense utiliser les structures a partir de maintenant, le code doit paraitre plus clair, et ca evite d'avoir moulte variables a droite a gauche.

Re: Code en BDD [RESOLU]

Publié : dim. 02/sept./2012 10:57
par Backup
ça me désole d'avoir a repeter ça trop souvent mais

ici :
http://www.purebasic.fr/french/viewtopi ... =21&t=6664

il y a des tutos ;)
(y compris sur les Structures )