Bonjour,
Je fais un space invader avec virtual pascal en mode texte

j'ai fais un thread pour tirer le missile, comme ça pendant que le missile avance (1 carreau tout les 300ms) peut bouger mon vaisseau plus vite.

mais le problème c'est qu'avec le thread, mon programme réagit comme ça

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Le vaisseau ce met au bonne coordonnée
-> Le missile ce met au bonne coordonnée avec le thread
Le vaisseau s'affiche
la technique se serai de mettre en pause le thread durant le déplacement du vaisseau.

1ere question : Comment mettre un thread en pause

2eme question : Peut-on éviter les threads. ça doit être possible car les premiers space invader sont vieux et donc, n'utilisait pas les threads

Je donne mon début de code, histoire d'avoir vos impressions.
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
 
program SPACE_INVADER;
 
{$PMTYPE VIO}
{$X+,Delphi+,Use32+}
 
uses Crt, VPSysLow, VPUtils;
 
(* LES TYPES ET OBJECTS *)
 
type TPoint = record
  X,Y : Integer;
end;
 
type TDirection = (Droite, Gauche);
 
 
 
type TVaisseau = object
  Body : String;
  Point : TPoint;
  constructor Init;
  procedure Bouger(Direction : TDirection);
  procedure Afficher;
  procedure Effacer;
end;
 
type TMissile = object
  Body : String;
  Point : TPoint;
  IsFire : Boolean;
  Constructor Init;
  procedure Deplacer;
  procedure Afficher;
  procedure Effacer;
end;
 
type PMissile = ^TMissile;
 
 
var
  ThreadTirer : TSemHandle;
  Vaisseau : TVaisseau;
  Touche : Char;
  Missile : PMissile;
 
constructor TMissile.init;
begin
  Body := '|';
  IsFire := False;
 
end;
 
procedure TMissile.Deplacer;
begin
  Dec(Point.Y);
end;
 
procedure TMissile.Afficher;
begin
  TextColor(Green);
  GotoXY(Point.X,Point.Y);
  Write(Body);
end;
 
procedure TMissile.Effacer;
begin
  GotoXY(Point.X,Point.Y);
  Write(' ');
end;
 
 
constructor TVaisseau.Init;
begin
  Body := '/-^-\';
  Point.X := 38;
  Point.Y := 25;
end;
 
 
procedure TVaisseau.Bouger(Direction : TDirection);
begin
  if (Direction=Droite) and (Point.X < 75) then
  begin
    Self.Effacer;
    Inc(Point.X);
    Self.Afficher;
  end;
  if (Direction=Gauche) and (Point.X > 1) then
  begin
    Self.Effacer;
    Dec(Point.X);
    Self.Afficher;
  end;
 
end;
 
function Tirer(aPMissile : Pointer) : Longint;
begin
  SemRequestMutex(ThreadTirer, 10);
  while (Missile^.Point.Y > 1) do
  begin
    Missile^.Effacer;
    Missile^.Deplacer;
    Missile^.Afficher;
    Delay(300);
  end;
  SemReleaseMutex(ThreadTirer);
  SemCloseMutex(ThreadTirer);
  Missile^.IsFire := false;
end;
 
procedure TVaisseau.Afficher;
begin
  TextColor(Red);
  GotoXY(Point.X,Point.Y);
  Write(Body);
end;
 
 
 
procedure TVaisseau.Effacer;
begin
  GotoXY(Point.X,Point.Y);
  Write('     ');
end;
 
 
(* Programma principale *)
 
begin
  HideCursor;
  Vaisseau.Init;
  Vaisseau.Afficher;
  New(Missile,Init);
  ThreadTirer := SemCreateMutex(nil, false, false);
 
  while true do
  begin
 
    (*Events*)
    while KeyPressed do Touche := ReadKey;
    case Touche of
      #77 : Vaisseau.Bouger(Droite);
      #75 : Vaisseau.Bouger(Gauche);
      #27 : Halt(0);
      ' ' : begin
              if not Missile^.IsFire then
              begin
                Missile^.Point.X := Vaisseau.Point.X + 2;
                Missile^.Point.Y := 24;
                Missile.IsFire := True;
                Missile^.IsFire := true;
                VPBeginThread(Tirer, 1024*16, nil);
              end;
 
            end;
   end;
 
    Touche := #00;
  end;
 
end.
Merci !