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.