Bonjour à tous,

Comme certains le savent déjà, je développe un petit jeu point n' click en C# WinForms avec Visual Studio 2005. Pour l'instant, je travaille sur le déplacement du personnage qui se trouve être une PictureBox.

Le problème que je rencontre est le suivant : je clique sur le formulaire pour déplacer le personnage là ou il a cliqué, la méthode Form1_MouseClick(object sender, MouseEventArgs e) réagit et exècute un Thread qui se chargera de déplacer le personnage. La logique de déplacement du personnage est la suivante : le programme détecte où le clic a eu lieu et établi une orientation (D pour Droite, G pour Gauche, H pour Haut, B pour Bas, HD, HG, BD, BG)
ensuite j'ai fait un switch qui réagit en fonction de cela, de la manière suivante :

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
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
public class MyThreadHandle
        {
            private Form1 monForm;
            private delegate void changeLocation(Point Loca);
            private int _departX;
            private int _departY;
            private int _arriveeX;
            private int _arriveeY;
            private string directionX;
            private string directionY;
            private string orientation;
 
            private void changementLocation(Point pLoca)
            {
                monForm.Perso.Location = pLoca;
            }
 
            public MyThreadHandle(int parriveeX, int parriveeY, Form1 pmonForm)
            {
                monForm = pmonForm;
                _departX = pmonForm.Perso.Location.X;
                _departY = pmonForm.Perso.Location.Y;
                _arriveeX = parriveeX - (monForm.Perso.Size.Width / 2);
                _arriveeY = parriveeY - (monForm.Perso.Size.Height - 10);
 
                if (departX == arriveeX)
                {
                    directionX = "";
                    if (departY < arriveeY)
                    {
                        directionY = "B";
                    }
                    else if (departY > arriveeY)
                    {
                        directionY = "H";
                    }
                }
                else if (departX < arriveeX)
                {
                    directionX = "D";
                    if (departY == arriveeY)
                        directionY = "";
                    else if (departY < arriveeY)
                        directionY = "B";
                    else if (departY > arriveeY)
                        directionY = "H";
                }
                else if (departX > arriveeX)
                {
                    directionX = "G";
                    if (departY == arriveeY)
                        directionY = "";
                    else if (departY < arriveeY)
                        directionY = "B";
                    else if (departY > arriveeY)
                        directionY = "H";
                }
 
                orientation = directionY.ToString() + directionX.ToString();
            }
 
            public int departX
            {
                get { return _departX; }
                set { _departX = value; }
            }
 
            public int departY
            {
                get { return _departY; }
                set { _departY = value; }
            }
 
            public int arriveeX
            {
                get { return _arriveeX; }
            }
 
            public int arriveeY
            {
                get { return _arriveeY; }
            }
 
            public void ThreadLoop()
            {
                Point maLoca = new Point(departX, departY);
                while (Thread.CurrentThread.IsAlive)
                {
                    while ((departX != arriveeX) && (departY != arriveeY))
                    {
                        // Influence la vitesse de déplacement du personnage
                        Thread.Sleep(4);
 
                        switch (orientation)
                        {
                            case "D":
                                maLoca = new Point(departX + 1, departY);
                                departX = departX + 1;
                                break;
 
                            case "G":
                                maLoca = new Point(departX - 1, departY);
                                departX = departX - 1;
                                break;
 
                            case "H":
                                maLoca = new Point(departX, departY - 1);
                                departY = departY - 1;
                                break;
 
                            case "B":
                                maLoca = new Point(departX, departY + 1);
                                departY = departY + 1;
                                break;
 
                            case "HD": // On va en Haut à Droite
                                if (departX == arriveeX)
                                {
                                    maLoca = new Point(departX, departY - 1);
                                    departY = departY - 1;
                                }
                                else if (departY == arriveeY)
                                {
                                    maLoca = new Point(departX + 1, departY);
                                    departX = departX + 1;
                                }
                                else
                                {
                                    maLoca = new Point(departX + 1, departY - 1);
                                    departX = departX + 1;
                                    departY = departY - 1;
                                }
                                break;
 
                            case "HG": // On va en Haut à Gauche
                                if (departX == arriveeX)
                                {
                                    maLoca = new Point(departX, departY - 1);
                                    departY = departY - 1;
                                }
                                else if (departY == arriveeY)
                                {
                                    maLoca = new Point(departX - 1, departY);
                                    departX = departX - 1;
                                }
                                else
                                {
                                    maLoca = new Point(departX - 1, departY - 1);
                                    departX = departX - 1;
                                    departY = departY - 1;
                                }
                                break;
 
                            case "BD": // On va en Bas à Droite
                                if (departX == arriveeX)
                                {
                                    maLoca = new Point(departX, departY + 1);
                                    departY = departY + 1;
                                }
                                else if (departY == arriveeY)
                                {
                                    maLoca = new Point(departX + 1, departY);
                                    departX = departX + 1;
                                }
                                else
                                {
                                    maLoca = new Point(departX + 1, departY + 1);
                                    departX = departX + 1;
                                    departY = departY + 1;
                                }
                                break;
 
                            case "BG": //On va en Bas à Gauche
                                if (departX == arriveeX)
                                {
                                    maLoca = new Point(departX, departY + 1);
                                    departY = departY + 1;
                                }
                                else if (departY == arriveeY)
                                {
                                    maLoca = new Point(departX - 1, departY);
                                    departX = departX - 1;
                                }
                                else
                                {
                                    maLoca = new Point(departX - 1, departY + 1);
                                    departX = departX - 1;
                                    departY = departY + 1;
                                }
                                break;
                        }
 
                        //TestDeplaceImg.Form1.ActiveForm.Invoke(new changeLocation(changementLocation), maLoca);
                        monForm.Invoke(new changeLocation(changementLocation), maLoca);
                    }
                    monForm.moveEnCours = false;
                    monForm.mymovePerso.Abort();
                }
            }
        }
Le déplacement latéral s'éffectue jusqu'à ce qu'un axe d'arrivé soit égal à son axe de départ et la il sort du while donc il ne reste pas les 2 conditions du while et je ne comprends pas pourquoi !

J'attends vos réponses !! Merci !