Aso, dass hab ich falsch erklaert mit dem rechts und links, ich meinte wenn er weiter rechts auf dem schlaeger aufprallt (vom schlaeger aus gesehn) also weiter unten/oben...
Dass im Quelltext vieles noch nicht stimmte hatte ich ja auch erwaehnt, hab ihn nochmal überarbeitet aber das funzt trotzdem noch nich so ganz...
Delphi-Quellcode:
//----------------------------------
//BALL BERECHNEN
//----------------------------------
procedure TForm1.Ball_berechnen;
begin
Ballposition := Point(Ballposition.X + Ballrichtung.X, Ballposition.Y + Ballrichtung.Y);
Kollision;
end;
//----------------------------------
//----------------------------------
//KOLLISION
//----------------------------------
procedure TForm1.Kollision;
var
i: Integer;
begin
//Wand angestoßen?
if Ballposition.Y <= 0 then begin
Ballposition.Y := 0;
Ballrichtung.Y := -Ballrichtung.Y;
end;
if Ballposition.Y + Ball.Height >= Hoehe then begin
Ballposition.Y := Hoehe - Ball.Height;
Ballrichtung.Y := -Ballrichtung.Y;
end;
//Spieler1 angestoßen?
//Vorne angestoßen?
if (Ballposition.Y + Ball.Height >= Spielerposition[1].Y) AND (Ballposition.Y <= Spielerposition[1].Y + Spieler.Height) then
if Ballposition.X <= Spielerposition[1].X + Spieler.Width then begin
Ballposition.X := Spielerposition[1].X + Spieler.Width;
Ballrichtung.X := -Ballrichtung.X;
end
else
//Unten/Oben angestoßen?
if (Ballposition.X <= Spielerposition[1].X + Spieler.Width) AND (Ballposition.X + Ball.Width >= Spielerposition[1].X) then begin
if (Ballposition.Y + Ball.Height >= Spielerposition[1].Y) AND (Ballposition.Y + Ball.Height <= Spielerposition[1].Y + Spieler.Height div 2) then begin
Ballposition.Y := Spielerposition[1].Y - Ball.Height;
Ballrichtung.Y := -Ballrichtung.Y;
end;
if (Ballposition.Y <= Spielerposition[1].Y + Spieler.Height) AND (Ballposition.Y >= Spielerposition[1].Y + Spieler.Height div 2) then begin
Ballposition.Y := Spielerposition[1].Y + Spieler.Height;
Ballrichtung.Y := -Ballrichtung.Y;
end;
end;
//Spieler2 angestoßen?
//Vorne angestoßen?
if (Ballposition.Y + Ball.Height >= Spielerposition[2].Y) AND (Ballposition.Y <= Spielerposition[2].Y + Spieler.Height) then
if Ballposition.X + Ball.Width >= Spielerposition[2].X then begin
Ballposition.X := Spielerposition[2].X - Spieler.Width;
Ballrichtung.X := -Ballrichtung.X;
end
else
//Unten/Oben angestoßen?
if (Ballposition.X + Ball.Width >= Spielerposition[2].X) AND (Ballposition.X <= Spielerposition[1].X + Spieler.Width) then begin
if (Ballposition.Y + Ball.Height >= Spielerposition[2].Y) AND (Ballposition.Y + Ball.Height <= Spielerposition[1].Y + Spieler.Height div 2) then begin
Ballposition.Y := Spielerposition[2].Y - Ball.Height;
Ballrichtung.Y := -Ballrichtung.Y;
end;
if (Ballposition.Y <= Spielerposition[2].Y + Spieler.Height) AND (Ballposition.Y >= Spielerposition[1].Y + Spieler.Height div 2) then begin
Ballposition.Y := Spielerposition[2].Y + Spieler.Height;
Ballrichtung.Y := -Ballrichtung.Y;
end;
end;
//Gepunktet?
//Sp1
if Ballposition.X <= 0 then begin
Timer1.Enabled := False;
Button1.Enabled := True;
end;
//Sp2
if Ballposition.X + Ball.Width >= Breite then begin
Timer1.Enabled := False;
Button1.Enabled := True;
end;
end;
//----------------------------------
Kann man die Kollision denn eleganter abfragen? Denn nebenbei is der Ball ja rund, und ich habe aber ein eckiges Bild, dh die Abfrage ist nicht wirklich genau!
Für die Sache mit dem aufs Bitmap zeichnen:
Ich hab den Code jetzt nichtmehr, weil ich ihn wieder gelöscht habe als es nicht funktioniert hat, damit ich das Programm weiter benutzen kann.
Also immer wenn ich das Programm gestartet habe dann hat er einfach alles schwarz gemalt und is abgestuertzt.
Ich hab das ungefaehr so versucht umzusetzen:
Delphi-Quellcode:
Spielfeldpuffer := TBitmap.Create;
Spielfeldpuffer.Width := Breite;
Spielfeldpuffer.Height := Hoehe;
//dann in der onPaint Funktion die Spieler und den Ball mittels Draw auf den Canvas des Bilds gemalt //(das war sicher einer der Fehler) ungefaehr so
Spielfeldpuffer.Canvas.Draw(Spielerposition[1].X, Spielerposition[1].Y, Spieler);
//und dann in die Paintbox damit
Spielfeld.Canvas.Draw(0, 0, Spielfeldpuffer);
Denke mal da warn mehrere Fehlre drin!
MfG
Edit: (Kollision ueberarbeitet)
Bei der Kollision is mir noch was aufgefallen...die beiden Prüfungen ob oben oder vorne am Schlaeger angestoßen wird ueberpruefen beide nahezu dasselbe, deswegen aendert der Ball abundzu plötzlich ganz komisch die Richtung...hab aber keine Ahnung iwe ich nun unterscheiden soll ob der Ball von oben auf den Schlaeger oder von der Seite da drauf prallt (hoffe ich versteht was ich meine)
O
-
-
-
-
-
oder
-
-
- O
-
-
Hoffe das hilft etwas zum Verstaendnis