Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
animierte Palette mit Direct Draw
von Plapperkatze am 12.März 2006 um 18:02
zurück zur Kategorie "Tutorials"

Das hier ist heute auf die Schnelle entstanden, und beweisst, dass DirectDraw der GDI, was Geschwindigkeit angeht, haushoch überlegen ist.

Es wird eine zirkulierende Palette in den Backbuffer gezeichnet und dann geblittet mit flip(). Dabei werden mit dem Multimediatimer (hier: http://katze.dead-men.de/index.php?tutorial=33 ) die frames/second (fps) ermittelt.

Screenshot:


ddraw.cpp ist fast identisch zu der aus dem vorherigen Tutorial, einziger Unterschied ist, dass der Backbuffer die Größe des Fensters hat:
// Zeichenfläche 2 (backbuffer)
   memset( &ddsd, 0, sizeof(ddsd) );
   ddsd.dwSize = sizeof( ddsd );
   ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PITCH;
   ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
   ddsd.dwWidth = 640;
   ddsd.dwHeight = 480;
   ddsd.lPitch = 0;

   if(lpDD->CreateSurface(&ddsd,&lpDDSBack,NULL)!=DD_OK)
   {
       lpClipper-> Release();
       lpDDSPrimary->Release();
       lpDD->Release();
       return FALSE;
   }
   return TRUE;

Ausserdem habe ich die Zeichenroutine drawPalette(HWD hwnd) auch dort untergebracht:
BOOL drawPalette(HWND hwnd)
{
 int y;
 HDC hdc;  
 DDBLTFX BlitDescription;
 // backbuffer löschen mit dwFillColor
 BlitDescription.dwSize=sizeof(DDBLTFX);
 BlitDescription.dwFillColor=RGB(64,32,0);
 lpDDSBack->Blt(0,0,0,DDBLT_WAIT|DDBLT_COLORFILL,&BlitDescription);
 if (lpDDSBack->GetDC(&hdc)==DD_OK)
 {
   unsigned char col1,col2,col3;
   for(y=0;y<height;y+=1)
   {
     col1=(1+sin((float)(y+col)*2/height))*128;
     col2=(1+sin((float)(y+col)*3/height))*128;
     col3=(1+sin((float)(y+col)*4/height))*128;
     HPEN hpen=CreatePen(PS_SOLID,1,
          RGB(col1,col2,col3));
     SelectObject(hdc,hpen);
     MoveToEx(hdc,0,y,NULL);
     LineTo(hdc,width,y);
     DeleteObject(hpen);
   }
   lpDDSBack->ReleaseDC(hdc);
   col+=.5;
 }
 return TRUE;
}

palette.cpp enthält die Fensterkontruktion und den MessageLoop. (Also diese Datei muss kompiliert werden ;) Dieser wartet nicht (wie GetMessage), bis eine neue Message eintrifft, sondern prüft mit PeekMessage, ob Nachrichten an unser Proggie gesendet wurden, andernfalls wird ständig gezeichnet. Hier der Loop:
 // Message-Pump-Loop
 while(!done)
 {
   if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
   {
     if(msg.message==WM_QUIT)
     {
       done=TRUE;
     }
     else
     {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
     }
   }
   else
   {
     if (QueryPerformanceFrequency((LARGE_INTEGER*)&Frequency))
     {
       CounterAvailable = TRUE;
       TimeScale = 1.0/Frequency;
       QueryPerformanceCounter((LARGE_INTEGER*)&LastTime);
     }
     else
     {
       LastTime = timeGetTime();
       TimeScale = 0.001;
     }


     // Zeichnen und flippen (backbuffer darstellen)
     drawPalette(hWnd);
     flip(hWnd);


     if (CounterAvailable)QueryPerformanceCounter((LARGE_INTEGER*) &CurrentTime);
     else CurrentTime = timeGetTime();
     TimeElapsed = (CurrentTime - LastTime) * TimeScale;
     LastTime = CurrentTime;
     sprintf(c,"fps: %lf",1/TimeElapsed);
     SetWindowText(hWnd,c);

   }
 }

Der rot dargestellte Code betrifft nur den Timer, der die fps ermittelt.

Download von exe und source, rar archiv, 27kB:
http://katze.dead-men.de/upload/35_palette.rar

gruesse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 220706 Besucher seit dem 23.01.2012 Login