Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Autres IDE
Autres IDE Les autres environnements de développement (PP Compiler, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/11/2011, 15h44   #1
EpiTouille
Membre expérimenté
 
Avatar de EpiTouille
 
Homme Titouan Créac'h
Epitech
Inscription : mai 2009
Messages : 249
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Epitech

Informations forums :
Inscription : mai 2009
Messages : 249
Points : 527
Points : 527
Par défaut Space invader : mise en pause d'un thread

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 :
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 :
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 !
EpiTouille est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2011, 18h40   #2
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 398
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 4 398
Points : 10 743
Points : 10 743
L'approche est intéressante ça pourrait sans doute faire un bon tutorial sur les Thread et la synchronisation...mais pour un Space Invaders c'est un peu sur fait

Tu bloques ton thread principal avec le ReadKey alors que KeyPressed te permet de savoir s'il y a une touche à lire, il ne te reste qu'à calculer la vitesse de déplacement de ton missile et le temps passé depuis le dernier passage de la boucle pour faire tout dans un seul thread

quelque chose du genre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
var
  Start: TDateTime;
  Yet  : TDateTime;
  Time : Single;
  Done : Boolean;
begin
  Start := Now;  
  Done := False;
  repeat
   if KeyPressed then
     TraitementTouche(ReadKey);
   Yet := Now;
   Time := Yet - Start;
   Start := Yet;
   if MissileVisible then
     DeplaceMissile(Time);
  until Done;
end;
__________________
Developpez.com: Mes articles, forum FlashPascal
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h23.


 
 
 
 
Partenaires

Hébergement Web