Pascal : faire un timer

Pascal : faire un timer - Programmation

Marsh Posté le 19-03-2002 à 23:36:03    

Salut, afin que vous compreniez bien ma question autant vous expliquer précisément mon problème.
Je suis en train de faire un "bomberman" sur pascal mais je me heurte à un problème, pour l'explosion d'une bombe il faut attendre un moment mais à ma connaissance seule la fonction DELAY permet d'attendre un nombre déternimé de secondes or cette commande bloque toutes les autres pendant son exécution ce qui fait que mon bonhomme après avoir posé sa bombe ne peut pas bouger pendant que le décompte avant l'explosion se fasse, et donc il meurt.. le pauvre :(
Voila, g cherché sur plusieurs sites mais g peur qu'il faille utiliser les interruptions et ça ben ..... :D
 
Merci d'avance. Bye.

 

[jfdsdjhfuetppo]--Message édité par bartus--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 19-03-2002 à 23:36:03   

Reply

Marsh Posté le 19-03-2002 à 23:40:56    

Des Threads ? Des timers ?
Je parle pour Delphi... donc ce n'est peut être pas bon pour ton cas....
Sinon pour les intéruptions C chaud (expérience en C/C++ donc je pense que idem pour Pascal) en + WinNT/2000/XP va pas trop aimer je pense.... et les nouveaux compilo ne l'accepte po... (je parle interruption du style int86x ou truc du genre en C...)
Sinon doit y avoir moyen avec interruption/traitement de messages.....
Enfin plein de possibilités quoi...
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 20-03-2002 à 00:41:32    

Dis, Poire, dans ce cas-ci, une boucle dans laquelle il dessine son bonhomme et qui teste une valeur "time" (contrairement à la petite routine Qbasic de Pilou2001), ça me parraît indiqué.
Qu'en penses-tu? :??:


---------------
Si on vous donne une info qui marche, DITES-LE!!!! ------ Si vous trouvez seul, AUSSI, votre solution peut servir à d'autres! ------ Je dois la majorité de mes connaissances à mes erreurs!
Reply

Marsh Posté le 20-03-2002 à 03:24:15    

Mmh... Pour moi t'as pas le choix, a toi de te gérer ta propre boucle de message perso genre...
 
while SecondsBetween(time1,now)<5 do
begin
  case key of  
   ....
  end;  
end;
 
ou un brol comme ca, ca fait longtemps que j'ai plus touché au pascal pur et dur ;-)


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 20-03-2002 à 07:04:04    

AlainTech a écrit a écrit :

Dis, Poire, dans ce cas-ci, une boucle dans laquelle il dessine son bonhomme et qui teste une valeur "time" (contrairement à la petite routine Qbasic de Pilou2001), ça me parraît indiqué.
Qu'en penses-tu? :??:  




Oui... mais le problème C que ça va bouclé en permanence pendant la durée de la boucle (Je C ça veut rien dire) et donc le temps de la boucle tu seras à 100% des ressources procs (si 5s de temps 5s à 100%) et pendant le temps de l' explosion de la bombe tu dois avoir un traitement parallelle (déplacement du perso,....) Donc le mieux je pense et de mettre en place des sprites ou utiliser un thread si C possible...


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 20-03-2002 à 15:46:31    

Le thread n'existe pas en programmation DOS... Et tu peux te permettre 100% de CPU, vu que... Tu as aucun autre soft qui tourne sur la machine!


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 20-03-2002 à 16:20:46    

Buitoni a écrit a écrit :

Le thread n'existe pas en programmation DOS... Et tu peux te permettre 100% de CPU, vu que... Tu as aucun autre soft qui tourne sur la machine!  




comment il fais pour calculer le deplacement du perso si ta boucle monopolise tout durent 5s? :gun:


---------------
Master [:viiz] c'est moi
Reply

Marsh Posté le 20-03-2002 à 16:23:21    

bartus au fais ton bomberman minteresse tu pourais me le filler;)


---------------
Master [:viiz] c'est moi
Reply

Marsh Posté le 20-03-2002 à 17:26:08    

jawad a écrit a écrit :

 
comment il fais pour calculer le deplacement du perso si ta boucle monopolise tout durent 5s? :gun:  




 
Je t'ai dis de gerer les touches dans la boucle...
 
 :hello:


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 20-03-2002 à 18:29:48    

