Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Ball abprallen (https://www.delphipraxis.net/57511-ball-abprallen.html)

furby 22. Nov 2005 13:52


Ball abprallen
 
hiho ich habe einen ball erstellt der in einem image fallengelassen werden soll und dann ander unteren kante abprallen soll... dannach soll er wenn er die ausgangshöhe ( mitte des image) wieder herunterfallen) das ganze wird durch einen timer gemacht (interval 3). mein problem ist, dass ich nicht weiß, wie ich das machen soll, da es mit if abfrage nicht so ohne weiteres geht. vielleicht weiß ja jemand wie man so einen springenden ball proggen kann.

Delphi-Quellcode:
TBall = class
    Farbe:TColor;
    Radius:Integer;
    Ortx,Orty:Integer;
    vx,vy:Real;

    procedure zeichnen;
    procedure fallenlassen;
    procedure werfen;
    procedure rollen;
    procedure initialisieren;
   end;
var
  FormBall: TFormBall;
  DemoBall:TBall;

implementation

{$R *.DFM}
(*********************************************************)
  procedure TBall.zeichnen;
  begin
  with FormBall.ImageSpielfeld.Canvas do
       begin
       Brush.Color := Farbe;
       Ellipse(Ortx-Radius,Orty-Radius,
               Ortx+Radius,Orty+Radius);
       pen.color := clblack;
       end;
  end;
(*********************************************************)
  procedure TBall.fallenlassen;
  begin
   FormBall.TimerBewegung.Enabled:=true;
  end;
(*********************************************************)
  procedure TBall.werfen;
  begin
  end;
(*********************************************************)
  procedure TBall.rollen;
  begin
  end;
(*********************************************************)
  procedure TBall.initialisieren;
  begin
  Radius:=10;
  Farbe:=clred;
  Ortx:=FormBall.ImageSpielfeld.Width div 2;
  Orty:=FormBall.ImageSpielfeld.Height div 2;
  vx:=0;
  vy:=0;
  end;
(*********************************************************)
procedure TFormBall.FormCreate(Sender: TObject);
begin
DemoBall:=TBall.create;
DemoBall.initialisieren;
end;
(*********************************************************)
procedure TFormBall.ButtonSpielfeldClick(Sender: TObject);
begin
 FormBall.ImageSpielfeld.Canvas.Brush.Color:=clwhite;
 FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
 timerbewegung.enabled := false;
  with DemoBall do
  begin
    farbe := clwhite;
    zeichnen;
    initialisieren; //Ball wieder auf Ursprung zurücksetzten
  end;
end;
(*********************************************************)
procedure TFormBall.ButtonZeichnenClick(Sender: TObject);
begin
DemoBall.zeichnen;
end;
(*********************************************************)
procedure TFormBall.ButtonFallenlassenClick(Sender: TObject);
begin
DemoBall.fallenlassen;
end;
(*********************************************************)
procedure TFormBall.TimerBewegungTimer(Sender: TObject);
begin
  with DemoBall do
  begin
    if Orty + Radius < FormBall.ImageSpielfeld.Height
    then begin
           FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
           farbe := clwhite; //Löschen
           zeichnen;        //Übermalen
           farbe := clred;  //Farbe zurücksetzen
           FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;

           vy:=vy+1;      {Erhöhung von vy, wobei eine Einheit
           willkürlich angenommen wurde}
           Orty:=Orty+round(vy*TimerBewegung.Interval);
           {neuerOrt:=alterOrt + Wegzunahme}
           zeichnen;
         end;

       if Orty + Radius > FormBall.ImageSpielfeld.Height
       then begin
                FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
                FormBall.ImageSpielfeld.Canvas.Brush.Color:=clwhite;
                FormBall.ImageSpielfeld.Canvas.ellipse(Ortx-Radius,Orty-Radius,Ortx+Radius,Orty+Radius);
                FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;

                vy:=vy+1;      {Erhöhung von vy, wobei eine Einheit
                willkürlich angenommen wurde}
                Orty:=Orty-round(vy*TimerBewegung.Interval);
                {neuerOrt:=alterOrt + Wegzunahme}
                zeichnen;

                end;
  end;{with do}
end;
(*********************************************************)
end.

ichbins 22. Nov 2005 14:08

Re: Ball abprallen
 
Delphi-Quellcode:
procedure TFormBall.TimerBewegungTimer(Sender: TObject);
begin
  with DemoBall do
  begin
    if Orty + Radius < FormBall.ImageSpielfeld.Height
    then begin
           FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
           farbe := clwhite; //Löschen
           zeichnen;        //Übermalen
           farbe := clred;  //Farbe zurücksetzen
           FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;

           vy:=vy+1;      {Erhöhung von vy, wobei eine Einheit
           willkürlich angenommen wurde}
           Orty:=Orty+round(vy*TimerBewegung.Interval);
           {neuerOrt:=alterOrt + Wegzunahme}
           zeichnen;
         end;
                     ///hier gehört ein GRÖSSERGLEICH hin.
       if Orty + Radius >= FormBall.ImageSpielfeld.Height
       then begin

                FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
                FormBall.ImageSpielfeld.Canvas.Brush.Color:=clwhite;
                FormBall.ImageSpielfeld.Canvas.ellipse(Ortx-Radius,Orty-Radius,Ortx+Radius,Orty+Radius);
                FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;
                //Wenn du schon am Boden angekommen bist, willst du nicht mehr beschleunigen.
                {vy:=vy+1;}
                ////////////////////so, jetzt muss der Ball ja abprallen. Das machst du so:
                vy:=-vy; //die Y-Geschwindigkeit muss ja umgekehrt werden.
                zeichnen;

                end;
  end;{with do}
