Ruckelfreie Bewegung!
-
Hi,
ich möchte mit dem C++ Builder eine ruckelfreie Bewegung eines Bildes über den Bildschirm erzeugen. Ich hab dazu n Timer und n Image, dessen Koordinaten ich ändere und Visible/Invisible über den Timer setze. Geht auch alles, nur ruckelts halt. Muss man den Hintergrund irgendwie restaurieren? Kann mir jemand n bisserl Beispielcode posten?
Gruß
Al
-
Setzte mal ein Panle in den Hintergrund und setzte die Eigenschaft DoubleBufferd auf true. Der Rrest ist halt so ne Frage wenn du alle 1000 ms um 6 pixel verschiebst ists klar
-
Hi,
das reicht nicht, ich brauche eine Verschiebung im 0,1-Sekunden-Takt!
-
Da gibts was schönes:
DoubleBuffered=true;
in FormCreate
Die Animationen flimmern nicht mehr.
Hat folgente NAchteile:
-Frisst etwas speicher,
Bei uns leif die Figur in den Formen mit DoubleBuffered etwas langsamer als in denen mit DoubleBuffered- Wir haten Gegner deren Animationen per Timer abliefern. Diese Bewegungen liefen nicht mehr wenn unsere Figur lief. Wir wissen nicht warum
-
Habs so gemacht, sehe aber keinen Unterschied!
-
das reicht nicht, ich brauche eine Verschiebung im 0,1-Sekunden-Takt!
==> Sleep(100) = 0,1 sec
-
Äh, wenn ich den Timer auf 0,1 s gestellt habe, brauche ich doch kein sleep!?
-
Ich hab' mal sowas gemacht:
TPoint Pt; BMTemp->Assign(BM); BMTemp->Canvas->CopyMode=cmSrcPaint; Pt=I1->ScreenToClient(Mouse->CursorPos); BMTemp->Canvas->Draw(Pt.x,Pt.y,Symb); I1->Canvas->Draw(0,0,BMTemp);
In BM ist ein Hintergrundbild (TBitmap)
In Symb ist eie kleine Grafik (TImage)
BMTemp (TBitmap) wird die Grafik über Hintergrund 'gemischt'Das 'montierte' Bild wird in ein TImage I1 gezeichnet.
PS: mit dem CopyMode musste experimentieren!
-
Original erstellt von AlTheKingBundy:
Habs so gemacht, sehe aber keinen Unterschied!Mh. Wlechen Builder ast du?
-
Liegt das Bitmap direkt auf der Form oder in einer Groupbox/Panel?
J0
-
Also das Bitmap liegt direkt auf dem Form. Darf es das nicht?
-
Es darf. Hab's probiert, kein flackern mehr!
-
Zwischen Flackern/Flickern und Ruckeln besteht ein Unterschied, bei letzterem dürfte DoubleBuffering nicht viel helfen. Vielleicht sollte uns Al sein Problem noch mal genauer beschreiben, was konkret ihn an der Bewegung stört?
-
Alsoooo, ich habe ein Image, welches ich über top und left ein paar Pixel mit Hilfe eines Timers verschiebe. ich beobachte, dass ab und zu das Bild einen Sprung macht, obwohl das nicht vorgesehen ist. Ach so, ich mache das Bild erst unsichtbar, verschiebe es dann und dann wieder sichtbar!
Gruß
Al
-
öhm........
nö.........
Machs doch so:while(!abbruch) { Image1->Left-=5; Image1->Top-=5; sleep(100); }
abbruch kannst du z.B. auf true setzen, wenn eine Taste gedrückt wurde, also sprich:
Form1::FormKeyPress(TObject *Sender, char& Key) { abbruch=true; }
-
Nur wird das so nie wie gewünscht funktionieren... Schliesslich gibst du keine Gelegenheit mehr, die restlichen Nachrichtne zu verarbeiten...
Für das Problem dürfte die Lösung definitiv das DoubleBuffering mit 2 Images sein, wobei das Eine immer verschoben wird während das Andere angezeigt ist.
-junix
-
Na ich weiß ja nich, nimmt die while-Schleife denn so viel Speicher weg, dass nicht mehr auf Tastendruck reagiert wird? Wenn ja, dann ist klar, dass wir das so machen müssten, aber ansonsten...
-
Original erstellt von Spieleprogrammierer:
Na ich weiß ja nich, nimmt die while-Schleife denn so viel Speicher weg, dass nicht mehr auf Tastendruck reagiert wirdNö, Speicher frisst die While-Schleife praktisch keinen... nur die Prozessorresourcen gehen Anschlag... wenn du das nächste Mal vielleicht deine Vorschläge erst ausprobieren würdest... Hättest du etwas Ahnung davon, wie die Programmierung in Fensterorientierten System läuft, würdest du wissen, dass Tastendrücke (und alle anderen Interaktionen mit dem Fenster) über Messages laufen, die das OS in eine Queue schreibt, die regelmässig abgearbeitet werden muss. Näheres dazu unter TApplication::ProcessMessages()
-junix
-
Ist ein Timer nicht besser?
-
Abgesehen vom Timing: hast du das Ganze schon mal ohne Visible = false/true versucht? Wozu soll das überhaupt gut sein?