Pascal : timer + overflow error - Programmation
Marsh Posté le 03-04-2002 à 01:58:25
ca ne vous inspire guère
[jfdsdjhfuetppo]--Message édité par bartus--[/jfdsdjhfuetppo]
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;
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
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 +
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
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....
Avis aux bonnes âmes pouvant m'aider pour relayer le pauvre taureau à qui je donne bien du mal
[jfdsdjhfuetppo]--Message édité par bartus--[/jfdsdjhfuetppo]
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
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
Ps : sommes-nous les seuls à programmer (pour toi) et essayer de programmer (pour moi) en pascal ?
[jfdsdjhfuetppo]--Message édité par bartus--[/jfdsdjhfuetppo]
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 ....
A moins qu'une subtilité m'échappe
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
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 ) 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
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]