![]() |
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. |
Re: Ball abprallen
Delphi-Quellcode:
edit: GRAUENHAFTE Einrückung... :kotz:
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; 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; |
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
|
Re: Ball abprallen
klar, der Ball soll ja wieder langsamer werden und dann irgendwann wieder fallen?
|
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.
|
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; |
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. |
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} |
Re: Ball abprallen
was heisst "nicht so realistisch"?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz