Ruckelfreie Bewegung!



  • 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 wird

    Nö, 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


Anmelden zum Antworten