2016-03-29 5 views
0

So atm im SwapBuffers in diesem Code verwendet, es zu aktualisieren:So verwenden SwapBuffers in graphics.h

#include "graphics.h" 

void drawGridOnX(int xtotal, int ytotal); 
int levelcode[400][45][100]; 
void decodelevelAndDraw(); 

void main() { 
    initwindow(1600, 900,"Testscreen",0,0,true,true); 
    int gridposx = 0, gridposy = 0, diffx = 0, diffy = 0, xtotal=0, ytotal = 0,distanceFromMouse=50; 


    while (1) { 
     setbkcolor(9); 
     ytotal = 0; 
     diffx = mousex() - gridposx; 
     while (gridposx < mousex()&&diffx>=70) { 
      gridposx += 70; 

     } 
     while (gridposx > mousex()&&diffx<=-70 + distanceFromMouse) { 
      gridposx =gridposx-70; 

     } 
     diffy = mousey() - gridposy; 
     while (gridposy < mousey() && diffy >= 70) { 
      gridposy += 70; 

     } 
     while (gridposy > mousey() && diffy <= -70+distanceFromMouse) { 
      gridposy = gridposy - 70; 

     } 
     while (ytotal < 900) { 
      drawGridOnX(xtotal, ytotal); 
      ytotal += 70; 
     } 
     if (WM_LBUTTONDOWN) { 
      levelcode[gridposx/70][gridposy/70][0]=1; 
      printf("CLICK"); 
     } 
     decodelevelAndDraw(); 
     readimagefile("question.bmp", gridposx,gridposy, 70+gridposx, 70+gridposy); 
     printf("gridposx:%d\tgridposy:%d\ttitlenumberx:%d\ttitlenumbery%d",gridposx,gridposy,gridposx/70,gridposy/70); 
     swapbuffers(); 
     cleardevice(); 
    } 
} 


void drawGridOnX(int xtotal, int ytotal) { 
    while (xtotal < 1600) { 
     rectangle(xtotal, ytotal, 70 + xtotal, 70+ytotal); 
     xtotal += 70; 

    } 


} 


void decodelevelAndDraw() { 
    int x = 0, y = 0; 
    while (y != 12) { 
     while (x != 22) { 
      if (levelcode[x][y][1] == 1) { 
       readimagefile("question.bmp", x*70, y*70, 70 + x*70, 70 + y*70); 

      } 
      x++; 
     } 
     y++; 
    } 

} 

So am Ende des Ziehverfahrens durch eine klare Gerät unter Verwendung von ihm im. Das funktioniert nur beim Abspielen von Animationen oder beim Zeichnen von etwas im Hintergrund (das wird gelöscht). Ich verstehe nicht, wie ich es benutzen sollte. Ich weiß, dass es für die doppelte Pufferung verwendet wird, und es sollte den vorgenerierten nächsten Frame mit dem alten austauschen, aber überall sah ich es schlecht erklärt. Wie kann ich swapbuffers effektiv nutzen, so dass ich Animationen abspielen und Sachen im Hintergrund zeichnen kann (wie es mein Programm tun sollte, wenn der Spieler klickt), ohne dass es verschwindet?

Im die librarys von dieser Seite mit http://winbgim.codecutter.org/

+0

Es könnte Menschen helfen Ihnen helfen, wenn Sie einen Verweis auf die Bibliothek zur Verfügung stellen würden, die '' bereitstellt. –

+0

Verwenden Sie WinBGIm? – xrgb

+0

Ich habe meine Librarys in den Beitrag aufgenommen – MoustacheSpy

Antwort

0

Ich bin nicht sicher, welche Bibliotheken Sie verwenden, sondern von den Namen der Funktionen, die Sie anrufen, es sieht aus wie Sie den Farbpuffer recht Clearing nach dem Austauschen des Backpuffers mit dem Frontpuffer. Ich denke nicht, dass das funktionieren wird. Außerdem nehme ich weiterhin an, dass die Funktion setbkcolor die Farbe festlegt, die zum Löschen des Farbpuffers verwendet wird. Die Art, wie ich bin es gewohnt, zu Echtzeit-Grafiken zu tun ist wie folgt:

repeat { 
    // check for and handle user input 
    // set background color 
    // clear color buffer 
    // update scene information 
    // render the new scene 
    // swap the buffers 
} 

jedoch in Ihrem Code, Sie scheinen Recht, den Farbpuffer zu löschen, nachdem Vertauschen der Schleife soll wie folgt aussehen (die Änderungen haben (mit Kommentar markiert):

while (1) { 
    setbkcolor(9); 
    cleardevice(); // line of code added 
    ytotal = 0; 
    diffx = mousex() - gridposx; 
    while (gridposx < mousex()&&diffx>=70) { 
     gridposx += 70; 

    } 
    while (gridposx > mousex()&&diffx<=-70 + distanceFromMouse) { 
     gridposx =gridposx-70; 

    } 
    diffy = mousey() - gridposy; 
    while (gridposy < mousey() && diffy >= 70) { 
     gridposy += 70; 

    } 
    while (gridposy > mousey() && diffy <= -70+distanceFromMouse) { 
     gridposy = gridposy - 70; 

    } 
    while (ytotal < 900) { 
     drawGridOnX(xtotal, ytotal); 
     ytotal += 70; 
    } 
    if (WM_LBUTTONDOWN) { 
     levelcode[gridposx/70][gridposy/70][0]=1; 
     printf("CLICK"); 
    } 
    decodelevelAndDraw(); 
    readimagefile("question.bmp", gridposx,gridposy, 70+gridposx, 70+gridposy); 
    printf("gridposx:%d\tgridposy:%d\ttitlenumberx:%d\ttitlenumbery%d",gridposx,gridposy,gridposx/70,gridposy/70); 
    swapbuffers(); 
    // cleardevice(); // line of code removed 
} 

Edit: Ich habe vergessen, die Änderungen zu erklären. So wie Sie es taten, wurde jedes Mal, wenn ein Rahmen gerendert und dem Benutzer angezeigt wurde, dieser sofort durch den Anruf cleardevice gelöscht. Verschieben Sie den cleardevice Aufruf an den Anfang der Schleife, löschen Sie den alten Rahmen vor dem Rendern und zeigen Sie den neuen. Ich muss jedoch gestehen, dass dies meistens meinerseits ist, weil ich nicht weiß, welche Bibliotheken Sie benutzen.

+0

Ich habe die Librays in meinem Post – MoustacheSpy

+0

Auch das ändert eigentlich nichts, weil ich immer noch die gleichen Probleme wie vorher habe! Kannst du vielleicht die Librays überprüfen und sehen, ob du eine andere Antwort finden kannst? Während du das tust, werde ich einige Tests durchführen, um zu sehen, ob es tatsächlich funktioniert und ich einfach zu stoisch bin – MoustacheSpy