Vernünftiger loop für Animationen



  • Hiho!
    Ich mache gerade ein Programm dass sich Buchstaben aus einem Bitmap file ausliest und die Buchstaben anschließend in einem Scroller ausgibt. Genau beim Scrollen des Textes liegt auch schon das Problem. Ich habe eine Funktion gemacht, die bei jedem Aufruf den Text um einen Pixel verschiebt. In diversen game foren wird einem immer das hier als gameloop empfohlen:

    while( true )
    	{
    		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    		{	  
             if (msg.message == WM_QUIT) break;
    
             TranslateMessage(&msg);
    	     DispatchMessage(&msg);
    		}
    		GameLoop( hWnd );
    	}
    

    Davon halte ich aber nichts, weil die Prozessor auslastung immer bei 99% ist.
    Es soll ja auch nur ein kleines Windows programm sein. Threads sind ja angeblich auch ne schlechte lösung. Hat jemand ne idee?



  • Setz in die obige Schleife einfach ein Sleep(0) ans Ende,
    dann bleibt die Prozessorauslastung niedrig, da der Thread die CPU-Kontrolle immer wieder abgibt.



  • (Multimedia)Timer



  • Hm, das mit dem Multimediatimer sieht gut aus. Einzige problem ist, das ich es nicht zum laufen bekomme. Habe mich schon durchgegoogelt aber nix gefunden. Die Beispiele aus der MSDN funktionieren irgendwie nicht. Ich weiß einfach nicht, welches Format die timeSetEvent funktion beim LPTIMECALLBACK fptc verlangt.

    Mache ich TIMECALLBACK hallo()

    kriege ich error C2664: 'timeSetEvent' : Konvertierung des Parameters 3 von 'void (__stdcall *(void))(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long)' in ' void (__stdcall *)(unsigned int,unsigned int,unsigned long,unsigned long,unsigned long) nicht möglich.

    Kann man das mit den Multimedia Timer so wie mit dem "normalen" Timer machen? Also dass er bei jedem Tick he bestimmte funktion aufruft? Genau soetwas bräuchte ich nämlich, hab aber leider keinen Schimmer wie es geht. 😞



  • Ich weiß einfach nicht, welches Format die timeSetEvent funktion beim LPTIMECALLBACK fptc verlangt.

    Dann lies es bitte nach.



  • Also voila:

    ⚠ Ungetesteter Code ⚠

    // -- HEADER:  #include <MMSystem.h>
    // -- LIBRARY: #pragma comment (lib, "WinMM.lib")
    
    // ...
    // Prototyp der Timer-Funktion, die alle 5 Millisekunden aufgerufen wird:
    void CALLBACK MMTimerProc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
    
    // ...
    // Multimedia Timer starten 
    // (Intervall: 5 Millisekunden, Auflösung: 1 Millisekunde, keine zusätzlichen Daten, die an die
    //  Timer-Funktion MMTimerProc übergeben werden):
    timeSetEvent(5, 1, (LPTIMECALLBACK)&MMTimerProc 0L, TIME_CALLBACK_FUNCTION | TIME_PERIODIC)
    
    // ...
    // Definition der Timer-Funktion:
    void MMTimerProc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
    {
       static int iCount = 0; // lokal, statisch
       MessageBox(NULL, TEXT("MsgB - Bombardement"), TEXT("100-Mal"), 0); // jedes Mal ne MessgeBox anzeigen :-D
       iCount += 1; // Zähler inkrementieren
       if(iCount == 100) // Prüfen...
          timeKillEvent(uTimerID); // ...Timer beenden
    }
    
    // ...
    

    ⚠ Ungetesteter Code ⚠

    EDIT: Kommentare



  • lol funktioniert, danke :)))))))


Anmelden zum Antworten