Pascal : timer + overflow error

Pascal : timer + overflow error - Programmation

Marsh Posté le 02-04-2002 à 18:11:32    

Bonjour, voila un extrait de mon jeu de tir en pascal.
C'est la procédure gérant les déplacements et le tir du robot.
Telle qu'elle est, lors de l'appui sur A le rayon part et se déplace tout seul ( ce à quoi je voulais arriver, cf mon ancien topic :sarcastic:  ) mais le pb c que je voudrais que pendant ce temps là, mon gus puisse se déplacer, j'ai donc essayé de mettre un appel à la procédure deplacements dans ma boucle while counter2<=(counter1+1) mais si je fais cela, j'obtiens une erreur 202 : stack overflow error qui d'apres l'aide coorespond à un débordement de la pile du à une récursivité infinié  :) je pense que cette erreur vient du fait que je passe en paramètres touchepressee dans la procédure deplacements qui doit etre restée à A je pense et du coup on retourne dans cette boucle et effectivement c bien une boucle infinie mais si je mets un touchepresse:=readkey juste avant, il faut faire déplacer le robot pour que le rayon avance  :(  
Je ne sais donc pas trop comment m'en sortir.
 
Je vous remercie de votre aide  :ange:  
 
 
PROCEDURE deplacements(var posrobx,posroby:integer;touchepressee:char);
var gauche,droite,bas,haut:char;
    he,min,sec,cent,counter1,counter2:word;
    poslasx,poslasy:integer;
begin
 
{ declaration des touches }
 
gauche:=char(113);
droite:=char(100);
bas:=char(115);
haut:=char(122);
 
{ Deplacement Droit }
 
      if touchepressee=droite 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 touchepressee=gauche then
          begin
               dessine_robot(posrobx,posroby,0,0,0);
               posrobx:=posrobx-10;
          end;
 
{ Deplacement Haut }
 
       if touchepressee=haut then
          begin
               dessine_robot(posrobx,posroby,0,0,0);
               posroby:=posroby-10;
          end;
 
{ Deplacement Bas }
 
       if touchepressee=bas then
          begin
               dessine_robot(posrobx,posroby,0,0,0);
               posroby:=posroby+10;
          end;
 
{ Posage de bombe }
 
       if touchepressee=char(97) then
          begin
              poslasx:=posrobx+80;
              poslasy:=posroby;
 
               while poslasx<=640 do
                     begin
                          dessine_laser(poslasx,poslasy,red,0);
 
                          gettime(he,min,sec,cent);
                          counter1:=cent+(sec*100)+(min*6000)+(he*360000);
 
                          while counter2<=(counter1+1) do
                                begin
!! PB !! deplacements(posrobx,posroby,touchepresse);
                 gettime(he,min,sec,cent);
                 counter2:=cent+(sec*100)+(min*6000)+(he*360000);
                                end;
 
                          dessine_laser(poslasx,poslasy,0,0);
                          poslasx:=poslasx+10;
                          dessine_laser(poslasx,poslasy,red,0);
                     end;
          end;
end;

 

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

Reply

Marsh Posté le 02-04-2002 à 18:11:32   

Reply

Marsh Posté le 02-04-2002 à 19:00:31    

:(

Reply

Marsh Posté le 02-04-2002 à 21:00:51    

[:tomilou]

Reply

Marsh Posté le 03-04-2002 à 01:58:25    

ca ne vous inspire guère :heink:

 

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

Reply

Marsh Posté le 03-04-2002 à 14:50:02    

Même pas une tite idée ?  :(

Reply

Marsh Posté le 03-04-2002 à 15:15:17    

comme je crois te l'avoir déjà dit tu t'y prend mal...
 
tu dois n'avoir qu'une seule boucle qui controle ton programme, l'idéal serait que tes objets animés soient placés dans une liste chainées on aurait alors en très gros une boucle du style :
 
while continuer do
begin
  tester_clavier;
  action_joueur; // déplacement, tir etc
  action_autres_objets_animes;
  affichage;
end;  
 
 
pour partir de ton code, il faut que tu es un flag qui indique que le laser est en action et donc qu'il faut le déplacer automatiquement.
 
 
un truc du style :
 
{ Posage de bombe }
 
      if (not ActionLaser)and(touchepressee=char(97)) then
         begin
             poslasx:=posrobx+80;
             poslasy:=posroby;
             ActionLaser := true; // on signale le tir
          end;
 
{ gestion automatique du laser }
 
     if ActionLaser then
     begin
      if poslasx<=640 then
      begin
       dessine_laser(poslasx,poslasy,0,0);
       poslasx:=poslasx+10;
       dessine_laser(poslasx,poslasy,red,0);
      end else ActionLaser:=False; // fini plus de laser éventuellement placer le code pour l'effacer
     end;

Reply

Marsh Posté le 03-04-2002 à 17:16:32    

MErci de ta réponse Taureau.
 
G donc essayé de mieux ordonner mon programme et j'arrive à ceci :
 
DEBUT DU PROGRAMME PRINCIPAL
 
....
bla bla bla bla
......
 
while touchepressee<>char(27) do
begin
 
touchepressee:=readkey;
 
{ Test quelle touche a ?t? pr?ss?e et agit en consequence }
deplacements(posrobx,posroby,touchepressee,actionlaser,poslasx,poslasy);
 
{ V?rifie que le robot ne sort pas de l'?cran }
verif_pos(posrobx,posroby);
 
{ dessine le robot avec les nouvelles coordonn?es et les bonnes couleurs }
dessine_robot(posrobx,posroby,9,14,15);
 
if actionlaser=1 then
   begin
        while poslasx<=640 do
              begin
                   dessine_laser(poslasx,poslasy,red,0);
                   gettime(he,min,sec,cent);
                   counter1:=cent+(sec*100)+(min*6000)+(he*360000);
                   while counter2<=(counter1+1) do
                         begin
                              gettime(he,min,sec,cent);
                              counter2:=cent+(sec*100)+(min*6000)+(he*360000);
                         end;
 
                    deplacements(posrobx,posroby,touchepressee,actionlaser,poslasx,poslasy);
                    dessine_robot(posrobx,posroby,9,14,15);

 
                    dessine_laser(poslasx,poslasy,0,0);
                    poslasx:=poslasx+10;
                    dessine_laser(poslasx,poslasy,red,0);
               end;
 
        actionlaser:=0;
   end;
 
 
end;
 
 
Avec dans ma procédure deplacements :
 
{ Tir laser }
 
       if (touchepressee=char(97))and(actionlaser<>1) then
          begin
              poslasx:=posrobx+80;
              poslasy:=posroby;
              actionlaser:=1;
 
 
          end;
 
 
Le problème est que g l'impression que l'affichage du robot (les 2 lignes en gras)  n'a pas le temps de se faire et ça je ne comprends pas pkoi car celui du laser a le temps lui   :sweat:  
 
Je vais essayer en changeant la place de ces 2 lignes dans cette conditionnelle while poslasx<=640 mais je ne sais pas si ça va changer grand chose.
 
A +  :hello:

Reply

Marsh Posté le 04-04-2002 à 01:07:57    

En fait nan ca change que dale...

Reply

Marsh Posté le 04-04-2002 à 08:25:37    

tu dois surtout sortir les animations automatiques (laser) de la procédure du déplacement de ton robot

Reply

Marsh Posté le 05-04-2002 à 02:39:34    

Voila g mis dans une procédure tout ce qui touche au déplacement du laser, j'obtient donc :  
_ 1 procédure LASER qui vérifie si la touche pressée est bien la bonne est si oui mets la variable ACTIONLASER à 1
_ 1 procédure DESSINE_LASER qui s'occupe du dessin du laser
_ mon programme principal :
 
 
 
{ Le programme ne s'arretera qu'a l'appui de ECHAP }
while touchepressee<>char(27) do
begin
 
touchepressee:=readkey;
 
{ Test quelle touche a ?t? pr?ss?e et agit en consequence }
deplacements(posrobx,posroby,touchepressee);
 
laser(posrobx,posroby,touchepressee,actionlaser,posla
 
sx,poslasy);
 
{ V?rifie que le robot ne sort pas de l'?cran }
verif_pos(posrobx,posroby);
 
{ dessine le robot avec les nouvelles coordonn?es et les bonnes couleurs }
dessine_robot(posrobx,posroby,9,14,15);
 
if actionlaser=1 then
   begin
        while poslasx<=640 do
              begin
 
                   deplacements(posrobx,posroby,touchepressee);
                   dessine_robot(posrobx,posroby,9,14,15);

                   dessine_laser(poslasx,poslasy,red,0);
                   gettime(he,min,sec,cent);
                   counter1:=cent+(sec*100)+(min*6000)+(he*360000);
                   while counter2<=(counter1+1) do
                         begin
                              gettime(he,min,sec,cent);
                              counter2:=cent+(sec*100)+(min*6000)+(he*360000);
                         end;
 
 
                    dessine_laser(poslasx,poslasy,0,0);
                    poslasx:=poslasx+10;
                    dessine_laser(poslasx,poslasy,red,0);
               end;
 
        actionlaser:=0;
   end;
 
 
end;
 
 
Voila, après avoir bien séparé le déplacement du robot dans une procédure et la gestion du laser dans une autre j'obtiens toujours le même problème, à savoir que pendant que le laser se déplace il est impossible de faire bouger le robot mais le programme enregistre bien les actions sur les touches puisqu'à la fin de la course du laser il dessine le robot à ses bonnes coordonnées finales (sans avoir dessiné les positions intermédiaires ).
De plus g testé en mettant juste avant la ligne en gras, l'instruction "touchepressee:=readkey" et là, apres la procédure de déplacement du laser lancée, à chaque pression d"une touche le laser avance mais surtout le robot se dessine !! chose qui ne se faisait pas avant....      :sweat:  
 
Avis aux bonnes âmes pouvant m'aider  :jap: pour relayer le pauvre taureau à qui je donne bien du mal  :(

 

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

Reply

Marsh Posté le 05-04-2002 à 02:39:34   

Reply

Marsh Posté le 05-04-2002 à 07:21:57    

le problème c'est que tu rentre dans une boucle lorsque tu veux déplacer ton laser, tu n'as pas compris ce que je veux te dire...
 
pas bien --> while poslasx<=640 do  
 
je t'avais indiqué -> if poslasx<=640 then
 
tu ne dois avoir qu'une seule boucle, celle du programme principal et à chaque tour dans cette boucle tu dois :
 
1. tester les touches
2. déplacer ton robot  
3. déplacer ton laser s'il existe

Reply

Marsh Posté le 07-04-2002 à 22:44:21    

hum, donc en fait il est impossible de déplacer le robot en même temps que le laser  :cry:
 
Ps : sommes-nous les seuls à programmer (pour toi) et essayer de programmer (pour moi) en pascal ?  :ouch:  :sarcastic:

 

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

Reply

Marsh Posté le 08-04-2002 à 07:57:44    

mais non c'est pas impossible..., relis ce que je dis... :D

Reply

Marsh Posté le 08-04-2002 à 14:23:25    

rectification : "hum, donc en fait il est impossible de déplacer le robot en même temps que le laser sans avoir à appuyer sur une touche"
 
Je m'explique :
 
tu ne dois avoir qu'une seule boucle, celle du programme principal et à chaque tour dans cette boucle tu dois :
 
1) tester les touches
2) déplacer le robot
3) déplacer le laser si il existe
 
Tester les touches implique d'utiliser la fonction readkey or cette fonction attends qu'une touche soit pressée pour que le programme continue donc ....  :cry:
A moins qu'une subtilité m'échappe  :sarcastic:

Reply

Marsh Posté le 08-04-2002 à 22:18:00    

Ca y est c bon g bidouillé un peu et ça marche.
 
En tout cas je te remercie Taureau de t'être penché sur mon cas :love:

Reply

Sujets relatifs:

Leave a Replay

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