2016-03-29 1 views
0

Alors atm im en utilisant SwapBuffers dans ce code pour le rafraîchir:Comment utiliser SwapBuffers dans 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++; 
    } 

} 

donc im utiliser à la fin de la procédure de dessin suivi d'un dispositif clair. Cela fonctionne un peu sauf lors de la lecture d'animations ou de dessiner quelque chose dans le backround (qui est supprimé). Je ne comprends pas comment je devrais l'utiliser. Je sais qu'il est utilisé pour le double tampon et il est supposé échanger la prochaine image pré-générée avec l'ancien mais partout j'ai regardé son explication mal. Comment puis-je utiliser les swapbuffers de manière efficace pour que je puisse jouer des animations et dessiner des choses dans le backround (comme mon programme est censé faire quand le joueur a laissé des clics) sans qu'il disparaisse?

Im en utilisant les librarys de ce site http://winbgim.codecutter.org/

+0

Cela pourrait aider les gens à vous aider si vous fournissiez une référence à la bibliothèque que vous utilisez qui fournit ''. –

+0

Utilisez-vous WinBGIm? – xrgb

+0

J'inclus mes bibliothèques dans le message – MoustacheSpy

Répondre

0

Je ne sais pas ce que vous utilisez les bibliothèques, mais des noms des fonctions que vous appelez, il semble que vous le droit de compensation tampon de couleur après avoir échangé le tampon arrière avec le tampon avant. Je ne pense pas que cela fonctionnera. En outre, je vais supposer en outre que la fonction setbkcolor définit la couleur qui sera utilisée pour effacer le tampon de couleur. La façon dont je suis habitué à faire des images en temps réel est comme ceci:

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

Cependant, dans votre code, vous semblez vider la mémoire tampon de couleur juste après la permutation, votre boucle devrait ressembler à ceci (les changements ont été marqué avec des commentaires):

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 
} 

Modifier: J'ai oublié d'expliquer les changements. La façon dont vous le faisiez, chaque fois qu'un cadre était rendu et montré à l'utilisateur, il était immédiatement effacé par l'appel cleardevice. En déplaçant l'appel cleardevice au début de la boucle, vous effacez l'ancien cadre avant le rendu et affichez le nouveau. Je dois avouer cependant que c'est surtout une conjecture de ma part car je ne sais pas quelles bibliothèques vous utilisez.

+0

J'inclus les librays dans mon poste – MoustacheSpy

+0

Aussi cela ne change rien en fait, car j'ai encore les mêmes problèmes qu'avant! Pouvez-vous peut-être vérifier l'utilisation de librays et voir si vous pouvez trouver une réponse différente? Pendant que vous faites ça, je vais faire des tests pour voir si ça marche vraiment et je suis juste trop stoïque – MoustacheSpy