Bild über Form laufen lassen
-
ok
-
Ne, so geht das nicht. Das Problem ist, dass die Anwendung nicht neugezeichnet wird, so lange die Schleife ausgeführt wird. Es gibt mehrere Möglichkeiten, das Problem zu lösen:
Mittels Thread:
Ist die aufwändigste Methode und hier wohl nicht richtig geeignet.Mittels Timer:
Schreib den Code in einen Timer, den Du alle 10 ms ausführen lässt. Dafür musst Du aber ein paar Änderungen durchführen.Mittels manuellem Anschubsen des Neuzeichnens:
Nicht die sauberste Vorgehensweise, aber in diesem Fall wohl am einfachsten umzusetzen. Füge in Deinem Code, vor dem Sleep(10); ein Application->ProcessMessages() ein. Dadurch wird die Nachrichtenwarteschlange der Anwendung abgearbeitet und somit wird das Formular auch neu gezeichnet. Ich würde aber dennoch einen Timer verwenden.
-
Hallo,
warum sollte das nicht funktionieren? Die Anwendung muss doch nicht neugezeichnet werden, wenn sich das Bild nur bewegen soll. So wie ich es geschrieben habe, funktioniert es bei mir sehr gut. Ist deine Varianter nicht einfach anders, vielleicht professioneller??lg, freakC++
-
roflcopter schrieb:
...ich hab das ganze jetzt so versucht aber das klappt nicht. Das Bild bleibt einfach nur dumm auf der Form stehen und danach friert das Form ein und man kann sie nicht mehr bewegen.
-
Hallo,
freakC++ schrieb:
warum sollte das nicht funktionieren? Die Anwendung muss doch nicht neugezeichnet werden, wenn sich das Bild nur bewegen soll. So wie ich es geschrieben habe, funktioniert es bei mir sehr gut.
Es funktioniert so gut, weil zumindest der Client-Bereich des Form (bin nicht sicher, ob viell. das ganze Form) vollständig neu gezeichnet wird wenn du
Form1->Canvas->CopyRect(Ende, Canvas, Anfang);
ausführst. Würde nur das neue (verschobene) Bild gezeichnet, würdest du die Kanten des alten Bildes noch sehen!
MfG
-
Also beide Lösungen funktionieren wobei die von Joe natürlich am leichtesten ist aber dafür flackert das Bild etwas wenn es sich bewegt.
Bei der Lösung von freakC++ dort flackerte nichts.
Aber ich hab jetzt ein neues Problem -.-
Wie kann ich die lauf Geschwindigkeit des Bildes verändern.
Wenn ich Sleep(10) mache ist es zu langsam und bei Sleep(1) ist es ebenfalls zu langsam
-
Dann probier's mal ohne Sleep(). Dann hast du schon mal einen Funktionsaufruf gespart. Dann kannst du die for-Schleife noch mit Dekrement realisieren:
for(int i= 1000; i > 0; i--) { //... }
soll angeblich schneller laufen als
for(int i= 0; i < 1000; i++) { //... }
Ansonsten wird ja in der Schleife von freakC++ viel gerechnet / Funktionen aufgerufen
for (int i = x-5; i<ClientWidth-Durchmesser-x-5; i++) { Anfang = Rect(i, y-5, i+Durchmesser+5, y+Durchmesser+5); Ende = Rect(i+1, y-5, i+Durchmesser+6, y+Durchmesser+5); Form1->Canvas->CopyRect(Ende, Canvas, Anfang); Sleep (10); }
Vielleicht kannst du ja da auch noch etwas optimieren.
MfG
-
Funktionierte leider nicht.
Das Bild bewegt sich noch immer entweder zu langsam oder zu schnell.
Mann muss doch irgendwie die Lauf Geschwindigkeit von dem Bild festlegen können.
-
roflcopter schrieb:
Das Bild bewegt sich noch immer entweder zu langsam oder zu schnell.
Zu schnell ist ja was Neues.
Bei welchem Code bewegt es sich zu langsam? Bei dem von freakC++ mit Sleep()?
Und bei welchem zu schnell?
Hast du die Variante von Joe_M mittels Timer mal getestet?
Was hast du sonst noch für Ideen?
-
Wenn es zu schnell läuft, kann du vielleicht folgendes bei meiner Variante ausprobieren:
Füge den Header #include <dos.h> ein. Sleep wird dann klein geschrieben und übernimmt nur ganze Sekunden.
lg, freakC++
-
Das kann dann aber auch mit Sleep(1000); geschehen (für 1 Sekunde), oder nicht?
Er schrieb aber auch, bei Sleep(1) ist es ihm noch zu langsam... Daher meine Frage, wie der Code aussieht, bei dem es zu schnell läuft!
Insgesamt sind es natürlich die Schrittweite UND Pausenzeit, welche die Bewegung des Bildes beeinflussen...
-
Ja das stimmt, aber vll hätte man damit eine bessere Steuerung.....