API Win32: Technique pour redessiner certaines parties

GiUsTiNo Messages postés 129 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 30 juin 2012 - 25 juin 2012 à 22:48
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 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 !

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 juin 2012 à 10:40
WM_PAINT te donne un DC tenant compte de la region invalide.
Bien veiller a utiliser celui-ci

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
GiUsTiNo Messages postés 129 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 30 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.
0
GiUsTiNo Messages postés 129 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 30 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.

Des avis ou des idées ?
0
GiUsTiNo Messages postés 129 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 30 juin 2012
30 juin 2012 à 10:01
Up.

Est-il possible de redessiner plusieurs parties d'une fenêtre sans redessiner le reste ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
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.

Bye...
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
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.
0
Rejoignez-nous