AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ball abprallen

Ein Thema von furby · begonnen am 22. Nov 2005 · letzter Beitrag vom 22. Nov 2005
Antwort Antwort
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#1

Ball abprallen

  Alt 22. Nov 2005, 13:52
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.
Fabian K
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Ball abprallen

  Alt 22. Nov 2005, 14:08
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...

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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Ball abprallen

  Alt 22. Nov 2005, 14:32
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
Fabian K
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Ball abprallen

  Alt 22. Nov 2005, 14:37
klar, der Ball soll ja wieder langsamer werden und dann irgendwann wieder fallen?
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Ball abprallen

  Alt 22. Nov 2005, 14:39
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.
Fabian K
  Mit Zitat antworten Zitat
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Ball abprallen

  Alt 22. Nov 2005, 14:42
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;
Fabian K
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Ball abprallen

  Alt 22. Nov 2005, 14:42
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.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von furby
furby

Registriert seit: 15. Sep 2005
Ort: Braunschweig
37 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Ball abprallen

  Alt 22. Nov 2005, 15:00
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}
Fabian K
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Ball abprallen

  Alt 22. Nov 2005, 15:40
was heisst "nicht so realistisch"?
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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