Ruckelfreie Bewegung!
-
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?
-
Warum mit nem Sleep, das macht doch ein Timer wunderbar, außerdem glaube ich nicht, dass die Animation dann ruckelfrei ist!
-
lass doch mal, wie bereits gesagt, das visible zeugs weg. einfach
Image1->Left += 3; Image1->Top += 3;
in den Timer schreiben, dann dürfte da kein ruckeln sein (Ausser der Rechner ist aus irgendeinem Grund so ausgelastet ds das ganze system hängt).
Und der Intervall sollte stime. ich würde ihn zwischen 60 und 120 setzen.J0