Home » Tipps & Tricks » Grafik » Sonstiges » Feststellen, ob zwei Rechtecke kollidieren

Feststellen, ob zwei Rechtecke kollidieren

Spiele wie z.B. Tetris oder Pong müssen feststellen, ob und wann zwei Rechtecke kollidieren. Generell müssen oft bei Spielen Kollisionserkennungen vorgenommen werden, um der physikalischen Realität näher zu kommen. Die Kollisionserkennung anhand Rechtecke ist aber nur die simpelste Form – komplizierter wird es allerdings, falls Kollisionen zweier unregelmäßiger Flächen bestimmt oder vorhergesagt werden sollen.

Um festzustellen, ob zwei Rechtecke kollidieren, muss geprüft werden, ob sie sich überschneiden. Dazu müssen einfach die Koordinaten der Rechtecke miteinander verglichen werden:

function IsCollision (Rect1, Rect2: TRect): Boolean; 
begin 
  Result := (Rect1.Right > Rect2.Left) and 
            (Rect2.Right > Rect1.Left) and 
            (Rect1.Bottom > Rect2.Top) and 
            (Rect2.Bottom > Rect1.Top); 
end;

Wenn jetzt zum Beispiel festgestellt werden soll, ob sich zwei Steuerelemente überschneiden, kann dies so getan werden:

if IsCollision(Edit1.BoundsRect, Button1.BoundsRect) then  
  ShowMessage('Kollision');

Damit kann beispielsweise überprüft werden, ob wirklich beide Komponenten lesbar sind.
Die Eigenschaft BoundsRect gibt die Grenzen der Komponente als Rechteck an. Jede von TControl abgeleitete Klasse erbt diese Eigenschaft automatisch, also auch die Klasse TEdit oder TButton.