Buitoni a écrit a écrit :

Le thread n'existe pas en programmation DOS... Et tu peux te permettre 100% de CPU, vu que... Tu as aucun autre soft qui tourne sur la machine!  




Oups... bien vue ;)


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 20-03-2002 à 18:29:48   

Reply

Marsh Posté le 24-03-2002 à 17:21:05    

Merci de vos réponses.
Je m'en suis inspiré et g aboutis a la solution suivante :
 
je vous ai mis en gras certains instructions afin de rendre le texte plus lisible
 
PROCEDURE BOMBE(posx,posy:integer);
var he,min,sec,cent,counter1,counter2:word;
    ch:char;
    posrobx,posroby:integer;
begin
setcolor(4);
setfillstyle(interleavefill,red);
{ dessine le corps du C4 en rouge }
bar(posx+30,posy+15,posx+40,posy+40);
{ dessine la meche en marron }
setfillstyle(interleavefill,brown);
bar(posx+34,posy+15,posx+36,posy+5);
 
 
gettime(he,min,sec,cent);
counter1:=sec+(min*60)+(he*3600);
 
while counter2<=(counter1+3) do
begin
 
repeat
until keypressed;
ch:=littouche;
 
{ Test quelle touche a ?t? pr?ss?e }
 
{ Deplacement Droit }
 
      if ch='d' then
          begin
               { Dessine le robot tout en noir afin de l effacer}
               dessine_robot(posrobx,posroby,0,0,0);
               { Dessine le robot avec les nouvelles coordonn?es }
               posrobx:=posrobx+10;
 
          end;
 
{ Deplacement Gauche }
 
       if ch='q' then
          begin
               dessine_robot(posrobx,posroby,0,0,0);
               posrobx:=posrobx-10;
          end;
 
{ Deplacement Haut }
 
       if ch='z' then
          begin
               dessine_robot(posrobx,posroby,0,0,0);
               posroby:=posroby-10;
          end;
 
{ Deplacement Bas }
 
       if ch='s' then
          begin
               dessine_robot(posrobx,posroby,0,0,0);
               posroby:=posroby+10;
          end;
 
 
 
     gettime(he,min,sec,cent);
     counter2:=sec+(min*60)+(he*3600);
end;
 
 
{ Fin des Proc?dures }
 
 
Le problème est que j'obtiens la même chose qu'avec l'instruction delay, à savoir que pendant les 3 secondes le programme s'arrete et cela bloque les autres fonctions, le bonhomme ne peut donc pas se déplacer.
Je pense que le problème vient du fait que la boucle est exécutée trop rapidement  :??: mais à vrai dire je ne sais pas trop  :sarcastic:
 
 
A+ et encore merci d'avance pour vos réponses  :jap:

Reply

Marsh Posté le 24-03-2002 à 20:18:19    

le plus propre serait que tu gères tout cela au sein de la boucle principale de ton jeu.
 
tu ne dois absolument pas bloquer ton jeu pour attendre l'explosion, il suffit simplement que tu maintiennes un compteur qui tu incrémentes à chaque tick (chaque itération de la boucle principale) et lorsque la valeur critique est atteinte tu fais passer l'état de ton lutin bombe à "explosion", l'état "explosion" pouvant elle même durer un certain temps au bout du quel ton lutin passe à l'état "disparition", ce n'est pas trop compliqué.
 
la boucle principale de ton jeu devrait etre du style
 
while pas_fin do
begin
 tester_clavier;
 action_joueur;
 actions_autres_lutins;
 comptage_score_et_infos;
 dessin_decor;
 dessin_autres_lutins;
 dessin_joueur;
 dessin_score_et_infos;
end;

Reply

Marsh Posté le 24-03-2002 à 20:36:05    

pour la culture générale ...
 
version en ligne du livre "programmation des jeux d'arcade en C" de diana gruber (en version originale)
 
http://www.makegames.com/sidescroller/
 
meme si le bouquin date (1994) c'est la référence pour les jeux 2d à défilement et c'est très facile d'adapter cela en pascal

Reply

Marsh Posté le 25-03-2002 à 14:34:00    

Ok merci, je vais essayer ça.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed