Orikata
Messages postés8Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention11 juillet 2006
-
10 avril 2006 à 16:02
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 2013
-
14 janv. 2007 à 19:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 14 janv. 2007 à 19:58
Voila j'ai mis la lib CMUgraphics sur mon site internet comme ca il ne devrait plus y avoir de problème et tout le monde pourra compiler mes sources
http://pistol.petesampras.free.fr
A+
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 12 avril 2006 à 18:18
Vous en pensez quoi des missiles à tête chercheuse? C'est pas un peu trop facile lorsqu'on les a?
J'ai l'impression que la difficulté est trop faible non?
Kleidp
Messages postés124Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention10 février 2008 12 avril 2006 à 11:25
oO Je viens d'essayer de tester ton jeu en mode "Compatible windows 95" et ca fonctionne bien ^^
Kleidp
Messages postés124Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention10 février 2008 12 avril 2006 à 11:15
Ok Luthor je comprend mieux l'interet d'une classe singleton (reste plus qu'a l'utiliser :).
Pour les ennemis j'ai fait comme tu as dit Pistol, je les recréer juste en haut de l'écran. Par contre ne prend pas mon jeu comme un exemple de bonne programmation, je suis justement en train de le réécrire en objet et il y a beaucoup d'endroit pas optimisé du tout ^^. Par contre c'est un bon exemple pour voir qu'il faut bien séparer le code de l'affichage, ce que je n'ai pas fait pour les météorites et le texte qui s'affiche en bas (et on voit le résultat :).
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 11 avril 2006 à 19:01
Pour ce qui est de la gestion des ennemis, à chaque fois que l'on tue un ennemi, celui-ci est recreer de manière aléatoire n'importe où sur l'écran. Je sais c'est pas terrible, j'aurais du les créer à l'extérieur de l'écran et les déplacer vers l'intérieur. Comment tu as fait pour ton shoot kleidp ?
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 11 avril 2006 à 17:39
Ah oui j'avais une question a propros du jeu.
Pourquoi quand je touche un ennemi, il se téléporte sur un autre endroit de l'écran ?
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 11 avril 2006 à 17:27
Pourquoi pas des variables globales ?
- Deja pasque c'est chiant à gérer. Imagine tu veux rajouter une variable, tu dois la définir en extern partout. Mais bon.
- Ensuite surtout par sécurité. Tu peux modifier accidentellement une variable globale, alors que si tout est encapsulé, il n'y pas plus trop de risque. Qui n'a jamais écrit : if (a = 4) {...} ?
et a perdu un temps fou pour détecter l'erreur.
Ensuite, pourquoi une classe singleton et pas une classe normal ? D'un point de vue sécurité, ca évite toute sorte de copie éventuelle de l'objet. Et la mettre en singleton, ca coute rien. Doit ensuite y avoir d'autres raisons, mais elles me viennent pas a l'esprit.
Autre exemple, la console dans un jeu. Pourquoi pourrait ton déclarer deux consoles ? Faut faire en sorte de pas pouvoir, donc on met ca en singleton. Mais faut pas se dire" mais le programmeur est pas con, il va pas en créer deux". Ah bon ?
Ensuite pour la pause, évidemment que ca sera détecter par le clavier. Mais quand tu as un jeu graphique, il est logique (et svt vital !) de séparer l'affichage et le calcul des positions (en gros tout ce qui n'est pas graphique). Mettre un jeu en pause, ne met pas en pause l'affichage, mais juste le thread qui s'occupe du calcul des trajectoires et autres.
Donc dans ton prog principal, quand tu détectes l'appuis sur P, tu éxécutes la fonction game->Toggle_pause() par exemple.
Tout le pb ici, c'est de séparer ce qui n'est pas lié. Pour mettre un jeu en pause, c'est pas forcément la touche "P". Mais on s'en fou. Tout ce que l'on sait, c'est que le doit etre pouvoir etre mis en pause, donc on créé la fonction pour ca. Savoir quand on mettra la pause, c'est un autre problème, mais pas celui du singleton. C'est ce que l'on appelle la programmation modulaire non ? cad de voir chaque partie indépendemment les unes des autres.
Enfin voila, mon avis, je suis ouvert au débat :)
++
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 11 avril 2006 à 15:13
Salut à tous. Merci de vos remarques. Tu as tout à fait raison Kleidp, je ne tire pas avantage de toutes les possibilités de la programmation objet. Je débute en prog objet et j'ai beaucoup à apprendre. Maintenant que j'ai plus avancé dans mes cours, je me rend compte de mes erreurs mais j'avais la flème de tout reprendre.
Le crochet sera reparé ce soir. Effectivement j'ai du supprimer une ligne de code par inadvertance.
Pour ce qui est du timer, je ne comprend pas pourquoi t'arrive pas à compiler. Toutes ses fonctions viennent de time.h et windows.h.
Tu utilises Linux?
Kleidp
Messages postés124Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention10 février 2008 11 avril 2006 à 13:44
Ahh, c'est la seconde fois que je vois quelqu'un parler de classe singleton cette semaine. Alors j'ai essayé de me renseigner mais je vois mal l'interet d'une tel classe !
Copier-Coller d'une phrase qui résume bien ce que j'ai pu lire sur le singleton:
"Le modèle singleton permet une instanciation unique d'une classe de manière plus sûre que l'utilisation de variables globales."
Donc déja, j'ai jamais compris pourquoi l'utilisation de variables globale n'est pas sure (et j'arrete pas de le lire, donc ça serait bien que je sache enfin)!
Ensuite prenons l'exemple de mettre en pause le jeu, en quoi inclure ceci dans une classe singleton est un avantage par rapport a une procedure de détection du clavier ?
PS: C'est vrai que j'ai été un peut vite quand j'ai écrit "dans ton main()", bien sur je fait avancer l'ennemi dans une procedure IA, puis cette procedure dans le main. Donc meme question que plus haut :)
Merci pour tes explications
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 11 avril 2006 à 12:03
Je pense pas que le main doit jouer ce role de faire avancer les ennemis.
Pour moi, l'idéal est de créer une classe singleton "game" qui s'occupe de faire avancer les ennemis, de démarrer la partie, de mettre en pause, etc... Chaque ennemi est bien sur une classe à part dérivant tous d'une classe virtuelle pure de base qui permet d'avoir une structure simple dans la classe singleton. Genre un vector<Cennemi_base*>.
Enfin, a mon avis, ya rien a mettre dans le main.
Kleidp
Messages postés124Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention10 février 2008 11 avril 2006 à 10:47
Salut,
Je vais devoir dire quelque chose que tu redoute peut être, ça ne fonctionne pas (sur mon PC du moins :). A mon avis ça doit venir de ta façon de gérer le timer, mais j'y connais rien sur time.h, clock() et slip(), donc je peux pas trop t'aider.
Sinon juste un (gros ?) conseil, revois les cours sur la programmation objet (ne le prend pas mal :). Tu as fais énormément d'erreurs dans ta classe (tu n'en utilise qu'une seule !). Je pense que tu n'as pas compris à quoi sert ce type de programmation. En fait l'un des avantages des classes est que l'on peut facilement les réutiliser dans d'autres programmes. Donc tu ne peux pas instancier dedans (etoile ETOILE[100]), utiliser les avion1.Open(..), utiliser des boucles sur le nombre d'ennemis par exemple. Tout ça doit être séparé de ta classe. Une classe se compose de variables (private ou protected dans la majorité des cas) et de méthodes (public). Par exemple si tu veux faire avancer des ennemis (dans ton main() ) :
Ennemi Ennemis[10] ;
For(i=0 ;i<Ennemi::GetNombre() ;i++) <- Méthodes static accedant a une variable static
{
Ennemis[i].Anvance(2) ;
}
Voila bon courage si tu veux remodifier ton code, sinon n'hésite pas a juste poster une modif sur le problème de timer, j'étais curieux de voir comment fonctionne le crochet.
Orikata
Messages postés8Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention11 juillet 2006 10 avril 2006 à 16:02
chez moi le crochet n'attrape rien (j'ai lancé le .exe directement)
14 janv. 2007 à 19:58
http://pistol.petesampras.free.fr
A+
12 avril 2006 à 18:18
J'ai l'impression que la difficulté est trop faible non?
12 avril 2006 à 11:25
12 avril 2006 à 11:15
Pour les ennemis j'ai fait comme tu as dit Pistol, je les recréer juste en haut de l'écran. Par contre ne prend pas mon jeu comme un exemple de bonne programmation, je suis justement en train de le réécrire en objet et il y a beaucoup d'endroit pas optimisé du tout ^^. Par contre c'est un bon exemple pour voir qu'il faut bien séparer le code de l'affichage, ce que je n'ai pas fait pour les météorites et le texte qui s'affiche en bas (et on voit le résultat :).
11 avril 2006 à 19:01
11 avril 2006 à 17:39
Pourquoi quand je touche un ennemi, il se téléporte sur un autre endroit de l'écran ?
11 avril 2006 à 17:27
- Deja pasque c'est chiant à gérer. Imagine tu veux rajouter une variable, tu dois la définir en extern partout. Mais bon.
- Ensuite surtout par sécurité. Tu peux modifier accidentellement une variable globale, alors que si tout est encapsulé, il n'y pas plus trop de risque. Qui n'a jamais écrit : if (a = 4) {...} ?
et a perdu un temps fou pour détecter l'erreur.
Ensuite, pourquoi une classe singleton et pas une classe normal ? D'un point de vue sécurité, ca évite toute sorte de copie éventuelle de l'objet. Et la mettre en singleton, ca coute rien. Doit ensuite y avoir d'autres raisons, mais elles me viennent pas a l'esprit.
Autre exemple, la console dans un jeu. Pourquoi pourrait ton déclarer deux consoles ? Faut faire en sorte de pas pouvoir, donc on met ca en singleton. Mais faut pas se dire" mais le programmeur est pas con, il va pas en créer deux". Ah bon ?
Ensuite pour la pause, évidemment que ca sera détecter par le clavier. Mais quand tu as un jeu graphique, il est logique (et svt vital !) de séparer l'affichage et le calcul des positions (en gros tout ce qui n'est pas graphique). Mettre un jeu en pause, ne met pas en pause l'affichage, mais juste le thread qui s'occupe du calcul des trajectoires et autres.
Donc dans ton prog principal, quand tu détectes l'appuis sur P, tu éxécutes la fonction game->Toggle_pause() par exemple.
Tout le pb ici, c'est de séparer ce qui n'est pas lié. Pour mettre un jeu en pause, c'est pas forcément la touche "P". Mais on s'en fou. Tout ce que l'on sait, c'est que le doit etre pouvoir etre mis en pause, donc on créé la fonction pour ca. Savoir quand on mettra la pause, c'est un autre problème, mais pas celui du singleton. C'est ce que l'on appelle la programmation modulaire non ? cad de voir chaque partie indépendemment les unes des autres.
Enfin voila, mon avis, je suis ouvert au débat :)
++
11 avril 2006 à 15:13
Le crochet sera reparé ce soir. Effectivement j'ai du supprimer une ligne de code par inadvertance.
Pour ce qui est du timer, je ne comprend pas pourquoi t'arrive pas à compiler. Toutes ses fonctions viennent de time.h et windows.h.
Tu utilises Linux?
11 avril 2006 à 13:44
Copier-Coller d'une phrase qui résume bien ce que j'ai pu lire sur le singleton:
"Le modèle singleton permet une instanciation unique d'une classe de manière plus sûre que l'utilisation de variables globales."
Donc déja, j'ai jamais compris pourquoi l'utilisation de variables globale n'est pas sure (et j'arrete pas de le lire, donc ça serait bien que je sache enfin)!
Ensuite prenons l'exemple de mettre en pause le jeu, en quoi inclure ceci dans une classe singleton est un avantage par rapport a une procedure de détection du clavier ?
PS: C'est vrai que j'ai été un peut vite quand j'ai écrit "dans ton main()", bien sur je fait avancer l'ennemi dans une procedure IA, puis cette procedure dans le main. Donc meme question que plus haut :)
Merci pour tes explications
11 avril 2006 à 12:03
Pour moi, l'idéal est de créer une classe singleton "game" qui s'occupe de faire avancer les ennemis, de démarrer la partie, de mettre en pause, etc... Chaque ennemi est bien sur une classe à part dérivant tous d'une classe virtuelle pure de base qui permet d'avoir une structure simple dans la classe singleton. Genre un vector<Cennemi_base*>.
Enfin, a mon avis, ya rien a mettre dans le main.
11 avril 2006 à 10:47
Je vais devoir dire quelque chose que tu redoute peut être, ça ne fonctionne pas (sur mon PC du moins :). A mon avis ça doit venir de ta façon de gérer le timer, mais j'y connais rien sur time.h, clock() et slip(), donc je peux pas trop t'aider.
Sinon juste un (gros ?) conseil, revois les cours sur la programmation objet (ne le prend pas mal :). Tu as fais énormément d'erreurs dans ta classe (tu n'en utilise qu'une seule !). Je pense que tu n'as pas compris à quoi sert ce type de programmation. En fait l'un des avantages des classes est que l'on peut facilement les réutiliser dans d'autres programmes. Donc tu ne peux pas instancier dedans (etoile ETOILE[100]), utiliser les avion1.Open(..), utiliser des boucles sur le nombre d'ennemis par exemple. Tout ça doit être séparé de ta classe. Une classe se compose de variables (private ou protected dans la majorité des cas) et de méthodes (public). Par exemple si tu veux faire avancer des ennemis (dans ton main() ) :
Ennemi Ennemis[10] ;
For(i=0 ;i<Ennemi::GetNombre() ;i++) <- Méthodes static accedant a une variable static
{
Ennemis[i].Anvance(2) ;
}
Un lien qui devrait t'aider : http://www.esil.univ-mrs.fr/~chaouiya/C++/coursCourcelle/
Tu peux me mailer si tu n'as pas bien compris a quoi sert la programmation objet (C'était le plus difficile dans mon cas :)
Voila bon courage si tu veux remodifier ton code, sinon n'hésite pas a juste poster une modif sur le problème de timer, j'étais curieux de voir comment fonctionne le crochet.
10 avril 2006 à 16:02