![]() |
TFahrzeug - Eine Fahrzeug-Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
So, da ich es nun (eigentlich schon länger) fertiggestellt habe, wollte ich euch mal zeigen wobei ihr mir geholfen habt.
Hier sind die Links zu den beiden Stellen wo mir geholfen wurde. Einmal beim ![]() ![]() ![]() ![]() Es ist ein kleiner Test zur Objektorientierten Programmierung. Ich habe mir eine Klasse Fahrzeug erstellt und davon eine Klasse Roboter abgeleitet, welchen man nun über eine Form fahren lassen kann. Source und die Test-Exe sind im Anhang. Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Hallo Willy,
sehr schön gelöst! :thumb: Gruß Hawkeye |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Hi,
ich kann mich anschließen: Wunderschön gelöst und sauber formatierter Code zeigen jedem OOP-Einsteiger (oder auch fortgeschrittenen), wie man mit OOP umgeht. Sehr schön! |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Ich muss mich hier mal entschuldigen, ich hatte in meiner Auftählung glatt 2 Links unterschlagen, sie sind jetzt im ersten Beitrag ergänzt.
Und ich finde es toll dass es scheinbar praktisch ist. :spin: Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Schön gemacht ;)
Noch ein kleiner Tipp, damit der Roboter nicht so flackert: Arbeite mit einem Buffer. D.h. du nimmst eine globale Variable vom Typ TCanvas. Dort zeichnest du dann deinen Roboter und seine Bewegungen rein. z.B. Im OnPaint-Event des Formulars kannst du dann immer CopyRect machen, d.h. du kopierst den Buffer in aufs Formular. |
Re: TFahrzeug - Eine Fahrzeug-Klasse
1. Frage dazu: Wie soll ich das dann mit den Drehungen realisieren, wenn dies ein Rechteck ist?
2. Frage: Wie stellt man das an? Ich habe noch nie mit Copyrect gearbeitet. Könntest du einen kleinen Beispielcode reinstellen? Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Du zeichnest doch momentan alles auf Form.Canvas.
Anstatt das zu machen, musst du eine globale Variable nehmen. z.B:
Delphi-Quellcode:
Die musst du natürlich z.B. ihm OnCreate-Ereignis des Formulars initialisieren:
var
fBuffer: TBitmap;
Delphi-Quellcode:
Im OnResize-Ereignis des Formulars muss folgender Code:
fBuffer := TBitmpa.Create; // nicht vergessen, beim Beenden fBuffer.Free auszuführen!
Delphi-Quellcode:
Nun zeichnest du nicht mehr auf Form.Canvas, sondern änderst alles so um, dass nur noch auf fBuffer.Canvas gezeichnet wird.
fBuffer.Width := Form.Width;
fBuffer.Height := Form.Height; Im OnPaint-Ereignis des Formulars:
Delphi-Quellcode:
Da das OnPaint nicht ständig aufgerufen wird (glaub ich, bin mir grad nicht sicher) müsstest du am Ende des Zeichnens (Roboter auf fBuffer.Canvas) noch folgenden Code ausführen:
Canvas.CopyRect(Rect(0,0,fBuffer.Width,fBuffer.Height), fBuffer.Canvas,
Rect(0,0,fBuffer.Width,fBuffer.Height));
Delphi-Quellcode:
Form.Invalidate;
|
Re: TFahrzeug - Eine Fahrzeug-Klasse
Danke, dann werde ich das mal einbauen.
Zitat:
Aber ich mache jetzt erstmal! Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Ich meinte das allgemein, dass onPaint vom Formular nicht ständig aufgerufen wird.
Das hatte jetzt keinen Bezug zu deinem Code ;) Wenn du schon so eine Refresh-Funktion drin hast, dann ist es ja gut ;) |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Ok, ich habe es jetzt eingefügt, ich zeige es lieber nochmal komplett mit Code, aber lasse die komplett unwichtigen Stellen heraus.
Delphi-Quellcode:
Das habe ich jetzt eben so geändert, aber jetzt bekomme ich kein Bild, es wird einfach keins angezeigt. :wall:
procedure TFahrzeug.refresh();
begin FForm.Refresh; fBuffer.FreeImage; end; procedure TFahrzeug.draw(); begin fBuffer.Canvas.Pixels[round(position.X), round(position.Y)] := clBlack; FForm.Canvas.CopyRect(Rect(0,0,fBuffer.Width,fBuffer.Height), fBuffer.Canvas, Rect(0,0,fBuffer.Width,fBuffer.Height)); end; constructor TFahrzeug.Create(form: TForm); begin fBuffer := TBitmap.Create; FForm := form; end; destructor TFahrzeug.Destroy; begin fBuffer.Free; inherited; end; procedure TFahrzeug.vtimerTimer(Sender: TObject); var newpos: TExtPoint; begin refresh; draw; end; Weißt du/wisst ihr woran das liegt? Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe auf die schnelle die entscheidenden Änderungen vorgenommen und es klappt.
Das einzige was nicht ganz klappt ist, dass der Roboter nicht vollständig gezeichnet wird. Da du da über dein Code selber besser Bescheid weißt, müsstest du das nur noch anpassen, dass es klappt. Ansonsten solltest du den Code jetzt von mir im Anhang nicht so lassen! Das ist absolut nicht gut gelöst, sondern nur die Schnelle, damit du siehst, dass es so machbar ist und es nicht mehr flackert. |
Re: TFahrzeug - Eine Fahrzeug-Klasse
So, ich habe e sjetzt geändert, aber irgendwie habe ich das Gefühl dass es jetzt noch mehr flackern würde als davor, und das mit 25Fps! :gruebel:
Egal...wird schon gehen! Neue Exe+Source im ersten Posting. Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
nicht schlecht was mir als erstes aufgefallen ist das du ein timer benutzt bei mir steigt da die cpu last immer auf 100% in abhänigkeit mit der Grafik progammierung.
nimm lieber das ein erreignis das immer wider kommmt z.b. onIdle ich glaube bei einem multimedia timer währe dies auch der fall. ich vermute draum flackert das auch so stark. |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Da ich davon nicht wirklich ne Ahnung habe...könntest du mir kurz erklären (ein bisschen Code oder etwas zum nachschlagen oder so) ... dann könnte ich das noch ändern. Schön ist es ja nicht, dass es so flackert :?
Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Zitat:
Und als "formatierter Code" würde ich es auch nicht bezeichnen. |
Re: TFahrzeug - Eine Fahrzeug-Klasse
kein problem.
schau dir das besagte ereignis an und kopiere einfach den teil aus dem Timer ereignis in diesen ereignis ein und stelle am anfang die varable done auf False mehr ist das nicht. such mal nach onIdle hier im Forum |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Liste der Anhänge anzeigen (Anzahl: 1)
ich weiß jetzt warum das so flackert du rufst im timer:refresh auf mach das mal rauß. und die 100% cpu last kommt von der Draw funktion. wie genau weiß ich noch nicht.
Ich weiß leider nicht meher wie die funtkion heißt aber es ein ersatzt für Pixels weil ich glaube das liegt dran.... also bei mir flackert es nicht mehr ich sende dir mal den geänderten qullcode mit ! |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Nun gut, flackern tuts jetzt nicht mehr, aber irgendwie sind es bei mir trotzdem 100% CPU-Auslastung.
Ich schau mir mal an was du verändert hast. @sniper_w: Ich hatte auch nicht das unter den Gesichtspunkt hereingestellt ein kleines Beispiel für OOP zu liefern, was am Betsen auch noch perfekt strukturiert ist usw, sondern ich wollte das ergebnis hier präsentieren wobei mir hier sehr gut geholfen wurde. Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
wie währes noch wenn prüfen würdes ob das fahrzeug am rand ist weil irenwann ist es auser reichweite...
eine prüfung ist nicht schwer z.b. könntes du es so wie lings und recht machen: if (x+speed)-fahrzeugbreite) >=0 then neue linke position // für lings if (x+speed)+fahrzeugbreite) <=Form1.withd then neue linke position // für rechts +speed ist die geschwindigkeit in der du das fahreug bewegt und so kannst du vorrauschauend prüfen ob eine collision mit der linken oder rechten seite stattfindet. müste funktion getestet habe ich es jetzt nicht. und die 100% cpu last kommt 100% von draw fuktion: pixel[x,y]:=clblack |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Die Abfrage ob er außerhalb des Bildes ist, die ist schon längst drin! Ich weiß nicht ob du das geschrieben hast ohne dir mein Programm anzugucken oder ob du es vergessen hast, auf jeden fall gibt es das schon längst :stupid:
Kennst du eine andere (bessere) Methode das zu umgehen? Flare |
Re: TFahrzeug - Eine Fahrzeug-Klasse
ist mir auch aufgefallen aber leider erst später.
also im moment kann ich dir leider nicht weiterhelfen. Ich weiß einfach nicht warum 100 cpu auslastung. ich habe das ja per onIdL gemacht aber da auch 100% hast du delphiX? vileicht mit dem dxTimer weil das ist ja ein multimedia timer. oder du machst es ganz anders: du zeichnes die grafik die du drehen möchtes einmal in eine TBitMap am anfang und die wird dann immer wieder neugezeichnet weiß du wie ich meine ? für die drehung gibt es hier zahlreiche beispiele nur du must 50% deines programmes umschreiben... |
Re: TFahrzeug - Eine Fahrzeug-Klasse
Da es in meinem Programm eher nicht um das perfomrante Zeichnen von Robotern geht übergehe ich das einfach mal :-D
Da es jetzt nicht mehr flimmert dürfte das jetzt erstmal reichen. Und da es OnIdle ist wird auch keine Performace von der CPU geklaut. Dann hängt zwar die Geschwindigkeit des Roboters vom PC ab, ist aber auch in Ordnung. Und das mit dem TBitmap wäre eine Idee, die realisiere ich ja schon zur Hälfte, aber ich zeichne es eben immer wieder neu weil das Bild immer wieder neu gezeichnet werden muss. Zusätzlich habe ich nicht wirklich Lust meine Klasse nochmal so stark umzuschreiben. DelphiX dürfte ich bei mir irgendwo rumliegen haben, aber ich habe es nicht eingerichtet/installiert/implementiert (was auch immer man damit machen muss :mrgreen: ) Flare |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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