[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
oui alors sur ce point, je dois dire qu'en 20 ans de programmation, j'ai fait un peu tout et n'importe quoi. Il n'y a pas de norme meilleur que les autres et on se fait très vite à une nouvelle norme. Par exemple, il y a encore 1 an de cela, les propriétés de mes objets étaient notées fProperty avec une identation de 1 espace et je trouvais ça très lisible...entre deux j'ai bossé dans un boîte dont j'ai adopté les normes et maintenant c'est FProperty et 2 espaces...et ça me parait bcp plus lisible depuis
Dans mon job actuel l'indentation se fait avec des tabulations, pour l'instant je résiste car je n'ai jamais aimé les tabulations...mais je ne jure de rien
tout a fait, tout comme mettre le Begin tout de suite aprés do ou then, ou le mettre à la ligne ...
pour les propriétés privées ... j'avoue que je préfére le "f" au "F".
c'est la tout l'avantage et l'inconvénient d'un langage non case-sensitive.
par contre les vraie tabulation c'est de la m... surtout lors d'un refactoring.
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
Paul: sympa la BD c'est vraiment l'ambiance du JDR
Doc: je potasse encore ton code
pour la fonction addlog:
- j'ai compris l'usage de la variable string, mais le chiffre suivant semble indiquer une couleur qui ne change pas, à moins que ça ne soit pas une couleur
- j'en enfin réussi à comprendre comment utiliser le Timer, même si j'ai du mal avec le code, là aussi les couleurs ne changent pas
ni le texte ni le fond
- quant au code du canvas: là je suis plus que paumé
je ne comprend pas comment l'adapter à mon programme
pour afficher un texte j'utilise AddLog
mais pour la procedure graphique j'ai pas le mode d'emploi
elle est censée faire quoi ? dessiner un rectangle ?
puisqu'on est ds les listbox:
j'essaie de modifier une couleur de fonte avec
et rien n'y fait
Code : Sélectionner tout - Visualiser dans une fenêtre à part Form.Listbox.font.color:= clRed;
avec des commentaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 unit Main; {$mode objfpc}{$H+} interface uses Windows, Classes, SysUtils, eventlog, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TForm1 } TForm1 = class(TForm) // La listbox ListBox1: TListBox; // le timer Timer1: TTimer; // evenement OnDrawItem de ListBox1 procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); // evenement OnTimer de Timer1 procedure Timer1Timer(Sender: TObject); private { private declarations } public // procedure qui permet d'ajouter une chaine (S) avec une couleur (aColor) // différente ou non des autres dans ListBox1 procedure AddLog(const S: string; const aColor: LongInt= clBlack); end; var Form1: TForm1; implementation { TForm1 } // on definit quelques couleurs const colorAction = clPurple; // couleur du texte d'une action colorDanger = $000095; // couleur du texte quand il y à danger colorAttaque= clNavy; // couleur du texte pour les attaques colorDefense= clGreen; // couleur du texte pour les defense colorInfos = clGray; // couleur du texte pour les infos colorMort = clRed; // couleur du texte pour un joueur qui meurt // la procedure AddLog // ajoute la chaine S dans listBox1 avec une couleur de texte // definit par aColor (noir si non définit). procedure TForm1.AddLog(const S: string; const aColor: LongInt= clBlack); begin // si il n'y a pas encore de texte dans ListBox1 if ListBox1.Items.Count = 0 then // on ajoute S avec Add ListBox1.Items.Add(S) else // sinon on inser S en première position (index 0) ListBox1.Items.Insert(0, S); // si aColor est diférent de noir if aColor <> clBlack then // on précise la couleur de la chaine en utilisant // la propriété Objects[] de Items (TStrings) ListBox1.Items.Objects[0] := TObject(aColor); end; // procedure de dessin des items de listBox1 // qui est appelé pour déssiner chaque chaine. procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); var vColor : LongInt; // permet de récupérer la couleur de la chaine vListBox : TListBox; // stock temporairement ListBox1 vStyle : TTextStyle; // definit le style du texte begin // on récupère la listbox appelante de cette procedure vListBox := TListBox(Control); // si Objects[index] est différent d'une valeur nulle if vListBox.Items.Objects[index] <> nil then // on récupère la couleur de définit pour cette chaine dans vColor vColor := LongInt(vListBox.Items.Objects[index]) else // sinon on ecrit en noir par défaut vColor := clBlack; // on éfface le contenus de la zone de la chaine vListBox.Canvas.FillRect(ARect); // on définit la couleur de la police d'écriture vListBox.Canvas.Font.Color := vColor; // on définit quelques propriétés supplémentaire pour // que le dessin se fasse comme on le souhaite vStyle.Alignment := taLeftJustify; // aligné à gauche vStyle.Clipping := false; // pas de clipping vStyle.ExpandTabs := false; // ne prend pas en charge les tabulations vStyle.Layout := tlCenter; // aligné verticalement au centre vStyle.Opaque := true; // n'est pas transparent vStyle.SingleLine := true; // on ecrit sur une seule ligne vStyle.Wordbreak := false; // on ne coupe pas les phrase // enfin, on ecrit la chaine dans la listbox. vListBox.Canvas.TextRect(ARect, ARect.Left+2, ARect.Top, vListBox.Items[index], vStyle); end; { démonstration automatique du resultat } var C : LongInt = 0; // compteur d'appel à l'evenement OnTimer de Timer1 // evenement OnTimer de Timer1 // ajoute une phrase dans listbox1 via la procedure AddLog // toute les X secondes (selon réglage du timer) procedure TForm1.Timer1Timer(Sender: TObject); begin // par rapport à la valeur en cours de la variable C case C of 0: AddLog('Démarrage de la partie', colorInfos); 1: AddLog('Des goblins vous attaques!', colorDanger); 2: AddLog('Perceval prépare un plan d''attaque', colorAction); 3: AddLog('Arthur attaque le goblin le plus proche', colorAttaque); 4: AddLog('Caradoc commet une maladresse et se tue', colorMort); 5: AddLog('Bohort s''enfuis comme un lache', colorAction); 6: AddLog('Le maitre du jeux s''ennuis', colorInfos); end; // on incremente C dans l'intervalle 0 à 6 uniquement (voir le case) C := (C + 1) mod 7; end; initialization {$I Main.lrs} end.
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
Alors DOC t'as reçu le "paquet" ?
merci pour les explications, mais j'ai adapté ton code au mien
AddLog fonctionne très bien mais pas les couleurs
ma ListBox s'appelle lbBattleScreen:
je ne vois pas comment changer ça, si je tape Addlog(S,2) c'est bien 2 qui est la couleur ? de 0 à 6 ? c'est bien ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TfmBattle.lbBattleScreenDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); var vColor : LongInt; vListBox : TListBox; vStyle : TTextStyle; begin vListBox := TListBox(Control); if vListBox.Items.Objects[index] <> nil then vColor := LongInt(vListBox.Items.Objects[index]) else vColor := clBlack; vListBox.Canvas.FillRect(ARect); vListBox.Canvas.Font.Color := vColor; vStyle.Alignment := taLeftJustify; vStyle.Clipping := false; vStyle.ExpandTabs := false; vStyle.Layout := tlCenter; vStyle.Opaque := true; vStyle.SingleLine := true; vStyle.Wordbreak := false; vListBox.Canvas.TextRect(ARect, ARect.Left+2, ARect.Top, vListBox.Items[index], vStyle); end;
Il y a un truc que j'aimerais savoir. Pourquoi utiliser un listBox, alors vous dessiner les textes directement dans le canvas? Faudra donc aussi gerer le scrolling et autres trucs vous meme, si vous utiliser toujours cette methode.
paquet reçu ... c'est une horreur ... il faut organiser et nommer mieux que ça tes unités et projets!
ne melange pas la façon de nommer les unité :
un fois c'est Truc_Machin_Bidule et une autre TrucChouette ...
je te conseil de faire un répertoire JDRU (Unités du JDR) puis de nommer tes unités :
JDRNom (JDRTypes, JDRClasses, JDRTools, ...)
pour le projet, nettoie les anciens fichiers. nomme ton projet correctement je n'ai pas su lequel ouvrir !
attention de bien fournir toutes les unités.
ps : lazarus fout vraiment tout et n'importe quoi comme fichiers dans les répertoires ... c'est vraiment le brin ce truc....
l'adaptation est nickel.
tu n'est plus en TP/TPW finit les 16 couleurs du DOS/Windows.
ici la couleur est exprimée n RGB true color (24bits (3*8bits)) ou l'on ecrira en hexa :
$BBGGRR (ordre bleu, vert, rouge)
exemple :
$FFFFFF = blanc (constante clWhite)
$000000 = noir (constante clBlack)
$0000FF = rouge (constante clRed)
$00FF00 = vert (constante clLime)
$FF0000 = bleu (constante clBlue)
$C0C0C0 = gris clair (constante clSilver)
$808080 = gris medium
$404040 = gris foncé
$FFFF00 = cyan
$00FFFF = jaune
$FF00FF = magenta
si tu retiens bien les valeurs :
$00 = 0% de la couleur
$80 = 50% de la couleur
$40 = 25% de la couleur
$C0 = 75% de la couleur
$FF = 100% de la couleur
tu pourra facilement créer quelques variantes simples :
$400000 = bleu foncé
$800000 = bleu medium
$C00000 = bleu
$FF0000 = bleu clair
$8040C0 = 50% de bleu, 25% de vert, 75% de rouge, melange qui donnera un rose foncé, un peu couleur yaourt à la framboise.
$8080FF = 50% de bleu, 50% de vert, 100% de rouge, melange qui donnera un rose trés lumineux, un peu rose fluo.
$00C0FF = 0% de bleu, 75% de vert, 100% de rouge, melange qui donnera un jaune puissant, un peu jaune lamborghini.
$0080FF donnera de l'orange
$C0FFFF donnera un jaune trés pale
$C08080 donnera une couleur un peu lavande
et si l'on veux créer une rampe complète :
$000000 noir
$400000
$800000 bleu marine (navy)
$C00000
$FF0000 bleu
$FF4000
$FF8000
$FFC000
$FFFF00 cyan (aqua)
$C0FF00
$80FF00
$40FF00
$00FF00 vert (lime)
$00FF40
$00FF80
$00FFC0 citron vert (sytrus)
$00FFFF jaune (yellow)
$00C0FF
$0080FF orange
$0040FF
$0000FF rouge (red)
$4000FF
$8000FF fuschia
$C000FF
$FF00FF magenta
$FF00C0
$FF0080 violet
$FF0040
$FF0000 bleu
si tu assigne 2 à AddLog tu obtiendra donc $000002 qui sera du noir trés trés nuancé rouge (nuance qui sera invisible à l'oeuil nus)
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
mmm bizarre chez moi ça marche parfaitement.
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
argh
j'ai fait un essai, simple, j'ai fermé le ProjetJDR et j'ai juste créé une fiche et j'ai copié ton code avec 1 listBox et 1 timer, puis créé le lien évènementiel entre eux et ton code: ça marche très bien, sauf les couleurs
mais bon ça n'est pas le plus grave, j'ai p-e "déréglé" lazarus
pour le moment je me contenterai du texte noir
________________________________
sinon je ne parviens pas à temporiser l'affichage du texte
sous TPW j'avais la fonction Delay, que j'insérais après chaque message
normalement là il y a Sleep
mais au lieu d'afficher les lignes une après l'autre, il affiche plusieurs lignes d'un coup après la temporisation
c'est la bonne méthode ?
__________________________________
Je vais grâce à cette interface, pouvoir travailler les 6 actions possibles:
- Attaque (2 armes au choix)
- Parade (augmente la difficulté du test des monstres)
- Magie (pour les héros qui ont ce talent)
- Objets (fiole de soin, potion magique, explosifs,...)
- Fuir (tentative reussie ou pas)
voilà comment j'ai commencé:
l'action sera choisie par le héro et stockée ds une variable tableau: ActionHero[0..5] (une liste déroulante faisant l'affaire)
Après validation du choix du personnage, j'utilise:
les actions 0, 1 et 2 sont à peu près opérationnelles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 case choix of 0: HeroAttack; // arme 1 1: HeroAttack; // arme 2 2: Parry; 3: Magic; 4: TryToFlee;
_____________________________________________________________
Rem: j'ai eut beaucoup de mal à adapter le code du combat de TPW car celui ci tournait seul dans une double boucle de tour de jeu en suivant les index des joueurs et des monstres.
mais là avec la méthode évènementielle, je me suis perdu et en fait j'ai pas pu conserver ce code initial, les boucles étant inadaptées, ou du moins j'ai pas su l'adapter
heureusement que je vous ai écouté et que j'ai quitté TPW, mais je ne regrette pas ce super exercice de code pur puisque l'EDI est minimaliste et l'interface graphique inexistante, mais effectivement après avoir découvert la fonction "programme personnalisé" de Delphi/Lazarus, on a plus du tout besoin d'un EDI aussi ancien.
qqs nouvelles:
l'échoppe est opérationnelle, les armes, armures et objets ont été stockés dans des tableaux avec leur prix et leur valeur en combat
j'ai vu qu'il existait un systeme TPage control pour gerer un affichage de pages avec onglets, mais je n'ai trouvé aucun tuto pour en expliquer l'utilisation, du coup 5 petits boutons font l'affaire
voilà un aperçu:
par contre se profile à présent la gestion de l'affichage du jeu, j'ai vu qu'il y avait un tuto sur les jeux ds le site je vais y jeter un oeil
en fait j'aimerai avoir soit un simple labyrinthe filaire, des plus classique ds les JDR, mait c'est de la 3D, soit une carte qui scrolle à l'écran
si vous avez des suggestions
Salut
Le TPageControl est simple a utiliser :
Tu inseres le composant, tu crées des pages avec "clic droit > Nouvelle page"
Ensuite, sur chaque page, tu met tes composants.
Dans ton cas, il vaut mieux utiliser un TTabControl. La différence est qu'un composant inseré sur un Tab est présent sur toutes les tabs. Pour actualiser l'affichage de ces composants, tu geres les evenements OnChange et OnChanging (F1 pour plus d'infos)
Sinon, je vois que ton projet avance bien, tu es tres motivé en tout cas. Je ne pense pas que je serais arrivé au bout ... Continue
Bonne chance !
Articles :
Création d'un système de chat en Pascal
Programmes :
Défi Pascal 2011 - Mon Tetris
Défi Pascal 2010 - Mon système de chat
Défi Delphi 2009 - Mon Sudoku Solver
Retrouvez mes différents projets sur ma page personnelle.
merci mick de tes conseils et encouragements, la motivation c'est la clé de tout
voila la situation:
on peut créer son équipe
l'équiper dans l'armurerie
la sauvegarder
faire une combat
se soigner au temple
bref tous les éléments de base sont disponibles
ce week-end neigeux qui s'annonce devrait me permettre de réaliser la magie des combats et l'utilisation des objets (fiole, poison, explosifs, ...)
tj pas d'idée sur la temporisation ni sur l'affichage 3D ?
au fait ce qui sont intéressés, vous pouvez me contacter
attention c'est un NoobCode
Bonjour,
L'affichage 3D, pouquoi pas OpenGL?
Pour la temporisation, tu pourrais peut être récupérer ton ancien code et le faire tourner dans un thread, non? Sinon, c'est le Timer, il me semble.
Bon WE neigeux.
finit et améliore déjà le moteur du jeu.
ne t'étale pas partout au risque de ne plus savoir ou donner de la tête.
une fois que tout sera parfait coté moteur, tu pourra commencer à reflechir sur l'affichage et le gameloop.
pour l'affichage, tu pourra au choix passer par la SDL par exemple ou un moteur de jeux 2D ou 3D quelconque compatible avec Delphi/Lazarus.
sinon tu as des moteurs "prés à l'emploi" :
OGRE par exemple http://www.ogre3d.org/
tu as aussi des moteurs complets comme Unity : http://unity3d.com/unity/
qui necessitera de retranscrire tes codes delphi en script unity (assé simple).
ou encore l'UDK (encore en beta) http://udk.com/index.html
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
Ma messagerie n'est pas la succursale du forum... merci!
hello,
de mon expérience de développeur...le plus compliqué reste le graphisme
afficher des sprites ou des objets 3D c'est pas si compliqué que ça, mais pour que ça ai l'air de quelque chose il faut bien choisir les graphismes, les textures, les animations etc...et ça c'est pas un boulot de programmeur
Parhélie > ha ok, faut que je potasse ce timer, merci du conseil
Doc > oui tu as raison, comme d'habitude , j'ai mes 2 fils en Béta- testeurs et ça buggue bien comme il faut donc ya encore du taf pour stabiliser tout ça, c'est que mine de rien, yen a un paquet de lignes de code
d'ailleurs j'aimerai bien que certains d'entre vous testouille le machin, mais là je demande beaucoup
j'hésite tj entre un labyrinthe en 3D (filaire) et une carte 2D qui scrolle, de toute façon faut d'abord que je potasse les tutos du site, en verra ça donc ds qqs semaines, je compte sur vous pour m'aider dans cette aventure
Paul > pas un boulot de programmeur
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager