![]() |
Canvas Bewegen (schnee programm)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Ich möchte ein Programm schreiben, welches Fallender Schnee auf dem Gesamten (!) Desktop simuliert Habe dazu mal diesen Code zusammengebastelt:
Delphi-Quellcode:
Die Schneeflocke ist angehängt :D
procedure TForm1.Button1Click(Sender: TObject);
var h : HWND; c : TCanvas; i:tbitmap; begin i:=tbitmap.Create; i.LoadFromFile('snow.bmp'); h:=FindWindow('Progman',nil); h:=FindWindowEx(h,0,'SHELLDLL_DefView',nil); h:=FindWindowEx(h,0,'SysListView32',nil); c:=TCanvas.Create; c.Handle:=GetDc(h); c.Pen.Color:=clRed; c.Draw(100,100,i); //c.TextOut(100,100,'HehOsdffsdfsdsdf'); end; Nun bräuchte ich ein paar Tipps oder Code schnipsel wie ich die Schneeflocken animieren kann Und was ich machen muss damit sie bei Objekten wie zb Fenster oder Icons liegen bleiben... Danke schonmal Liebe Grüsse Claudio |
Re: Canvas Bewegen (schnee programm)
Das kannst du dir zB. dort abgucken: SnowScreenSaver
//Edit: Hm, das ist kein gutes Beispiel wie ich nun feststellen muss. Es ist nicht notwendig die Recourcen ständig im Timer zuladen. Einmal laden im FormCreate reicht. |
Re: Canvas Bewegen (schnee programm)
Danke...
Damit hätte ich mal die Bewegung Jetzt muss ich noch das Ansetzen irgendwie realisieren :) //////Edit Also mit dem empfohlenen Screen Saver komme ich nicht wirklich zurecht... Ich sehe nicht, wo genau die Flocken bewegt werden.... Hier hab ich noch die erste EXE.... Was haltet ihr von den Flocken? Habe den Timer auf 50 und mit
Delphi-Quellcode:
mache ich den zufall, bei mir kommen die Flocken aber nie nach ganz recht, is das bei euch auch so?
random(Screen.height);
Hier die EXE in meinem Filestore ![]() |
Re: Canvas Bewegen (schnee programm)
Hab gesehen, das bies jetzt nur jemand die Datei heruntergeladen hat....
Hat jemand einen Tipp für mich wie ich diese Flöckchen bewegen könnte?? Der edit hat ja gezeigt, das der screensaver nich das beste beispiel war :? Danke schonmal |
Re: Canvas Bewegen (schnee programm)
Hallo Hedie,
für die horizontale Positionierung müsstest Du Screen.Width verwenden. Zum Bewegen der Flocken musst Du sicherlich Objekte erzeugen (TImage?) und in einer Liste verwalten. Dann kannst Du über einen Timer deren Positionen ändern. Ich würde das erst mal in einem Formular ausprobieren. Wie Du solche Objekte auf den Desktop setzen kannst und vor allem auch noch offene Fenster(-Bereiche) ermitteln kannst ... keine Ahnung. Ist aber eine interessante Aufgabe :-) stahli |
Re: Canvas Bewegen (schnee programm)
Habe für die horizontale Positionierung auch
Delphi-Quellcode:
verwendet...
Screen.width
Hmmm ok ich werds mal versuchen... Also brauch ich gar keine canvas? |
Re: Canvas Bewegen (schnee programm)
Also Deine Flocken haben sich auf meinem Desktop "eingebrannt" :cry:
Das Hintergrundbild wird ja erst wieder bei einem Neustart geladen, denke ich. Der Weg ist also nicht optimal. Wenn man auf einen Canvas zeichnet muss man ggf. selbst dafür sorgen, dass die Aktion wieder rückgängig gemacht wird (such mal hier nach Linie und Gummiband). Wenn man Komponenten instanziert und positioniert kann man diese leicht in einer Liste verwalten und diese dann verschieben obder auch wieder freigeben. Wenn Du keine besseren Tipps enhältst würde ich das Ganze erst mal mit Komponenten in einer Formularanwendung umsetzen. Später kannst Du das Ganze dann evtl. auf den Desktop "auslagern". stahli |
Re: Canvas Bewegen (schnee programm)
ok ich versuche mal mein bestes....
Merkwürdig das die sich bei dir eingebrannt haben.... Sobald ich bei mir ein fenster drüber leg, sind die wieder weg |
Re: Canvas Bewegen (schnee programm)
Vielleicht liegt´s an meinem Vista?
Schlimmstenfalls musst Du mir einen neuen Bildschirm schicken ;-) Viel Spaß stahli |
Re: Canvas Bewegen (schnee programm)
|
Re: Canvas Bewegen (schnee programm)
Danke
Ist eine interessante Seite :D |
Re: Canvas Bewegen (schnee programm)
Das Prinzip ist ganz einfach:
Jede Schnee Flocke ist ein Object was sich seinen Hintergrund merkt wo es drauf gezeichnet wurde. Beim Neu Zeichnen stellst du den hintergrund wieder her und zeichnest deine neue Position. Allerdings gibt es hier ein kleines Problem wenn sich mehrer Objekte überlagern kommt es zu Grafik Fehlern. Bei meiner 2D Engine habe ich das so gelöst: Wie oben beschrieben aber bevor ich neu zeichne wird ein event ausgelöst was an die Engine geht. die wieder rum veranlasst das jetzt in jedem Spritemanger jeder Sprite der in den geänderten Bereich passt neu gezeichnet wird. So umgehst du die Grafik Fehler und du musst nicht ständig deine flocke neu zeichnen bzw. dein Hintergrund Bild. Da aber der Schnee Fallen soll könntest du auch so vorgehen: Du packst einmal dein hintergrund in einem Bitmap dann hast du einen Buffer jetzt kopierst du mit Bitbtl oder Draw den Hintergrund in den Buffer und zeichnest einfach deine Flocken an der neuen Position. Dazu müsstest du aber ein Array anlegen wo alle Flocken drin sind. Diese Weg führt aber mit Sicherheit zu 100% CPU Last beim ersten weg hängt das von den Stellen ab wie oft neu gezeichnet wird. Mit der Engine würde das Prima gehen ist allerdings für Lazarus geschrieben, aber mit wenigen Änderungen sollte auch unter Delphi laufen. evlt. lade ich sie mal hoch wenn ich sie dafür vorbereitet habe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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