end;
edit: GRAUENHAFTE Einrückung... :kotz:

außerdem sieht mir das ziemlich nach Info-Hausaufgabe aus. Nur da wird alles so kleinlichst in Klässchen aufgeteilt und benannt.

Bei mir würde das soaussehen:
Delphi-Quellcode:
procedure TFormBall.TimerBewegungTimer(Sender: TObject);
begin
  with Ball do
  begin
    if Orty + Radius < Form1.Image1.Height
    then begin
      Form1.Image1.Canvas.pen.Color:=clwhite;
      farbe := clwhite;
      zeichnen;
      farbe := clred;
      Form1.Image1.Canvas.pen.Color:=clblack;
      vy:=vy+1;
      zeichnen;
    end else begin
      Form1.Image1.Canvas.pen.Color:=clwhite;
      Form1.Image1.Canvas.Brush.Color:=clwhite;
      Form1.Image1.Canvas.ellipse(Ortx-Radius,Orty-Radius,Ortx+Radius,Orty+Radius);
      Form1.Image1.Canvas.pen.Color:=clblack;}
      zeichnen;
      vy:=-vy;
      zeichnen;
    end;
  end;
end;

furby 22. Nov 2005 14:32

Re: Ball abprallen
 
so geht das aber nicht, da der ball auch wenn er die zweite bedingung also ypos+radius > height erfüllt, dann zwar wieder steigt. sich dann aber praktische beim steigen die erste auch wieder efüllt und dadurch langsamer steigt und flimmmert

ichbins 22. Nov 2005 14:37

Re: Ball abprallen
 
klar, der Ball soll ja wieder langsamer werden und dann irgendwann wieder fallen?

furby 22. Nov 2005 14:39

Re: Ball abprallen
 
stimmt nur jetzt müsste ich praktisch einen grenzwert einbauen... am besten die startposition. des balls von wo er fallengelassen wurde. weißt du, wie man das lösen kann, dass er dann immer weniger abprallt und irgendwann liegen bleibt.

furby 22. Nov 2005 14:42

Re: Ball abprallen
 
so habs ichs jetzt erstma gemacht, nach deinem code

Delphi-Quellcode:
procedure TFormBall.TimerBewegungTimer(Sender: TObject);
begin
  with DemoBall do
  begin
   if Orty + Radius < FormBall.ImageSpielfeld.Height
   then begin
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
          farbe := clwhite;
          zeichnen;
          farbe := clred;
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;
          Orty:=Orty+round(vy*TimerBewegung.Interval);
          vy:=vy+1;
          zeichnen;
        end
   else begin
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
          FormBall.ImageSpielfeld.Canvas.Brush.Color:=clwhite;
          FormBall.ImageSpielfeld.Canvas.ellipse(Ortx-Radius,Orty-Radius,Ortx+Radius,Orty+Radius);
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;
          Orty:=Orty-round(vy*TimerBewegung.Interval);
          zeichnen;
          vy:=-vy;
          zeichnen;
        end;
   end;{with do}
end;

ichbins 22. Nov 2005 14:42

Re: Ball abprallen
 
Der Grenzwert ist bereits die Startposition. Du kannst einbauen dass er langsamer wird, indem du (wie in Wirklichkeit) beim Abprall die Geschwindigkeit nicht ganz v:=-v machst, sondern von der v zusätzlich noch ein bisschen wegnimmst.

Delphi-Quellcode:
vy:=-vy+1;
if v>=0 then v:=0; //Falls die Geschwindigkeit bereits ins negative abgebremst ist, v:=0.

furby 22. Nov 2005 15:00

Re: Ball abprallen
 
soooo habs jetzt so gemacht... hab das noch ein wenig eingegrenzt, damit der ball nicht höher springt, nur wird er dann nich so wirklich realistscih langsamer :) weiß jemand ne antwort?
Delphi-Quellcode:
procedure TFormBall.TimerBewegungTimer(Sender: TObject);
begin
  with DemoBall do
  begin
   if (Orty + Radius < FormBall.ImageSpielfeld.Height) and (Orty + Radius > FormBall.ImageSpielfeld.Height div 2)
   then begin
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
          farbe := clwhite;
          zeichnen;
          farbe := clred;
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;
          Orty:=Orty+round(vy*TimerBewegung.Interval);
          vy:=vy+1;
          zeichnen;
        end
   else begin
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clwhite;
          FormBall.ImageSpielfeld.Canvas.Brush.Color:=clwhite;
          FormBall.ImageSpielfeld.Canvas.ellipse(Ortx-Radius,Orty-Radius,Ortx+Radius,Orty+Radius);
          FormBall.ImageSpielfeld.Canvas.pen.Color:=clblack;
          Orty:=Orty-round(vy*TimerBewegung.Interval);
          zeichnen;
          vy:=-vy;
          if vy>=0 then vy:=0;
          zeichnen;

        end;
   end;{with do}

ichbins 22. Nov 2005 15:40

Re: Ball abprallen
 
was heisst "nicht so realistisch"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz