PACMAN ( VISUAL C++ , MFC )

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 3 déc. 2003 à 00:23
teknoboost Messages postés 2 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 10 mai 2006 - 28 déc. 2007 à 12:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18370-pacman-visual-c-mfc

teknoboost Messages postés 2 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 10 mai 2006
28 déc. 2007 à 12:45
Il faut mettre "static bool first = true , deja = false;"

Sinon bonne source, vraiment dommage que le code ne soit pas commenté.
randriano Messages postés 54 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 26 juillet 2011
1 sept. 2007 à 16:24
Bonjour tout le monde !

Ce code a été créé sous Visual C++ 6. Donc, je l'ai testé sous Visual 2005, il se produit alors 2 erreurs:

d:\code_5\mindce game pacman\mindce game pacmanview.cpp(102) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\code_5\mindce game pacman\mindce game pacmanview.cpp(102) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

sur la ligne "static first true , deja false;"

Pourquoi ?

Merci d'avance !
Mindce Messages postés 3 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 12 décembre 2003
12 déc. 2003 à 12:09
T'as trouvé là une bonne solution pour conserver le if . Pour la création (resp. la destruction) des crayons et des brosses au debut (resp. à la fin) du jeu, c'est une bonne idée. Je ferais peut etre une mise à jour de mon programme en appliquant tes conseils. Merci et du courage à toi aussi.
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 déc. 2003 à 11:29
Heu.. je ne pense pas que ça marche (le free, c'est du C et le delete ne peut détruire que des objets alloués par new (ce que n'est pas le CPen* ou le CBrush* retourné)).

En fait, tu peux laisser ton if, mais alors dans ce cas, il faut mettre la déclaration de CPen apen et CBrush Brosse en dehors du bloc (mais tu peux laisser la création des objets eux-même dans le bloc).

Le problème (ou l'avantage) avec les MFC c'est que les objetts du GDI sont détruit automatiquement lorsque l'objet de la classe englobant l'objet GDI est détruit (lors de l'appel à ~CPen ou ~CBrush). Du coup, si tu ne le fais pas toi-même, tu ne sait pas toujours quand il sera détruit (en fait à la fin du bloc), ce qui peut être source de problèmes.

C'est pourquoi quand j'utilise les MFC j'appelle explicitement la fonction pen.DeleteObject(), pour ne pas avoir de problèmes, et puis si un jour tu programme en API Win32 pur tu perd pas les bonnes habitudes ;-).

Sinon, au lieu de créer des crayons et des brosses à chaque fois que tu dessine, tu devrais les créer lors de l'init du jeu et les détruire à la fin du jeu. Je pense que tu gagneras du temps pour le dessin.

Aller, bonne continuation pour ce bon jeu car en effet les fantomes sont durs à semer.
Mindce Messages postés 3 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 12 décembre 2003
11 déc. 2003 à 23:57
Je travaille sous XP et je n'ai ni Me ni 98 pour tester mais si tu le dis , je vais te faire confiance ymca2003 ;-) donc merci pour l'info. Seulement je reste confus , écoutes :

Pour le if(1==1) ???? en fait toute la partie du if(1==1){...} se charge de redessiner la porte verte par laquelle sortent les fantomes . Ainsi à chaque fois qu'on dessine un fantome : on redessine aussi la porte ce qui est inutile si le fantome ne touche pas la porte (en plus il y a 4 fantomes) à la place de if(1==1) il faut mettre if(le fantome ,qu'on dessine, touche la porte) alors {redessiner la porte} j'avais reporté de le faire plus tard puis j'ai oublié.
Déjà , tu vois qu'enlever la condition if() et les accolades , c'est dire ADIEU à une optimisation certaine du programme , imagine à chaque fois qu'un des 4 fantomes est dessiné , effacé ou deplacé , on redessine aussi la porte : quel desordre ( c'est le cas avec 1==1 qu'on doit remplacer par la condition adéquate) .


Laissons le if(1==1) mais restons sur le fichier Cases.cpp :
Le principe d'utilisation du DC est le suivant :

1) Sauvegarder ce qu'on a trouvé dans le DC
CPen * pOldPen = (CPen *) pDC->SelectStockObject(BLACK_PEN);
CBrush * pOldBrush = (CBrush *) pDC->SelectStockObject(BLACK...);

2) Faire tous ces petits délires avec le DC
....
y compris mon
if(1==1) {...}

3) Puis restaurer le DC tel qu'on l'a trouvé
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);

Déja ce ne sont plus les objets apen et Brosse qui sont dans le DC mais ce qu'il y avait avant . Donc le probleme de fuite de ressource reste incomprehensible pour moi dans le cas ou je respecte l'utilisation du DC tel qu'on le demande.

Il se peut que tu aies raison puisqu'il y a fuite de ressource donc au lieu d'enlever le if(1==1) et les accolades essaies plutot de remplacer ce qui suit :

pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);

par :

CPen * pPenAeffacer = (CPen *) pDC->SelectObject(pOldPen);
CBrush * pBrushAeffacer = (CBrush *) pDC->SelectObject(pOldBrush);
free(pPenAeffacer);// free ou delete
free(pBrushAeffacer);// free ou delete

Si t'as pas d'erreur de memoire ni de fuite de ressource après c'est que la fuite de ressource provient bien de l'usage du DC. Si tu peux le tester ce serait sympa de m'informer du résultat ;-)
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
11 déc. 2003 à 22:10
Sous 98 et ME, la zone qui bouffe toutes les ressources (au bout de 5 secondes d'utilisation):

fichier Cases.cpp ligne 212 :

if(1==1)
{
CPen apen;
apen.CreatePen(PS_SOLID,3,RGB(0,255,0));
CBrush Brosse(RGB(32,70,105));
pDC->SelectObject(&apen);
pDC->SelectObject(&Brosse);
pDC->MoveTo(Xd+(2*19+1)*dX,Yd+(2*11+1)*dY);
pDC->LineTo(Xd+(2*19+1)*dX,Yd+(2*14+1)*dY);
};

il faut enlever le if(1==1) ???? et les accolades de début et fin de bloc et ça va mieux.

La raison : en sorti du bloc, les objets apen et Brosses sont détruits mais ils sont toujours sélectionnés dans le DC.
Résultat : sous 98 et ME : fuite de ressource.
sous NT et XP : le système est plus laxiste et tollère de laisser des objets graphiques dans les DC.
thedudul Messages postés 33 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 28 novembre 2004
10 déc. 2003 à 15:38
Pour Windows ME, oui c'est un systeme mal fait, d'ailleur tu ne t'ai jamais demandé pourquoi tu trouve encore du Windows98 mais plus de Windows ME ? Microsoft l'a lui même avoué, c'était une erreur de parcour officieusement, un systeme vite fait pour faire la transition entre 98 et XP officiellement. Cela dit, il y a des personnes qui ne jure que par Windows ME, comme certaines personnes pense que la PS2 est la console le plus puissante du marché et que d'autre aime la scato (caca sur le corp pour ceux qui connaissant pas). Ca ce discute pas mais dépend de la personne.

Pour revenir au sujet qui nous interresse, je trouve ce prog très bon, de plus il montre qu'on peu aussi programmer sous Windows ME sans devoire rebooter toutes les 5 minutes ... a bon 4 minutes ? Non je rigole ;-)
Bonne prog et continu comme ca, vive la version en 3D ;-)
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
4 déc. 2003 à 19:23
d'accord pour l'experience, mais je parle de ceux qui repetent partout que me c'est pourri tout ca parce que c'est a la mode de le dir
ronanry Messages postés 190 Date d'inscription lundi 25 novembre 2002 Statut Membre Dernière intervention 22 décembre 2009
4 déc. 2003 à 17:01
SUper source......bien que ...il est vrai que plus de commentaires auraient été les bienvenus (surout pour les novices en mfc....LIKE ME :))

djl>> c pas du comerage.....c de l'experience :)
moi perso ME aussi bien que XP j'y suis reste une semaine.....apres a chaque fois retour sous 2000.....Y A PAS MIEUX!!!!!!
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
4 déc. 2003 à 12:49
j'ai eu de plus gros plantage avec xp qu'avec me, en fait mon me n'a planter qu'une fois, et j'en connai plein qui n'ont jamais eu de probleme avec me alors faut arreter de ce faire des idée la dessus, on dirait du comerage
cs_Xs Messages postés 368 Date d'inscription mercredi 14 novembre 2001 Statut Membre Dernière intervention 1 septembre 2008
3 déc. 2003 à 23:51
Lu.
Plutot bon programme.

ymca2003 >> Ton Millenium t'as laissé jouer et poster un commentaire sans planter entre deux ? Je crosi que tu es l'heureux détenteur d'un nouveau record de celui qui est resté sur Me le + de temps sans planté. lol
guilhemmartincpp Messages postés 25 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 9 janvier 2008
3 déc. 2003 à 09:24
Bien sympa !
Bravo.
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 déc. 2003 à 00:23
Ca a l'air pas mal, mais j'ai petit pb sous Windows ME : ce prog me bouffe toutes les ressouces systèmes.

Sinon, quelques commentaires dans les sources seraient pas mal.
Rejoignez-nous