Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1098 connectés 

  FORUM HardWare.fr
  Programmation

  Pascal : timer + overflow error

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pascal : timer + overflow error

n°120450
bartus
^_^
Posté le 02-04-2002 à 18:11:32  profilanswer
 

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]

mood
Publicité
Posté le 02-04-2002 à 18:11:32  profilanswer
 

n°120466
bartus
^_^
Posté le 02-04-2002 à 19:00:31  profilanswer
 

:(

n°120499
bartus
^_^
Posté le 02-04-2002 à 21:00:51  profilanswer
 

[:tomilou]

n°120629
bartus
^_^
Posté le 03-04-2002 à 01:58:25  profilanswer
 

ca ne vous inspire guère :heink:

 

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

n°120816
bartus
^_^
Posté le 03-04-2002 à 14:50:02  profilanswer
 

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

n°120840
taureau
Posté le 03-04-2002 à 15:15:17  profilanswer
 

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;

n°120935
bartus
^_^
Posté le 03-04-2002 à 17:16:32  profilanswer
 

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:

n°121194
bartus
^_^
Posté le 04-04-2002 à 01:07:57  profilanswer
 

En fait nan ca change que dale...

n°121211
taureau
Posté le 04-04-2002 à 08:25:37  profilanswer
 

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

n°121659
bartus
^_^
Posté le 05-04-2002 à 02:39:34  profilanswer
 

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]

mood
Publicité
Posté le 05-04-2002 à 02:39:34  profilanswer
 

n°121664
taureau
Posté le 05-04-2002 à 07:21:57  profilanswer
 

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

n°123003
bartus
^_^
Posté le 07-04-2002 à 22:44:21  profilanswer
 

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]

n°123031
taureau
Posté le 08-04-2002 à 07:57:44  profilanswer
 

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

n°123201
bartus
^_^
Posté le 08-04-2002 à 14:23:25  profilanswer
 

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:

n°123391
bartus
^_^
Posté le 08-04-2002 à 22:18:00  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Pascal : timer + overflow error

 

Sujets relatifs
installation de turbo pascal mal passée[Open GL] travailler en Pascal, en C ou en C++, ça change qq chose ?
TURBO PASCAL --> file graph.tpu not foundCréer un défragmenteur DOS ou Linux en C++ Pascal C etc...
[C++ Builder] Win32 Error. Code : 1410.La classe existe déjàtri par paire(pascal)
Pascal : faire un timer[Pascal + openGL] Comment on fait ?
[Pascal/Delphi] déclarer des nouvelles variables dans un while 
Plus de sujets relatifs à : Pascal : timer + overflow error


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR