Bonjour,


Je m'entraîne un peu au développement de jeux en Delphi. Pour l'instant, j'ai pris quelque chose : des balles dans un rectangle qui rebondissent et s'entrechoquent entre elles

Comment bien géré les collisions ? pour l'instant je fais un truc du genre SI positoin bord haut gauche de la balle < position du bord haut-gauche de la fenêtre ALORS on inverse la vitesse (vitesse = -vitesse) etc...

Y a-t-il une méthode plus souple par exemple si on position un objet dans la fenêtre genre un mur qui aura une position la balle rebondiraient dessus comme sur les bords ?

Sinon je veux créer une classe TBalle pour que se soit beacoup plus souple mais je sé pas trop comment l'implémenter. Comment géré les collisions entre balles ?

JE sais sa fait beacoup de question mais ce serait pour me guider un peu déjà rien qu'au niveau de la gestion de la collision avec les bords de la fenetre avec une seule balle ce serait déjà pas mal

voila déjà ce que j'ai fait

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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, pngimage, StdCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure Refresh;
  end;
 
var
  Form1: TForm1;
 
  BallPos,           // Position
  BallSpeed : TPoint;   // Vitesse
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Refresh;
begin
  Image1.Left:=BallPos.X;   // On position la balle à l'éran suivant ses coordonnées
  Image1.Top:=BallPos.Y;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered:=True;
  Randomize;
 
  BallPos.X:=Trunc(Random(ClientWidth-Image1.Width));   // Position aléatoire sur l'écran
  BallPos.Y:=Trunc(Random(ClientHeight-Image1.Height));
  Refresh; // On dessine la balle
 
  BallSpeed.X:=Trunc(Random(20))-10; // Vitesse aléatoire entre -10 et 10
  BallSpeed.Y:=Trunc(Random(20))-10;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if ((BallPos.X+BallSpeed.X<=0) or ((BallPos.X+BallSpeed.X+Image1.Width)>=ClientWidth)) then BallSpeed.X:=-BallSpeed.X
  else BallPos.X:=BallPos.X+BallSpeed.X;    // Si la balle touche le bord gauche ou le bord droit, on inverse la vitesse horizontale
 
  if ((BallPos.Y+BallSpeed.Y<=0) or ((BallPos.Y+BallSpeed.Y+Image1.Height)>=ClientHeight)) then BallSpeed.Y:=-BallSpeed.Y
  else BallPos.Y:=BallPos.Y+BallSpeed.Y;   // Si la balle touche le bord haut ou le bord bas, on inverse la vitesse verticale
 
  Refresh;  // On dessine la balle
end;
 
 
end.
merci d'avance