auriez-vous une solution pour mon petit problème de contour ? :)
merci
Version imprimable
auriez-vous une solution pour mon petit problème de contour ? :)
merci
regardes du coté des options de ton objet graphics
Il y a des propriétés comme : SmoothMode, interpolationMode, etc.. qui permettent d'avoir des rendus de meilleurs qualités
ça ne va pas du tout, cette solution n'est vraiment pas optimisée et consomme beaucoup trop de ressources >_<
j'ai commencé ça :
l'avantage de cette méthode, c'est que je peux modifier juste une case, lorsque je place un pion.Code:
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 private void mainForm_Paint(object sender, PaintEventArgs e) { creationDamier(); } private void creationDamier() { Panel[,] MyPanels = new Panel[8,8]; Point emplacementJeton = new Point(0, 0); for (int x = 0; x < nbCase; x++) { for (int y = 0; y < nbCase; y++) { MyPanels[x, y] = new Panel(); MyPanels[x, y].Visible = true; emplacementJeton.X = x * 70; emplacementJeton.Y = y * 70; MyPanels[x, y].Location = emplacementJeton; Graphics g = MyPanels[x, y].CreateGraphics(); g.SmoothingMode = SmoothingMode.HighQuality; g.FillRectangle(new SolidBrush(Color.Red), 0, 0, 70, 70); g.FillEllipse(new SolidBrush(Color.Blue), 3, 3, 64, 64); } } }
malheureusement, rien ne s'affiche
ca me saoule ton truc...
Prends ca et amuses toi bien :)
C'est un controle utilisateur qui dessine un damier et des pions :)
Et à chaque fois qu'on déplace la souris, il te dit dans quelle case tu te trouves :)
C'est rapide, efficace et "optimisé" !!!
Tu crées un userControl dans ton projet...
Tu mets le userContrl (après compilation) sur ta form.. et basta :)
Pour ajouter les pions, tu fais par exemple :
Code:
1
2
3
4
5 gameBoard1.Pions.Add(new Pion(new Point(0, 0), PionKind.White)); gameBoard1.Pions.Add(new Pion(new Point(2, 0), PionKind.White)); gameBoard1.Pions.Add(new Pion(new Point(4, 0), PionKind.White)); gameBoard1.Pions.Add(new Pion(new Point(6, 0), PionKind.White)); gameBoard1.RefreshBoard();
Code:
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Diagnostics; namespace Damier { public partial class GameBoard : UserControl { private List<Pion> pions = new List<Pion>(); private Color oddColor = Color.Black; private Color evenColor = Color.White; private int nbCase = 8; private Bitmap damierBmp = null; private Bitmap damierMask = null; private float squareSize = 0.0f; public int NbCase { get { return nbCase; } set { if (nbCase % 2 == 0) { nbCase = value; Redraw(); } } } private void Redraw() { if (damierBmp != null) { damierBmp.Dispose(); damierMask.Dispose(); damierBmp = null; damierMask = null; } Invalidate(); } public List<Pion> Pions { get { return pions; } set { pions = value; Invalidate(); } } protected override void OnMouseMove(MouseEventArgs e) { // We want to know which square is under mouse, easy :) if (damierMask != null) { Color col = damierMask.GetPixel(e.X, e.Y); Trace.WriteLine("Position x=" + col.G + " y=" + col.B); } } public Color OddColor { get { return oddColor; } set { oddColor = value; Redraw(); } } public Color EvenColor { get { return evenColor; } set { evenColor = value; Redraw(); } } public GameBoard() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true); } protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; DrawDamier(g); DrawPions(g); } private void DrawPions(Graphics g) { SolidBrush blackBrush = new SolidBrush(Color.Black); SolidBrush whiteBrush = new SolidBrush(Color.White); float pionSize = squareSize / 2.0f; foreach (Pion p in pions) { SolidBrush br = (p.kind == PionKind.Black) ? blackBrush : whiteBrush; float x = p.position.X * squareSize + (squareSize - pionSize) / 2.0f; float y = p.position.Y * squareSize + (squareSize - pionSize) / 2.0f; RectangleF rec = new RectangleF(x, y, pionSize, pionSize); g.FillEllipse(br,rec); } } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); if (Width > Height) { Width = Height; } else if(Width < Height) { Height = Width; } // On calcule d'abord la taille de chaque case :) squareSize = Width / (float)nbCase; Redraw(); } private void DrawDamier(Graphics g) { if (damierBmp == null) { Trace.WriteLine("Redraw Damier"); damierBmp = new Bitmap(Width, Height); damierMask = new Bitmap(Width, Height); Graphics damier = Graphics.FromImage(damierBmp); Graphics mask = Graphics.FromImage(damierMask); RectangleF square = new RectangleF(0, 0, squareSize, squareSize); SolidBrush oddBrush = new SolidBrush(oddColor); SolidBrush evenBrush = new SolidBrush(evenColor); SolidBrush brush = oddBrush; Color maskColor = Color.FromArgb(0, 0, 0); // On dessine maintenant les cases for (int i = 0; i < nbCase; i++) { for (int j = 0; j < nbCase; j++) { square.X = j * squareSize; square.Y = i * squareSize; damier.FillRectangle(brush, square); brush = (brush == oddBrush) ? evenBrush : oddBrush; maskColor = Color.FromArgb(0, i, j); SolidBrush maskBrush = new SolidBrush(maskColor); mask.FillRectangle(maskBrush, square); maskBrush.Dispose(); } brush = (brush == oddBrush) ? evenBrush : oddBrush; } damier.Dispose(); mask.Dispose(); oddBrush.Dispose(); evenBrush.Dispose(); } if (g != null) { g.DrawImageUnscaled(damierBmp, 0, 0); } } internal void RefreshBoard() { Redraw(); } } public enum PionKind { Black, White } [Serializable] public struct Pion { public Point position; public PionKind kind; public Pion(Point p, PionKind k) { position = p; kind = k; } } }
salut, je pense qu'en utilisant xna ce sera beaucoup plus facile pour toi, j'ai cree un damier hier en 2 minutes (juste le damier).
pas mal l'idée du XNA ! comme ça je pourrais joueur à mon othello sur ma xbox ! :D
bon je vais essayer les 2 solutions, merci ^^
Sinon, pour tout ce qui est graphique sans être jeu, passe directement à WPF si tu peux.
j'ai opté pour la solution de theMonz31, bien que je ne comprends pas tout le code ^^
après génération de la solution, je n'obtiens ni erreur, ni affichage du damier xD
une fois que tu as compilé la solution, si tu vas dans ta form1, tu verras dans la toolbox l'apparition du composant "GameBoard".. il te suffit alors de la positionner dans ta forme...
Il y a des propriétés qui existe dans le composant pour choisir la couleur des cases pair et impair (even & odd)... Idem pour le nombre de case en largeur !!!
Qu'est ce que tu ne comprends pas dans le code que j'ai donné ?
Il n'y a à priori rien de "bien" sorcier !!!
Poses tes questions ? (toutes en une fois...)
ok ya du mieux, j'arrive à afficher mon damier lors du lancement de l'appli.
seulement mon windows form n'est plus visible dans visual studio, ya une sorte de fenêtre avec des messages d'erreur (c'est la premiere fois que j'utilise un userControl, c'est pour ca que je suis si perdu ^^):
Citation:
Pour éviter tout risque de perte de données avant le chargement du concepteur, les erreurs suivantes doivent être résolues :
1 erreur
Ignorer et continuer
Pourquoi cette page s'affiche-t-elle ?
Impossible de convertir l'objet de type 'Damier.Pion[]' en type 'Damier.Pion[]'.
Instances de cette erreur (1)
1. Afficher la pile des appels
à System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
à System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck, Boolean doCheckConsistency)
à System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck)
à System.Runtime.Serialization.FormatterServices.SerializationSetValue(MemberInfo fi, Object target, Object value)
à System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder holder, Boolean bObjectFullyComplete)
à System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder holder)
à System.Runtime.Serialization.ObjectManager.RegisterObject(Object obj, Int64 objectID, SerializationInfo info, Int64 idOfContainingObj, MemberInfo member, Int32[] arrayIndex)
à System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject(Object obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString)
à System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd(ParseRecord pr)
à System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord pr)
à System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
à System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
à System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
à System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
à System.Resources.ResXDataNode.GenerateObjectFromDataNodeInfo(DataNodeInfo dataNodeInfo, ITypeResolutionService typeResolver)
à System.Resources.ResXDataNode.GetValue(ITypeResolutionService typeResolver)
à System.Resources.ResXResourceReader.ParseDataNode(XmlTextReader reader, Boolean isMetaData)
à System.Resources.ResXResourceReader.ParseXml(XmlTextReader reader)
Aide sur cette erreur
Aide sur MSDN
Publications de forum sur cette erreur
Rechercher sur les forums MSDN les publications relatives à cette erreur
pour infos, les parties du code que je ne comprends pas sont par exemple :
on n'apprend pas ça à l'école xDCode:
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 public List<Pion> Pions { get { return pions; } set { pions = value; Invalidate(); } } public enum PionKind { Black, White } [Serializable] public struct Pion { public Point position; public PionKind kind; public Pion(Point p, PionKind k) { position = p; kind = k; } }
c juste un enuméré donc une suite de valeur que peut prendre une variable de ce type là...
Cela me sert pour savoir si le pion est blanc ou noir (mais l'énum pourrait contenir plus que celà, dame blanche, dame noire, etc...
La structure Pion, c'est une structure (regarde un cours C#)
Ca permet de regrouper dans un objet son type (pion blanc ou noir) et sa position en i,j dans ton tableau :)
ok merci pour les explications.
toujours est-il que je n'arrive pas à me débarrasser de ce fichu message d'erreur >_<
quand je cliquer sur "Ignorer et continuer", je peux voir ma windows form, mais elle est vide ...
prends ma pièce jointe et regarde.. ca doit marcher :)
merci pour la réponse, dsl ces jours ci j'étais indisponible !
ton projet me génère 1 erreur :
de plus tu as le même problème que moi avec ton form1.cs, lorsque je double clique dessus pour modifier ton form ou je ne sais quoi, je ne peux pas le voir, il y a une fenêtre d'erreur ! :sCitation:
Erreur 1 Invalid Resx file. Could not load type System.Collections.Generic.List`1[[Damier.Pion, Damier, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 which is used in the .RESX file. Ensure that the necessary references have been added to your project. Ligne 128, position 5. C:\Users\m@x\Documents\Downloads\Damier\Form1.resx 128 5 Damier
je l'ai ouvert avec visual studio 2008, y aurait-il un problème de compatibilité ? :s
Aucune incompatibilité, il s'agit des ressources. Il y a une ressource déclarée qui n'a aucun type ni aucune valeur et qui représente les pions au lancement de l'application.
Il suffit de supprimer cette ressource dans le fichier Form1.resx ainsi que la ligne suivante dans le fichier Form1.Designer.cs :
Code:this.gameBoard1.Pions = ((System.Collections.Generic.List<Damier.Pion>)(resources.GetObject("gameBoard1.Pions")));
L'application se lancera alors juste avec le damier, et un clic sur le bouton suffira à afficher des pions.