DelphiX-Tutorial für Anfänger

Ursprünglich erstellt von MiGa Mail Homepage (Danke!!)
Design-Anpassung und Veränderung von Simon

 

Kapitel 6

Ein großer Teil des Quellcodes wurde schon im vorherigen Kapitel verwendet und wird in diesem Kapitel ergänzt.

Kollision zwischen Sprites

In diesem Kapitel werde ich zeigen, wie einfach es ist, festzustellen, ob zwei Sprites gegeneinander gestoßen sind.

Zuerst werden wir in unser Beispiel vom vorherigen Kapitel noch ein Bild einfügen. Wir laden ein zweites Bild in unsere DXImageList Komponente und geben ihm den Namen "Stein". Dann erzeugen wir unser zweites Bild auf unsere DXDraw Oberfläche:

TAnimation = class(TImageSprite)
public
  procedure DoMove(MoveCount: Integer); override; {war schon da}
  constructor Create(AParent: TSprite ); override; {war schon da}
  procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
end;

TGegenstand = class(TImageSprite)
public
constructor Create(AParent: TSprite ); override;
end;

var
  Form1: TForm1;
  Animation:tanimation; {war schon da}
  Gegen:tgegenstand;
  implementation


constructor TGegenstand.Create(AParent: TSprite );
begin
  inherited Create(AParent);
  Image:=Form1.DXImageList1.Items.Find('Stein');
  Width := Image.Width;
  Height := Image. Height;
  Visible:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TAnimation.Create(DXSpriteEngine1.Engine) do {war schon da}
    begin
      x:=0;
      y:=0;
    end;
  with TGegenstand.Create(DXSpriteEngine1.Engine) do
    begin
      x:=40;
      y:=40;
    end;
end;

Wie vielleicht schon gesehen wurde, haben wir eine neue Prozedur: DoCollision
Die sollte wie folgt aussehen:

procedure TAnimation.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if sprite is TGegenstand then
    begin
      beep;
      dead;
    end;
end;

Mit Sprite kann man überprüfen gegen wen TAnimation gestoßen ist. In diesem Beispiel also gegen unser zweites Bild.
Mit dead wird TAnimation gelöscht.

Damit jedes mal auf Kollision überprüft wird, wenn sich unser Sprite bewegt, müssen wir in die Move Prozedur folgendes einfügen:

procedure TAnimation.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  If isUp in Form1.DXInput1.States Then
    Y := Y -10;
  If isDown in Form1.DXInput1.States Then
    Y := Y + 10;
  If isLeft in Form1.DXInput1.States Then
    X := X -10;
  If isRight in Form1.DXInput1.States Then
    X := X +10;
  AnimCount := 5;
  AnimLooped := True;
  AnimSpeed := 20/1000;
  AnimStart := 0;

  Collision; {das muss ergänzt werden}
end;

Das war's dann wieder mal. Per F9 kann sich wieder die vollendete Arbeit angucken.

 

<<Vorheriges Kapitel>>   <<Nächstes Kapitel>>