Einzelnen Beitrag anzeigen

.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#9

Re: Pong - Problem bei der Ballkollision

  Alt 9. Dez 2006, 15:46
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
  Mit Zitat antworten Zitat