Bonjour à tous,

J'essaie de coder une sorte de "Angry Birds". Je suis en train, en ce moment, de réaliser la partie projectile du projet. Autrement dit, j'aimerais pour l'instant simuler un point qui a une trajectoire parabolique et qui rebondit sur les parois de la fenêtre.
D'après ce que j'ai lu, le plus simple pour réaliser des jeux utilisant des équations physiques, est de "simplifier" ces équations. Ainsi, elles ne mettent pas en jeu le temps, mais seulement une approximation de l'évolution de la position et de la vitesse selon les deux axes du repère.

J'ai créé une classe Cprojectile caractérisant le projectile. Elle est définie comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Type Cprojectile = class (CMObject)
fspeedy:integer; 
fspeedx:integer;
 
constructor create(aao:TStringList; awinw,awinh,apx,apy,aspeedx,aspeedy:integer;aangle:real);
procedure drawYourself(canv:TCanvas); override;
procedure move(); override;
fspeedy est la vitesse selon l'axe y et fspeedx est la vitesse selon l'axe x.

Comme vous pouvez le voir cette classe hérite d'une classe mère :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
type CMObject = class
 
     // position de l'objet
     fpx,fpy:integer;
 
     // Taille de la fenêtre
     fwinw,fwinh:integer;
Le mouvement du projectile est réalisé par la procédure suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure Cprojectile.move();
begin
      // gravité agissant sur la vitesse
     fspeedy := fspeedy + ACC;
     fspeedx := fspeedx;
 
     // mouvement de l'objet
     fpy := fpy + fspeedy;
     fpx := fpy + fspeedx;
 
     // rebonds
 
     if (fpy>=fwinh) or (fpy<=0) then fspeedy := -1*fspeedy;
     if (fpx<=0) or (fpx>=fwinw) then fspeedx:= -1*fspeedx;
 
end;
Enfin, la procédure suivante "dessine" le projectile :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
procedure Cprojectile.drawYourself(canv:TCanvas);
begin
     canv.Brush.color := clred;
     canv.Pen.color := clYellow;
     canv.rectangle(fpx,fpy,fpx+5,fpy+5);
end;
Je sais que ce n'est pas très évident de trouver ce qui cloche en ayant seulement une partie du code, mais bon... Ce dernier semble-t-il correct ? Lorsque je compile, les rebonds ne fonctionnent pas; le projectile reste bloqué lors d'un rebond.

Merci d'avance pour vos lumières.