API Win32: Technique pour redessiner certaines parties
GiUsTiNo
Messages postés129Date d'inscriptionlundi 26 avril 2004StatutMembreDernière intervention30 juin 2012
-
25 juin 2012 à 22:48
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 2013
-
8 août 2012 à 09:52
Bonjour à tous
Je développe actuellement un Puissance 4 (via l'API win) et j'affiche donc 6 fois une image (ces 6 images, toutes identiques, forment la grille du jeu). J'ai ensuite un jeton (jaune ou rouge selon le joueur actuel) qui se balade au dessus des colonnes selon des évènements de clavier (flèches directionnelles gauche/droite). Et bien sur, également des jetons jaunes ou rouges qui s'affiche "sur" la grille aux endroits adéquats (les endroits joués par les joueurs).
Ma question est la suivante:
Quelle est la meilleure façon de structurer celà ? Actuellement, je pense que ma grille est redessinée à chaque fois (via l'évènement WM_PAINT). Ce qui n'est pas désiré, car inutile. Comment l'éviter et ne la dessiner qu'une seule fois au début (en sachant qu'apparement il faut que celà se fasse dans WM_PAINT) ?
J'ai essayé plusieurs façons d'optimiser, notamment en envoyant une zone minimume à redessiner via la fonction InvalidateRect, au lieu de redessiner toute la fenêtre, mais je ne pense pas que ça soit la meilleure technique car lorsque WM_PAINT est appelé et que je dois dessiner en-dehors de cette zone invalide, ça pose problème
En résumé:
1) la grille n'est dessinée qu'une fois au début.
2) le jeton rouge/jaune qui se ballade au dessus de la grille est effacé/redessiné à chaque évènement clavier cité plus haut.
3) les jetons ajoutés sont dessinés directement (même principe que la grille, affiché une seule fois lorsqu'un joueur joue cette case).
Donc, à votre avis, comment structurer cette partie "dessin" de manière optimisée ?
Merci d'avance pour vos idées !
A voir également:
API Win32: Technique pour redessiner certaines parties
GiUsTiNo
Messages postés129Date d'inscriptionlundi 26 avril 2004StatutMembreDernière intervention30 juin 2012 26 juin 2012 à 11:44
Je suis d'accord avec toi mais je me suis peut-être mal expliqué. En fait ce que j'aimerai savoir c'est si il y a, dans mon cas, une façon de faire plus optimisée que de (soit) invalider toute la fenêtre (soit) invalider ma zone au-dessus de la grille pour le jeton qui voyage.
GiUsTiNo
Messages postés129Date d'inscriptionlundi 26 avril 2004StatutMembreDernière intervention30 juin 2012 27 juin 2012 à 16:17
Sachant que si j'invalide toute la fenêtre il n'y a aucun problème (je l'ai développé d'abord comme ça et tout fonctionne très bien hormis le fait que ce n'est pas très optimisé au niveau du dessin à mon avis). Mais si je décide d'invalider la zone au-dessus de la grille (pour le jeton qui voyage de gauche à droite), j'aurai un problème si je précise une autre zone invalide (pour dessiner le jeton dans la grille, joué par un des joueurs).
Au final, peut-être que l'invalidation totale est la seule solution dans mon cas... Même si certaines parties ne nécessitent pas d'être redessinées.
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 2 juil. 2012 à 13:08
Salut,
J'ai fait un peu la même chose, un grille (bitmap) et des jetons (bitmap aussi) et j'utilise le message WM_ERASEBKG pour la grille et des InvalidateRect pour les jetons :
Exemple ici
Tapez le texte de l'url ici.
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 20132 8 août 2012 à 09:52
Bonjour,
Je pense que dans ce cas il faudrait utiliser la technique du double buffer, on place la grille dans la 1ere couche et les jetons dans la deuxième, ainsi lors du dessin de la fenêtre, on a déjà la 1ére couche prête et il n'y a plus qu'a redessiner les jetons. De plus, la fonction BitBlt est optimisée pour le transfert des données d'un bitmap vers l'écran et sera donc bien plus rapide que de dessiner directement sur l'écran.