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 :
fspeedy est la vitesse selon l'axe y et fspeedx est la vitesse selon l'axe x.
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;
Comme vous pouvez le voir cette classe hérite d'une classe mère :
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 type CMObject = class // position de l'objet fpx,fpy:integer; // Taille de la fenêtre fwinw,fwinh:integer;
Enfin, la procédure suivante "dessine" le projectile :
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;
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.
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;
Merci d'avance pour vos lumières.
Partager