Thema: Delphi Bricks Kollision

Einzelnen Beitrag anzeigen

Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#1

Bricks Kollision

  Alt 3. Feb 2007, 14:04
Hi!

hab mal ne frage zu nem spiel das ich grade schreibe... es handelt sich um die Kollisionsabfrage zwischen einem ball und kleinen rechtecken.(wers nich kennt, das spiel hat das ziel alle rechtecke abzuschießen um ins nächste level zu kommen) wenn ich aber jetz für jedes rechteck einzeln überprüfe ob das object "ball"(ein quadrat) über meinem rechteck ist, passiert es das der ball zu schnell ist, d. h. das er durch das rechteck durchfliegt bevor das spiel merkt das der ball eig kollidiert. kann ich die kollision irgendwie anders lösen?
hier ein code-Schnipsel:
Delphi-Quellcode:
 //Kollision mit Bricks
  for j := 1 to NumBricks do
  begin
    If Brick_Kollision[j] = true
    Then
    begin
      //linke Seite
      If (Ball.Position.X+Ball.Size.X/2+6>=Brick[j].Obj.Position.X-Brick[j].Obj.Size.X/2) and (Ball.Position.X+Ball.Size.X/2+6<=Brick[j].Obj.Position.X-Brick[j].Obj.Size.X/2)
      Then
        If (Ball.Position.Y-Ball.Size.Y/2 <= Brick[j].Obj.Position.Y-Brick[j].Obj.Size.Y/2+2) and (Ball.Position.Y+Ball.Size.Y/2 >=Brick[j].Obj.Position.Y+Brick[j].Obj.Size.Y/2-2)
        Then
        begin
          DirX_b := -DirX_b;
          Brick_Kollision[j] := false;
          Brick[j].Obj.Visible := false;
        end;

      //rechte Seite
      If (Ball.Position.X-Ball.Size.X/2-6<=Brick[j].Obj.Position.X+Brick[j].Obj.Size.X/2) and (Ball.Position.X-Ball.Size.X/2-6>=Brick[j].Obj.Position.X+Brick[j].Obj.Size.X/2)
      Then
        If (Ball.Position.Y-Ball.Size.Y/2 <= Brick[j].Obj.Position.Y-Brick[j].Obj.Size.Y/2+2) and (Ball.Position.Y+Ball.Size.Y/2 >=Brick[j].Obj.Position.Y+Brick[j].Obj.Size.Y/2-2)
        Then
        begin
          DirX_b := -DirX_b;
          Brick_Kollision[j] := false;
          Brick[j].Obj.Visible := false;
        end;

      //Seite oben
      If (Ball.Position.Y+Ball.Size.Y/2+6>=Brick[j].Obj.Position.Y-Brick[j].Obj.Size.Y/2) and (Ball.Position.Y+Ball.Size.Y/2-6<=Brick[j].Obj.Position.Y-Brick[j].Obj.Size.Y/2)
      Then
        If (Ball.Position.X+Ball.Size.X/2 >= Brick[j].Obj.Position.X-Brick[j].Obj.Size.X/2) and (Ball.Position.X-Ball.Size.X/2 <Brick[j].Obj.Position.X+Brick[j].Obj.Size.X/2)
        Then
        begin
          DirY_b := -DirY_b;
          Brick_Kollision[j] := false;
          Brick[j].Obj.Visible := false;
        end;

      //Seite unten
      If (Ball.Position.Y-Ball.Size.Y/2-6<=Brick[j].Obj.Position.Y+Brick[j].Obj.Size.Y/2) and (Ball.Position.Y-Ball.Size.Y/2-6>=Brick[j].Obj.Position.Y+Brick[j].Obj.Size.Y/2)
      Then
        If (Ball.Position.X+Ball.Size.X/2 > Brick[j].Obj.Position.X-Brick[j].Obj.Size.X/2) and (Ball.Position.X-Ball.Size.X/2 <Brick[j].Obj.Position.X+Brick[j].Obj.Size.X/2)
        Then
        begin
          DirY_b := -DirY_b;
          Brick_Kollision[j] := false;
          Brick[j].Obj.Visible := false;
        end;
    end;
kann sein das ich hier un da ein paar zahlen vertauscht hab, hab nämlich schon ziemlich viel rumprobiert...
vielen dank schonmal!

Fabi
Fabian E.
  Mit Zitat antworten Zitat