Session du 09 mars 2023 à 20h00
Veille & Discussions
Frontend & UI
Programmation Orientée Objet (POO)
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Découvrir les properties Python avec Pygame
Exploration des properties en Python dans une classe de compte bancaire, puis introduction à Pygame pour créer un petit jeu avec interface graphique.
00:00:00 :L'enregistrement est parti.Vous voyez là que ça enregistre?Ok, très bien.Je vais partager mon micro.Et on est bon.Ok, donc là vous voyez, est-ce que vous voyez bien mon écran?
00:00:20 :Ok, nickel.Et puis c'est bon, on va y aller.Donc je vais enlever ma caméra.Ok, donc là on est bon.On va y aller.
00:00:41 :Donc on va y aller.Ok, du coup je vous propose aujourd'hui qu'on voit, je ne sais plus, la dernière fois il y a quelqu'un qui m'a demandé de voir le jeu du labyrinthe.
00:01:06 :Du coup ce que je vous propose c'est qu'on voit, ah ok ça va tard, du coup ce que je vous propose si ça te va, c'est qu'on voit Pygame aujourd'hui,donc le programme que j'ai prévu comme ça c'est plus fluide et puis on essaiera du coup la prochaine fois de faire le labyrinthe mais avec Pygame.
00:01:21 :Ça peut être intéressant.Parce qu'en fait là l'exercice qui est proposé c'est en ligne de commande, je crois, il n'y a pas d'interface graphique etc.
00:01:36 :mais vous verrez qu'avec Pygame on peut faire des choses assez sympa, assez facilement.Du coup je voudrais revenir d'abord, je pense qu'il n'est pas là aujourd'hui mais c'était une question de Gabriel, une remarque sur les properties.
00:01:53 :Je sais que j'en ai déjà parlé mais c'est assez important dans les classes les properties.Du coup je propose qu'on revoie ça maintenant.Donc en gros voilà comment on définit une propriété, en fait il faut imaginer que, je vais copier ici le code.
00:02:14 :14...Ok donc,On va voir si ça ouvre bien.Alors en fait quand on a une classe comme celle-ci,Je vais peut-être, je vais pas, je vais commenter, numéro,Donc imaginez qu'on a une classe comme celle-là, donc on va faire run,Donc là, je vais juste vérifier que ça fonctionne bien.
00:03:11 :Donc du coup on va dire que c'est le compte de Jean, le numéro c'est 12345,Il est propertier, et on va dire qu'il commence avec 1500€ sur son compte.
00:03:30 :Ok donc là en fait j'ai un compte, et si je fais compte, du coup non, c'est le compte, son numéro,Pourquoi il marche pas?Ok, il fait ça.
00:04:12 :Donc là en fait j'ai créé une classe, donc une classe c'est tout simple, pour ceux qui connaissent pas,ça vous permet de définir vos propres objets.
00:04:22 :Donc en gros là j'ai défini une classe compte, avec les paramètres nom, numéro et balance,et ici je définis les attributs de la classe, qui va me permettre quand je vais instancier un objet de la classe,je vais pouvoir accéder à ces attributs là.
00:04:37 :Donc là vous voyez j'ai créé, oui Salvatore?Vas-y tu peux poser ta question, je t'écoute ou je te lis.Désolé c'est trop petit en fait les caractères, tu peux les agrandir?
00:04:53 :Bien sûr, bien sûr, désolé, pas de soucis.Bon là comme ça vous voulez encore un peu plus gros, parce qu'après si c'est trop gros,moi j'ai du mal à manipuler, mais là ça devrait aller pour tout le monde,dites moi si c'est bon là?
00:05:08 :Ok, donc là rien d'exceptionnel, j'ai créé une classe compte, ici le init c'est un constructeur,et avec ces attributs là, si vous ne connaissez pas et que vous ne comprenez pas,il n'y a pas de soucis, vous allez voir, c'est vraiment purement de la programmation orientée objet,donc là il n'y a pas de difficulté, et si vous êtes perdu, n'hésitez pas à aller voir sur la plateforme,
00:05:36 :il y a tout ce qu'il faut pour ça.Donc là en fait on est content, on a créé une classe qui nous permet de créer un compte,donc là je vous le dis j'ai mon compte, juste un aparté, quand j'affiche mon compte,j'ai un truc un petit peu sale comme ça, qui montre l'adresse de là où est créé mon objet,
00:05:57 :si je veux pallier ce problème, je peux dire, j'aimerais que quand je fais appel à mon objet,j'ai une représentation graphique un peu plus sympa,et donc là vous pouvez dire, en fait c'est le compte de, et puis là je mets le nom,donc je mets self.nom, de numéro, et là je mets self.numéro,
00:06:26 :avec une somme, et puis là je mets self.balance.Maintenant je vais relancer, et maintenant si je fais arrêter mon compte,et que maintenant je fais compte,donc en fait cette petite méthode spéciale REPR qui me permet d'obtenir une meilleure représentationde mon objet lorsque je fais juste l'instance, et au lieu d'avoir ce truc un peu nul et jouffle,
00:07:22 :le truc avec main etc, l'adresse, j'ai juste ça, c'est juste un aparté,et donc du coup ce qui est, là vous voyez avec les attributs,en fait les attributs sont modifiables à la volée,donc ça veut dire que, imaginez que j'ai déjà construit mon compte,donc là j'ai compte égal, je l'ai créé comme ça,
00:07:41 :si je vais voir forcément le compte, la balance par exemple, compte.balance, j'ai 1500.Mais si je suis un petit malin et que je dis en fait j'aimerais bien changer dans la banque ma somme,alors qu'en fait j'ai pas cet argent, je peux très bien dire compte.
00:08:00 :Imaginez par exemple que la première fois qu'il a été créé, c'est la banque qui l'a créé,en disant bon ben voilà t'as 1500,mais moi en fait je peux aller dire compte.balance égal, on va dire pour être gourmand, 20 000.
00:08:14 :Donc maintenant si je fais compte.balance, hop j'ai 20 000.Mais vous voyez bien que c'est un petit peu facile en fait,non il faut pas, si la banque elle crée une classe comme ça pour pouvoir identifier les comptes de chacun,il faut pas en fait qu'elle laisse la possibilité à l'utilisateur de changer la balance,
00:08:34 :le montant qu'il a sur son compte.Par contre vous voulez que les gens, ils puissent quand même accéder au montant qu'ils ont sur leur compte.
00:08:45 :Donc en fait ce qu'on va faire, ce qu'on fait avec les properties,c'est un moyen de définir un espèce d'attribut en lecture seule,c'est à dire on peut y accéder, on peut le checker, on peut le voir,par contre on peut pas le modifier.
00:08:58 :Et en fait c'est à ça que sert Property.Donc on va le faire ici, je vais le décommenter.Bon ça ok vous avez capté.Et en fait je vais plutôt le faire sur la balance, parce qu'en fait on s'en fiche.
00:09:18 :En fait c'est un petit peu, ça peut paraître un peu bizarre la manière dont on le fait,mais en gros ce qu'on fait ici, c'est que notre attribut,il va pas s'appeler balance comme on l'appellerait comme ça sans underscore,on va l'appeler avec un underscore.
00:09:37 :Parce qu'en fait vous allez voir ici, si je fais run property, pas de soucis pour le retard,je recrée mon compte, compte égal, ok,37 attributs, 7 numéros, allez.
00:10:11 :Donc là vous voyez en fait je peux toujours accéder à ma balance,j'avais initialisé à 1500, par contre si j'essaye de faire compte égal 20 000,ah pardon là j'ai fait n'importe quoi,là si je fais compte balance, j'ai 1500,et si je fais compte et que je veux le changer, que je dis 20 000,
00:10:40 :en fait il me dit non, tu peux pas attribuer une nouvelle valeur,par contre je peux toujours y accéder, y'a pas de soucis.Compte, balance, voilà, là il me l'affiche.
00:10:51 :Ok donc en gros c'est comme ça qu'on utilise les attributs,je vais pas aller plus loin parce qu'en fait,pour ceux qui connaissent pas ça peut paraître un petit peu flou,en fait j'ai même pas besoin de numéros.
00:11:03 :Donc en gros si vous voulez protéger un attribut,donc ici moi je veux protéger balance,en fait je lui dis, je le définis avec un underscore,et la manière dont il est défini, il se définit seulement ici,et en fait c'est juste une convention de nommage,c'est à dire que quand vous êtes un développeur,
00:11:20 :ou que vous utilisez des classes, vous savez que si vous faites,parce qu'après moi je peux toujours faire ça,compte balance égal 1000, là y'a pas de soucis, ça marche,par contre, il me l'a bien mis à jour,mais en fait il y a quelque chose qui doit vous mettre la puce à l'oreille,
00:11:45 :quand vous attribuez ici un paramètre, un attribut d'instance avec un underscore,vous devez vous dire que c'est interdit, en fait vous avez pas le droit de faire ça.
00:11:57 :C'est possible parce qu'en fait en Python y'a pas comme dans les autres langages de programmationavec les attributs privés etc, vous savez quand on définit un private ou des choses comme ça,là en fait en Python y'a pas, c'est juste une convention de nommage.
00:12:11 :Donc en fait cette gymnastique de dire je définis mon attribut avec un underscore,et en fait je le définis dans ma property ici,c'est un moyen de protéger, d'empêcher que les gens puissent mettre la valeur qu'ils veulent.
00:12:26 :Donc ça c'est la manière de définir un attribut en lecture seule.Voilà je sais pas si c'est clair pour vous, l'idée c'est pas de vous faire le cours de property etc,mais peut-être que comme ça quand vous le verrez sur la plateforme,vous comprendrez un petit peu plus l'intérêt.
00:12:44 :Dites moi dans le chat si vous voulez que j'aille plus loin.Il est permissif avec la convention, en fait ouais le truc c'est que c'est vraiment,ouais j'ai pas d'autres mots, je peux pas le dire plus clairement,que c'est la manière de définir un attribut en lecture seule.
00:13:10 :Et après si vous vouliez aller plus loin, il faudrait définir un setter.En fait le setter ça vous permet de contrôler la valeur que vous voulez mettre.
00:13:24 :Par exemple si je voulais dire def balance self value,là vous dites en fait if value est plus petite que 100 000,et bien je veux bien, tu peux faire le retour,donc là il faut définir self balance égal value.
00:13:59 :Donc en fait avec ce setter là, vous allez lui dire en fait seulement,je vais pouvoir attribuer des valeurs, mais à partir du moment où je vais être supérieur à 100 000,et bien il va me dire non tu peux pas, parce que grâce à mon setter,j'ai pu contrôler la manière dont il a attribué.
00:14:17 :Je vais voir si ça fonctionne.Donc là je redéfinis un compte, je vais dire compte d'av,donc là maintenant si je fais compte balance je fais bien 1500,si je fais compte balance égal 20 000, ça fonctionne toujours,parce que je ne suis pas dans la condition de mon setter.
00:14:46 :Par contre si je fais compte balance égal 150 000, ça va fonctionner.Ah oui attendez j'ai un petit peu été plus loin, 150 000, pourquoi il fonctionne?
00:15:10 :Je pense que vous avez compris le concept, je ne veux pas mettre d'erreur.Maintenant si je fais compte balance égal, on va y aller fort.
00:15:47 :Vous voyez qu'avec ce genre de setter là, c'est pas grave si vous ne retenez pas la syntaxe,je vous montre juste comment ça fonctionne,ça vous permet de contrôler les valeurs que l'utilisateur va mettre dans votre instance.
00:16:07 :Donc voilà je voulais juste revenir dessus parce que c'est important, on le voit souvent,et parfois quand on le découvre pour la première fois, on se dit putain c'est quoi ce truc là,moi je vous avoue quand j'ai vu ça je me suis dit je ne m'en servirai jamais,
00:16:20 :et au moment où j'ai découvert et que j'ai compris comment ça fonctionnait,je m'en sers souvent parce que c'est important,et surtout quand vous faites de l'héritage de classe etc,ou quand des développeurs ils utilisent vos classes,vous voulez vraiment contrôler, ça vous permet de faire attention à comment les gens utilisent votre classe,
00:16:37 :et pour ne pas se faire avoir tout simplement,les gens peuvent dire bah ouais mais ta classe elle me permettait de le faire,et du coup il y a des erreurs et c'est à cause de toi,en gros c'est aussi un moyen de se protéger et de protéger les attributs.
00:16:51 :Est-ce que vous avez des questions là-dessus, ou est-ce que c'est bien,est-ce que vous voulez passer à autre chose?Ok si ça vous va je passe à autre chose.
00:17:09 :Bah oui j'imagine qu'on peut en fait,imagine si on disait, alors comment on pourrait faire ça,je vais tester en live mais je ne suis pas sûr que c'est la bonne manière,donc imagine que tu veux lui attribuer une nouvelle valeur,et en fait dans le setter tu vas dire,
00:17:37 :password, pass égal, on va dire input,donc là ça va être un input,et donc là après on va mettre un saut de ligne,et ensuite on va ici donc au lieu de mettre if value machin,on va dire if pass, on va dire que le mot de pass égale,
00:18:15 :vous voulez qu'on va mettre docstring,on va lui attribuer la valeur, par contre si c'est pas égal à docstring le mot de pass,on va dire mauvais mot de pass.
00:18:28 :Ok donc on va relancer ça,alors compte, on recrée le compte,maintenant je vais dire compte.balance égale 26,mot de pass pour pouvoir changer, je vais mettre docstring, il me l'a changé j'imagine,compte.balance, et si par exemple maintenant je fais compte.balance égale 100 000,
00:19:13 :et que maintenant je mets juste pass, il me dit non tu ne peux pas changer.Donc en fait ça peut être un moyen le setter de pouvoir changer,après là je l'ai un petit peu fait à l'arrache,parce que normalement quand tu as un password il faut cacher ça etc,
00:19:29 :mais en gros tu vois que le fait de mettre un setter,c'est dès que je vais faire mon objet.attribuégale quelque chose,ça va appeler cette méthode là.
00:19:41 :En fait c'est implicitement, on ne dit pas exactement l'appel,mais dès qu'on va faire attribuégale, il va venir l'appeler,et du coup quand il l'appelle il fait tout ce qu'il y a dans la fonction.
00:19:50 :Donc oui ça marche Seb, bonne question.Pas de soucis pour le retard, bienvenue.Est-ce que vous avez d'autres questions?Si Farfelu soit elle, il n'y a pas de soucis.
00:20:06 :Je ne dis pas qu'elle était Farfelu ta question Seb,je dis juste que n'ayez pas peur de poser des questions,même si vous vous dites elle est stupide ma question.
00:20:15 :Il n'y a aucune question stupide.Ok, n'hésitez pas à revenir si jamais vous avez d'autres questions,c'est pas parce qu'on est passé à autre chose que je ne vais pas y répondre,je suis là pour ça.
00:20:34 :Du coup je vous propose qu'on fasse, je vais vous faire une petite démo avant,je n'ai pas tout montré, j'espère qu'on aura le temps,mais ce que je vous propose c'est qu'on fasse ce petit jeu.
00:20:52 :En fait vous voyez le carré bleu,en fait le taux de rafraîchissement n'était pas top,mais en gros l'idée c'est de créer ce petit jeu,où en fait nous on est le carré rouge,donc là vous voyez c'est moi qui déplace de gauche à droite,et on imagine qu'il y a un carré bleu qui représente un boulet de canon,
00:21:14 :ou quoi que ce soit, qui nous tombe dessus,et l'objectif c'est de l'éviter.C'est hyper simple, mais du coup vous pouvez vous dire,je vous montre en 30 minutes comment on peut développer ça,après vous pouvez imaginer plein de choses,vous savez les jeux de vaisseaux spatiaux,où on tire l'espèce Invader etc,
00:21:35 :en fait c'est ce concept là.Donc là regardez, je ne vais pas faire attention,je vais faire entrer en collision mon rouge et mon bleu,et là il y a eu la collision,et du coup il a arrêté et il quitte le jeu.
00:21:48 :Donc voilà, si ça vous dit,je vous propose qu'on fasse ce petit jeu,avec la librairie Pygame.Ça vous va? Ok.Bon, allons-y.Je vais juste vous montrer peut-être,une vision globale du code.
00:22:09 :Donc là c'était les properties.Alors en fait ce qu'on va d'abord faire,on va faire la structure du projet,donc en gros on va définir la fenêtre,comment on fait pour gérer les différents événements du clavier.
00:22:24 :Ensuite on va ajouter un joueur,donc un joueur ça va juste être le dessin du joueur.Là je vous les mettrai à disposition,le script c'est pas compliqué.
00:22:35 :Ensuite on verra comment on fait pour ajuster la vitesse de rafraîchissement,vous le savez, je sais pas si vous jouez aux jeux vidéo sur un ordinateur,mais on entend souvent parler de FPS.
00:22:45 :En fait FPS c'est frames per seconde,et en fait c'est le taux de rafraîchissement,c'est-à-dire c'est le nombre d'images par seconde,c'est un peu la mise à jour de l'image par seconde.
00:22:56 :Par exemple si on dit 60 FPS,ça veut dire qu'en une seconde,on va avoir 60 images différentes.Donc on verra comment on peut ajouter ça,et ensuite dans une dernière étape,on verra comment on fait pour ajouter l'ennemi,donc c'était le carré bleu,et comment on fait pour gérer la collision entre les deux.
00:23:16 :Et en fait vous verrez que,là ce que je vous montre,par exemple si vous avez fait du PieSide ou du PkInter,vous pouvez vous dire qu'en fait on peut faire exactement pareil avec.
00:23:27 :Oui, tout à fait.Par contre, PieGame c'est très bien parce que,par exemple la collision entre le joueur et l'ennemi,elle est gérée automatiquement.Donc c'est pour ça.
00:23:37 :En fait PieGame, j'imagine que derrière il y a du PkInter,je ne sais pas exactement.Mais ça repose sur les mêmes principes,c'est juste qu'en fait ils mettent à disposition des méthodes,et voilà.
00:23:47 :Donc c'est beaucoup plus simple de créer un jeu avec PieGame.Donc la structure du projet.En gros, je vais peut-être tout prendre.On va essayer d'y aller.
00:24:03 :C'est bien en fait si je le fais petit à petit.Vous pouvez voir un peu le cheminement.Je vais garder ma correction,et comme ça je peux voir aussi.
00:24:21 :Ok, donc on commence par importer PieGame.Moi j'ai bien installé,mais il suffit de juste faire un pip install PieGame.Et ça on va faire un PieGame,je ne vais pas le mettre,comme ça vous verrez le message d'erreur.
00:24:33 :Ici on va juste définir la largeur et la hauteur de notre fenêtre.On en a besoin pour le jeu.Donc là je vais lui dire que c'est du 800 par 800,donc c'est un carré, c'est plus simple.
00:24:46 :Et ici on va lui définir la fenêtre justement.En gros, là on lui dit, tu m'affiches la fenêtre que j'ai demandé.Donc cette mode, et on doit lui rentrer un tuplé avec la largeur et la hauteur.
00:25:02 :Donc là déjà on est bien.Pour l'instant on a juste défini ça.Et maintenant ce qu'il faut, c'est définir une main loop.Je ne sais pas si vous avez déjà fait du TKinter,mais ça marche un peu toujours de la même manière.
00:25:15 :Il faut faire une boucle,et en fait ce qu'on va faire,c'est on va essayer de choper les événements à chaque rafraîchissement.Donc ce qu'on fait, c'est qu'on définit une boucle principale,et on va lui dire, on va définir une variable, run, pour le lancement.
00:25:36 :Et on va dire que tant que ça tourne,tant qu'il n'y a pas eu d'événement qui m'empêche de faire tourner la fenêtre,on va aller chercher les événements du clavier.
00:25:51 :Donc là on va dire for event in pygame.event.get.Là en fait ça va permettre de, vous savez quand vous avez une fenêtre qui s'ouvreet que vous faites la croix, ça va lui permettre de dire,en fait s'il retrouve cet événement là,donc pour lui dire, si on va appuyer sur la croix de la fenêtre,
00:26:15 :vous allez voir après comment ça fonctionne,et bien on va lui dire, bah tu quittes.Si il tombe sur pygame.quit,et bien là en fait on va mettre la variable run à false,et donc vous voyez que si on met run à false,et bien la boucle ici, celle là, elle va se terminer.
00:26:32 :Donc là c'est un test d'égalité, ok,et on va quitter le jeu.pygame.quit, ok.Donc là en fait, et puis moi je mets toujours un retourne non dans les fonctions.
00:26:48 :Là j'ai pas fait grand chose,en fait il suffit juste de suivre la doc,par exemple si vous allez voir la doc de Pygame,tout ça c'est indiqué, c'est pas moi qui l'ai inventé.
00:26:59 :Et donc là on va faire, ok.Donc normalement on va lancer ça,je vais réduire un peu juste pour qu'on voit,juste pour récapituler,donc en gros on a créé une fenêtre,on lui a dit display, en anglais ça veut dire affiche,on lui dit cette mode, ça c'est la méthode qui permet de lui définir la largeur et la hauteur,
00:27:27 :et on a fait la boucle, etc.Donc là maintenant si je lance ça,il m'affiche cette fenêtre là,donc c'est bon vous la voyez,et la fenêtre, voilà donc là il se passe rien,et si je clique ici,il a remarqué que je faisais l'event type Pygame quit,et du coup il me met un false et il quitte.
00:27:51 :Ok, donc maintenant, qu'est-ce qu'on avait dit d'autre?Voilà, je pense que là on est bon pour ça.Maintenant ce qu'on aimerait faire c'est ajouter un joueur,ce que j'avais mis ici.
00:28:09 :Donc ça on a fait la structure de notre projet,maintenant on voudrait ajouter un joueur.Donc pour ajouter un joueur c'est tout simple,il nous met à disposition,en fait le joueur c'est quoi?
00:28:20 :Ça va être un rectangle,et le rectangle c'est juste un tuplé,en fait un tuplé de deux tuplés,dans lequel on lui donne sa position initiale,donc son X et son Y,et sa largeur et sa hauteur du joueur.
00:28:37 :Et après ce qu'il va falloir faire,il va falloir afficher le joueur.Je vais vous montrer.Donc allons-y pour le joueur,ce qu'on fait c'est qu'on définit la position initiale du joueur,donc on lui dit player Pygame.
00:28:58 :Donc là vous voyez directement,c'est des méthodes qui existent déjà.Donc là comme je l'ai dit, c'est deux tuplés,on lui donne la position initiale,donc moi je vais dire 400,ça veut dire qu'à 400 il va se retrouver à la moitié en X,et je vais lui dire 600 en Y,
00:29:14 :je vais vous montrer après à quoi ça correspond,et on va devoir définir ici le joueur,on va dire sa largeur,on va lui dire qu'il fait 40,et player 8,on va lui dire qu'il fait 40 aussi,et donc maintenant je lui dis player,du coup c'est d'abord dans ce sens là,
00:29:40 :et après player.Donc là j'ai juste défini mon joueur pour la fin,si je lance mon programme,il n'est pas du tout affiché,je l'ai juste défini.
00:29:52 :Et maintenant ce qu'il faut c'est que,en fait là le while run,c'est un peu comme si on se retrouvait sur,vous savez une vidéo c'est un enchaînement d'images,et en fait le while run il faut le voir comme ça,c'est à dire qu'il va prendre la fréquence d'horloge du process,
00:30:08 :donc du programme Python,et à chaque fois qu'il tombe sur,imaginez un chronomètre,vous dites 1, 2, 3, 4,et en fait à chaque fois qu'il tombe sur un chiffre,1, 2, 3, 4,il va afficher quelque chose,ou il va aller récupérer,est-ce que l'utilisateur a tapé sur un événement, etc.
00:30:28 :Donc nous ce qu'on va faire c'est que à chaque événement d'horloge,à chaque frame,on va vouloir afficher le joueur.Donc pour ça on va se définir une fonction,je vais le faire comme ça d'abord,comme ça vous verrez,et après il y a une petite subtilité,à chaque fois il faudra rafraîchir,
00:30:56 :mais pour l'instant vu qu'on ne fait pas bouger le joueur,je n'en ai pas besoin.Donc ce qu'on va faire,on va dire IGame,et là on va dire,c'est une méthode qui permet de dessiner des rectangles.
00:31:11 :Et donc lui il ne prend pas un argument,il prend la fenêtre sur laquelle on le dessine,il prend la couleur qu'on va vouloir utiliser pour dessiner notre objet,donc là on va mettre red,et du coup il prend le joueur.
00:31:25 :Donc si je lance E, qu'est-ce qu'il faut?Est-ce qu'il faut un update?Non pour l'instant on n'a pas besoin d'update,parce qu'en fait il n'y a pas de mouvement.
00:31:35 :Ok ça ne marche pas,est-ce qu'on a peut-être besoin de l'update?Donc là en fait j'ai dessiné mon rectangle à l'endroit où je l'ai dit,je lui avais dit 400,donc normalement c'est la moitié parce que j'ai dit 800,et 600.
00:32:00 :En fait ça se lit comme ça le XY,ici c'est les X,sur ma souris, je ne sais pas si vous voyez bien,ma souris de gauche à droite c'est les X,donc là en fait je suis à 0,0,là je suis en X positif,et là quand je descends comme ça j'augmente les Y.
00:32:18 :Donc là je lui ai dit 400 et 600,c'est pour ça qu'il se retrouve à peu près ici.Ok et maintenant ce qu'on aimerait faire,c'est faire bouger ce carré rouge avec notre clavier.
00:32:32 :Donc en gros maintenant ce qu'il faut faire,c'est d'aller récupérer tous les événements que va voir notre programme.Donc là pour ça,il suffit juste d'aller chercher case pour les touches qu'on tape,et on dit pykm.getpress.
00:32:59 :Donc en fait si je lui dis ça,ça veut dire qu'il va mettre dans un dictionnairetoutes les touches qui ont été pressées à chaque seconde.
00:33:11 :Enfin je dis chaque seconde mais c'est à chaque boucle d'itération,c'est une boucle infinie,et à chaque étape il va aller chercher toutes les clés,enfin toutes les touches tapées.
00:33:20 :Et on va dire maintenant if case,parce que c'est un dictionnaire,donc on peut aller chercher ici pykm.Et là vous voyez que si je tape K,j'ai l'autocomplétion qui est sympa,et en fait ça c'est toutes les touches du clavier.
00:33:37 :Donc là c'est le 1, 2, 3, 4,là vous voyez je vais avoir toutes les touches,et moi ce que je veux c'est la touche gauche,donc ça va être K left il me semble.
00:33:49 :Donc en fait on dit si la touche presséec'est la touche de gauche du clavier,et bien en fait on va déplacer notre joueur.Et en fait pour ça on va dire player.x,
00:34:03 :parce qu'en fait player c'est une instance d'objet,donc on dit player.x moins égal,et là on va lui donner une valeur.On va dire, je vais mettre ici peut-être,on va définir la vitesse,player.vel pour velocity,
00:34:19 :et je lui dis 5.Donc ça veut dire qu'en fait à chaque foisque je vais presser sur la touche left,il va se déplacer de 5 pixels vers la gauche.
00:34:30 :Player velocity, ok.On va tester ça.Donc là je suis là.Et donc vous voyez ça fonctionne,mais on commence à avoir des trucs un peu bizarres.
00:34:47 :Alors le truc bizarre c'est qu'en fait icion n'a pas réglé la fréquence d'horloge,et c'est une fréquence d'horloge extrêmement rapide,parce que c'est celle du process de Python.
00:34:57 :Donc ce qu'on peut faire ici,on va définir une fréquence d'horloge.On va utiliser une méthode pareille de Pygame.Ça va être pygame.time.clock,clock pour horloge,et en fait ici ça va nous permettre de contrôlerle taux de rafraîchissement,on ne veut pas que ça soit trop rapide.
00:35:23 :Donc là on va dire,on ajuste, c'est ce que je vous ai montré tout à l'heure,et on va lui dire,clock.tick,et là je vais lui dire 60.
00:35:35 :Donc en gros ça me permet de contrôler,lui dire tu ne vas pas plus vite que 60 images par seconde.Donc là si on relance,c'est déjà un petit peu moins dégueu,mais vous voyez qu'il y a un problème.
00:35:45 :Le truc c'est que je peux bouger,mais moi ce que j'aimerais c'est qu'il me rafraîchisse l'image de fond.Parce qu'en fait il n'y a aucun moment où je lui dis,je lui dis toujours de le dessiner à chaque étape,mais je ne lui dis jamais de l'effacer.
00:36:01 :Donc en fait l'astuce pour ça,c'est de faire comme si à chaque étape,on redessinait le background,l'image qu'il y a derrière.Donc il suffit juste de mettre à jour l'image qu'il y a derrière,et de réafficher par dessus notre carré rouge.
00:36:18 :Donc du coup pour faire ça,on va définir une fonction,qui va en fait, c'est un moyen plus simple de définir,de redessiner les choses.
00:36:30 :Donc on va dire, on va définir une fonction,pareil, unneur comme none.Je vais faire juste une petite pause,dites moi dans le chat si ça va,si je ne vais pas trop vite,parce que là en fait moi j'avance.
00:36:45 :Ok.Ok.N'hésitez pas dans le chat,parce qu'en fait moi j'avance,je n'ai pas trop de,ouais, il y a une main levée.Non pas de soucis.
00:37:04 :Ouais moi je vous dis j'avance,je n'ai pas de retour audio ou autre,du coup j'avance, je fais mon truc,mais si vous êtes perdus,il ne faut pas hésiter à le dire.
00:37:14 :Ok, donc,où est-ce que j'en étais?On définit…Bonsoir.Bonsoir, j'ai eu peur.Excusez-moi, je pose une question,ça n'a rien à voir, je suis débutante, je regarde.
00:37:27 :Non, pas de soucis.Oui.En fait, je ne comprends pas comment,comment vous faites pour savoirà quel moment il faut sauter de ligne en fait?
00:37:35 :Là par exemple, je vois,Seb, vous avez sauté la ligne 8.Oh, ici là?Oui.Il n'y a pas de…En fait, je ne sais pas quel éditeur de codevous utilisez, mais en fait,par exemple, si vous utilisez PyCharm…J'utilise VS Code.
00:37:54 :VS Code comme moi.En fait, là, je n'ai pas mis de warning,mais vous pouvez mettre des warnings,parce que normalement, par convention,avant une fonction, je crois qu'il faut deux lignespar rapport à la dernière variable définie, etc.
00:38:08 :Mais c'est vraiment, c'est juste pour,c'est de la convention et pour de la lecture de code,il n'y a aucun problème.Si je n'en mettais pas ou que j'en mettais plein,ça ne changerait absolument rien en fait.
00:38:20 :Ah, ça ne change rien?Ça ne change rien du tout.D'accord.Ok, c'est juste ce que je voulais savoir.Merci.Pas de souci.Ok, bon, je n'hésitais vraiment pas.
00:38:31 :S'il y a des questions,ça me fait plaisir de vous répondre.Du coup, où est-ce qu'on en était?Ce qu'on fait, c'est qu'on va définir…Donc là, ce que je vous disais,c'est qu'en fait, il faut mettre à jour l'image de fond,parce que sinon, il va garder en mémoire
00:38:45 :la position précédente et ça ne sera pas joli,comme vous avez pu le voir,ça faisait une espèce de traînée.Donc, on va utiliser…Donc là, win, c'est window,donc c'est la fenêtre qu'on avait déjà définie,et on va lui dire en fait,tu me la remplis avec du blanc.
00:39:01 :Donc, ça veut dire que si je fais draw,ici, au lieu de dessiner directement ici,je vais le dessiner dans ma fonction.Donc en fait,vous voyez ce qu'il va faire,bon là, je mets des espaces,mais c'est pour l'esthétisme.
00:39:22 :En gros, ce qu'il va faire, c'est que…je vais le faire ici,draw, player,donc, ça veut dire qu'à chaque étape,donc à chaque étape de ma boucle,en fait, wind, il faut le voir comme une boucle,ce qu'il va faire, c'est queil va régler la fréquence de rafraîchissement,
00:39:45 :donc ça, on l'a déjà dit,c'est pour que ça aille moins vite.Il va aller vérifier qu'il n'y a aucun momentoù on quitte le jeu,et il va aller récupérer icitoutes les touches qu'on a pressées.
00:39:55 :S'il a remarqué que la touche qu'on a pressée,c'est la gauche,il va aller modifier l'abscisse de mon joueurpour le déplacer vers la gauche.
00:40:04 :Et en fait, ce qu'on va faire ici,ça veut dire qu'à chaque étape,on va dire draw, player,donc on va appeler cette fonction,et cette fonction, elle va faire quoi?
00:40:11 :Elle va rafraîchir l'image globale,c'est-à-dire qu'elle va réafficher un fond blanc,et elle va me dessiner mon rectangleà chaque nouvelle étape.Et ici, le update,parce qu'il faut faire le update,c'est un rafraîchissement dans le jeu.
00:40:28 :Donc, ok,est-ce que maintenant,donc ça, il faut que je le quitte,je le relance.Et donc là, vous voyez,j'ai un fond blanc déjà,parce que là, je ne fais rien,mais en fait, ma boucle, elle tourne,donc ce qu'il fait, c'est que,il appelle draw, player quand même,
00:40:46 :et le draw, player, il fait quoi?Il me remplit mon image avec du blanc,et il me dessine mon joueur.Là, vous ne voyez pas,parce que je tape sur mon clavier,mais en fait, là,j'appuie sur la flèche de gauche,et donc, vous voyez que mon petit carré,
00:41:03 :il se déplace, il se déplace à gauche.Là, vous voyez un petit lag, en fait,à votre écran,parce que c'est en enregistrement, etc.,mais faites-moi confiance, c'est fluide.
00:41:15 :Donc là, on peut déplacer comme ça vers la gauche,on est content.Maintenant, ce qu'on aimerait aussi,c'est de déplacer vers la droite,donc vous allez voir qu'il n'y a vraiment pas de...
00:41:23 :Ouais, Salvatore?Si, tout à fait, c'est une bonne question,et c'est ce qu'on va vérifier après, justement.Donc, maintenant, on va dire...Je vais le mettre en Elif,je vais juste le laisser en If,comment je l'avais mis?
00:41:58 :Ouais, bon, je vais le remettre.Du coup, je vais faire, ici, je vais copier ça,et là, ça ne va plus être left, c'est right,donc il n'y a vraiment pas de secret,et en fait, là, la différence,c'est qu'au lieu d'aller vers la gauche,faire moins égal, je fais plus égal,
00:42:15 :player, velocity, ok.Donc, si je relance,vous voyez maintenant que je peux allerà gauche et à droite,et du coup, ça nous amène à la question de Salvatore.
00:42:36 :Il faudrait qu'en fait, vous voyez là,si je vais à gauche, le truc, c'est queil ne comprend pas mon objet,qu'il n'a pas le droit d'aller plus à gauche que la fenêtre.
00:42:44 :Donc, en fait, c'est tout simple,il suffit juste d'ajouter une condition, ici,donc là, je suis dans le cas où je presse à gauche,je vérifie que player.x,
00:42:56 :il est toujours plus grand que c'était,plus grand que 0,ça, ça veut dire pour ne pas sortir à gauche,et quand on va à droite,il faut qu'on ne soit pas plus que la largeur de la fenêtre,donc if player.x,
00:43:18 :et là, on va rajouter quand même player,parce qu'en fait, je vais vous montrer,si je ne mets pas ça, ce que ça donne.Donc là, vous voyez, maintenant que je suis là,si je vais à gauche, il s'arrête,faites-moi confiance, mais j'appuie comme un bourrin sur la flèche de gauche,
00:43:38 :il n'a pas moyen, il ne le veut pas,et si maintenant je vais à droite, pareil,pourquoi il me sort,vous voyez qu'ici je suis sorti,c'est pas ce qu'on voulait.
00:43:49 :Donc qu'est-ce que je ferai,ah, je n'ai pas mis de condition en fait,plus petit,ici je répète, je vais mettre un égal,plus petit ou égal à wix,là on relance,là je vais à gauche, vous l'avez déjà vu,et maintenant je vais à droite, ok.
00:44:13 :Donc, ça marche comme ça,du coup ça répond à ta question, Salvator?Et en fait, on borne,l'utilisateur ne peut pas aller, il ne peut pas trop dépasser la fenêtre,ni à gauche ni à droite,juste en utilisant son attribut x,là vous voyez, player x,ce n'est pas une classe que moi j'ai définie,
00:44:36 :mais c'est une instance de la classe rectangle de Pygame.Donc je peux très bien aller voir ses attributscomme on le fera avec une classe classique.
00:44:47 :Alors, maintenant qu'est-ce qu'il nous reste à faire?Il nous reste en fait à définir l'ennemi,l'attaquant, ce que vous voulez,comment on a dit qu'on le ferait,donc en gros là l'idée, ça va être de,on va dessiner aléatoirement,en fait ici, j'ai dessiné un player,mais je peux dessiner aussi un ennemi,
00:45:17 :en fait l'ennemi, on va le positionnerun peu aléatoirement en horizontal,mais on va le placer tout en haut.Ennemi, il y a deux n à ennemi,on va importer random,et du coup ennemi rectangle,donc là je vais le mettre,je ne vais pas le mettre ici,mais je vais le mettre en random,
00:45:45 :donc je vais lui mettre un random en din,et là je vais le mettre,du coup je vais le mettre entre 0 et 8,je vais définir une autre variablepour définir mon ennemi,et donc là,je suis dans random,width moins player width,parce qu'en fait,il ne faut pas non plus que l'ennemi
00:46:32 :soit coupé en deux sur le côté,et ici on va le mettre en y égale 0,et là on va lui dire,ennemi comme ça,ok, et maintenant qu'est-ce qu'on veut faire,il va falloir changer un peu notre méthoded'affichage ici,parce qu'en fait nous ce qu'on veut,c'est qu'à chaque étape de la boucle,
00:47:00 :on voudrait qu'il dessine à la fois le joueuret aussi l'ennemi.Ok, donc en fait ce qu'on peut faire,il faut qu'on donne la possibilitéici de dessiner plusieurs joueurs,donc là on va dire players avec un S,on va toujours faire un fill là,et on va faire comme si le player
00:47:28 :ça va être une liste de tuplés,donc on va dire for player tuplé in players,et là en fait on va dire tu me dessinesle rectangle, donc là ça va êtreplayer, j'écris et puis je vous le dispourquoi après on fait comme ça,donc là on va dire player tuplé 1,
00:47:53 :et ici player tuplé 0,donc là en fait ça va nous permettrede dessiner en même temps le joueuret l'ennemi, et ici on va mettre,ça va faire draw,là ce qu'on fait maintenant,en fait on a dit qu'on définissaitune liste de tuplés,donc on va mettre le joueur et l'ennemi,
00:48:19 :on va dessiner notre player,et du coup j'avais fait un tuplé tout à l'heure,où j'ai dit, attendez j'écris,et je vous montre après,ennemi, et l'ennemi on va le mettre en bleu,ok donc là en fait ce que je fais,normalement ma fonction elle prend bienune liste de players,
00:48:38 :et en fait je parcours, win,je dis player tuplé,donc ça c'est pour la couleur,et le joueur en lui même,parce qu'en fait un joueur ça peut être,soit nous même, le joueur,ou un ennemi,donc là normalement on fait ça,et si tout se passe bien,là vous voyez,
00:49:00 :je suis toujours là en rouge,je peux me déplacer,je peux me déplacer de gauche à droite,je me déplace de gauche à droite,et j'ai mon ennemi ici qui m'attend,et qui aimerait bien me défoncer,mais pour l'instant il ne fait rien,mon ennemi là,donc là par exemple il est là,
00:49:22 :si je relance une autre fenêtre,vous voyez qu'il est à un autre endroit,et ça c'est grâce au random rendint,où en fait je lui ai défini une position aléatoire,en X,qui va varier ici.
00:49:34 :Ok donc maintenant qu'est ce qu'on va faire sur l'ennemi,nous ce qu'on voudrait,c'est que l'ennemi il descende petit à petit,de la fenêtre,donc en fait pour ça,c'est assez simple,comment on va le définir,alors on va dire,il va falloir mettre à jour la position Y,
00:49:58 :la position Y de notre ennemi,et pour ça ce qu'on veut,attendez je réfléchis,en fait il ne faut pas que son ordonnée,donc en fait quand je dis c'est le Y,c'est sa position verticale,quand on descend,on va vouloir le dessiner,on va juste lui faire,si je fais ça,
00:50:31 :ennemi.Y,plus ou égale,et là je lui fais ennemi velocity,donc maintenant si je fais ça,à chaque pas de temps,vous n'avez pas vu parce que je n'ai pas été assez rapide,donc là on a bien un ennemi qui tombe,automatiquement vous voyez si j'en fais plusieurs,on a un ennemi qui tombe comme ça de nulle part,
00:50:59 :mais par contre je n'en ai qu'un seul,et en fait nous ce qu'on voudrait,c'est que s'il va tout en bas de l'écran,donc si ennemi.Y est plus grand que la hauteur de l'écran,
00:51:09 :on va en réinitialiser,il suffit de réinitialiser celui-ci,comme ceci,et en fait il va me réinitialiser,et puis après il va remettre à jour comme on l'a fait.
00:51:25 :Donc normalement si je lance ça,vous allez en voir tomber différent,donc là vous voyez ça fait comme une pluie d'ennemis,et il apparaît un peu aléatoirement sur l'écran.
00:51:39 :Donc là pour l'instant je peux bouger mon carré rouge,et il n'y a pas de soucis,vous voyez si je rentre en collision avec,lui il ne comprend pas parce que je ne lui ai pas défini.
00:51:49 :Donc en fait ce qu'on va faire tout simplement,on va lui dire,on va utiliser une méthode qui est définie dans Pygame pour nous,en fait on va lui dire que,on va dire if ennemy.collision,
00:52:26 :je crois que c'est collis direct,c'est pour collision de rectangle.Et donc en fait vous voyez qu'il suffit juste de faire,if ennemy.collision.direct avec player,
00:52:40 :et en fait on va dire que,on va arrêter le jeu.Donc là je peux faire un Pygame.time.delay,en fait c'est en millisecondes,donc si on dit 4000 millisecondes,ça veut dire qu'il va s'arrêter 4 secondes,et puis on va s'arrêter,en fait on va faire break,donc là ça veut dire qu'on va sortir du wide,
00:53:01 :et on va quitter le jeu.Donc normalement ça devrait fonctionner,donc vous voyez ici que je suis le rouge,là je l'évite,voilà je peux jouer un petit peu,on s'amuse,et si je le touche,hop, bim,je ne touche plus à rien,si je l'essaye de toucher,mais il a remarqué qu'il y avait une collision,
00:53:26 :et du coup,en fait imaginez si je n'avais pas eu cette méthode là,j'aurais dû comparer les coordonnées x, y de chacun des deux,si elles sont égales,j'aurais dû dire bon bah c'est bon tu t'arrêtes,ça aurait été un peu fastidieux de devoir programmer nous même la collision.
00:53:43 :Là en fait il le fait lui-même,il le fait lui-même,Pygame il prend les coordonnées,il prend la largeur,parce qu'en fait même si j'ai une collision juste sur un petit bout,là comme ça,hop, vous voyez juste sur le côté,il a compris qu'il y avait une collision.
00:54:01 :Imaginez un peu l'enfer de devoir coder ça à la main,c'est à dire si j'aurais dû faire des conditions avec les x et y,avec les coordonnées du player et de l'ennemi,ça aurait été un peu chiant à faire.
00:54:16 :Bah écoutez, je pense qu'on est là.En fait, ce petit tuto là,je suis tombé sur une vidéo YouTube il n'y a pas longtemps d'un gars,je ne sais pas si vous connaissez TechWizTeam,vérifiez,TechWizTeam sur YouTube,donc vous retrouverez ce tuto là,mais je le trouvais pas mal.
00:54:52 :Si vous voulez aller voir sur mon GitHub,j'en avais fait un autre, un jeu de plateforme,où en fait avec cette méthode là,ça peut vous permettre de coder plusieurs types.
00:55:05 :Imaginez par exemple que vous avez un petit bonhommeet que vous voulez le faire sauter de plateforme en plateforme,bah en fait le colleague direct,vous pouvez faire comme si c'était une collision entre votre bonhomme et la plateforme.
00:55:16 :Comme ça vous pouvez dire,quand il y a une collision, ça change ses coordonnées, etc.Donc voilà, l'idée c'était de vous montrer en 30 minutes,on peut coder un petit jeu et puis vous imaginez les possibilités que ça a.
00:55:30 :En fait là vous voyez par exemple,j'ai fait un rectangle,mais si je voulais je pourrais utiliser,bonne soirée, si je voulais je pourrais utiliser des images,ou même imaginer un casse-brique,on pourrait très bien coder facilement un casse-brique avec ça,c'est à dire là imaginez au lieu que ça soit un carré bleu,
00:55:49 :bah c'est une balle,et quand elle touche mon carré rouge,bah elle rebondit,puis elle va taper les autres balles, etc.Vous voyez qu'avec Pygame et quelques morceaux de code,on peut quand même coder des trucs assez sympas et assez rapidement,sans trop se prendre la tête.
00:56:04 :Un Tetris, ouais, tout ce que tu veux,franchement là tu vois que le concept est assez simple,et après c'est juste de l'imagination, etc.En fait, Moïse, le tuplé, la liste,ça reste des structures, des types de structures équivalentes,c'est juste que le tuplé tu peux pas mettre,il me semble, des variables de types différents,
00:56:34 :alors qu'une liste tu peux.Mais en gros, oui, un tuplé c'est avec des parenthèses,et une liste c'est avec des crochets,et voilà, en fonction de ton utilisation,c'est plus optimal d'utiliser des tuplés ou des listes.
00:56:47 :Un tuplé ça va être plus optimal si t'as toujours le même format de données,alors qu'une liste ça va te permettre de stocker des objets différents dans une même liste.
00:56:55 :Mais effectivement, tu peux, pour accéder au tuplé,t'utilises les crochets.Ça peut paraître un peu perturbant, mais c'est comme ça.C'est, comment on appelle ça, immutable je crois.
00:57:17 :Donc voilà, vous pouvez imaginer plein de choses,là vous voyez les variables des joueurs,elles sont définies un peu en dur dans le script.On aurait pu faire un fichier JSON par exemple, à côté,et on vient lire les datas, enfin bref, on peut...
00:57:40 :Immutable, ouais, merci Aurélien.Immutable c'est en anglais je crois.Donc là on aurait pu définir ces variables-là dans un fichier JSON de config,qu'on va chercher avec un withOpen machin.
00:58:00 :Voilà.Il y a vraiment plein plein de choses qu'on peut faire,mais là vous voyez en fait on a la structure, c'est assez simple,et après à partir de là on peut imaginer plein de choses.
00:58:12 :Plein plein de choses.Bon bah voilà pour ce que je pensais vous dire ce soir.Merci pour Salvador.Alors, t'as pas pu installer Pygame, t'as eu quoi comme problème?
00:58:39 :Merci Salvador.T'as eu quoi comme message d'erreur?Je sais pas si vous m'entendez là.Ouais ouais je t'entends.Ah nickel.Je sais plus le message là, du coup je suis passé sur mon Mac,et sur le Mac ça marchait direct.
00:58:54 :Alors au début je pensais qu'il fallait upgrader le PIP,mais non j'ai cherché, j'ai pas trouvé.A la limite je réessayerai demain et je t'enverrai une capture d'écran.
00:59:07 :Ouais ça marche, tu peux le mettre sur, tu sais, les questions.En fait ça doit sûrement être lié à des versions de Python que tu utilises,parce que j'imagine qu'il y a un moteur TKinter derrière Pygame.
00:59:19 :Ouais.Et donc je pense que ça doit être là, ça doit se résoudre facilement,y'a pas de soucis, mais ouais fais le message d'erreur et puis tu le mets sur les questions.
00:59:28 :Parce que là du coup tu vois sur le Mac j'avais pas installé les librairies TKinter avant.Ouais.J'ai installé Pygame direct et là ça a fonctionné.
00:59:37 :Ah peut-être c'est ça, une incompatibilité avec le TKinter qui existe déjà.Non.Parce qu'en fait peut-être, je dis ça comme ça, si ça se trouve c'est pas ça du tout,mais si ça se trouve t'as déjà un TKinter sur Windows,et du coup quand t'installes Pygame, il va voir si TKinter il l'a installé,
00:59:52 :il l'a trouvé, il a dit c'est bon et du coup il l'a pas réinstallé.Mais peut-être qu'il y a un problème de compatibilité avec la version de Pygameque t'as téléchargé et le TKinter que t'as.
01:00:02 :Ok. Je regarde ça demain et j'enverrai directement dans les questions.Ouais ça marche, mets le bien dans les questions comme ça on garde une trace,dans la communauté c'est un peu plus dur à tracer.
01:00:14 :Peut-être.Et si jamais du coup t'as déjà une version de TKinter qui pose problème,je te montrerai comment tu peux utiliser les environnements virtuels,à moins que tu le saches déjà.
01:00:25 :Oui.Le VAMV ici, ça te permet de travailler localement et d'avoir des versions différentesà différents endroits etc.Ouais, ça je le fais déjà.Ok, super.
01:00:38 :Merci.Je t'en prie.Tu vois en plus il y a Seb qui proposait la même chose.Ouais, merci Jonathan. Bon oui ça change un peu.
01:00:54 :Alors une app pour une app mobile simple.Franchement je pourrais regarder mais honnêtement je ne suis vraiment pasdu tout calé en développement mobile.Mais bon je pourrais essayer de regarder, je ne te promets pas,j'en suis qu'on puisse faire ça rapidement parce qu'il faudrait que je regarde un peu.
01:01:26 :Mais moi je connais TV en développement mobile et puis qu'est-ce qu'il y a d'autre?Mais ouais ok, bon pourquoi pas.Je me le note et puis si un jour on peut on essaiera.
01:01:48 :D'une autre manière, c'est-à-dire...Ouais merci, j'en suis pas de soucis.D'une autre manière le jeu de rogues...Qu'est-ce que tu entends par une autre manière?
01:02:05 :C'est-à-dire pas sur le terminal?Ah oui d'accord, en POO.Bah ouais ça se fait.Parce que là actuellement l'exercice proposé sur docstring,désolé je ne les connais pas tous par cœur,il n'y a pas de programmation orientée objet dessus.
01:02:24 :Parce que je vois Raphaël tu me dis POO, c'est juste de la variable quoi, c'est ça?Ok, et du coup, toi Raphaël tu te dis que ça serait peut-être bien de voir ça avec de la POO,et Moïse est-ce que c'est ce que tu avais en tête aussi?
01:02:46 :Ou c'est carrément autre chose que tu voulais?Moi je ne suis pas encore arrivé sur la programmation objet.Bon, il y a la résolution que Thibault a fait dans le parcours,et peut-être une autre manière d'aborder,mais bon c'est intéressant aussi si on peut le voir en PO.
01:03:16 :Ouais parce qu'après la manière dont Thibault l'a abordé,j'ai déjà vu la correction,en fait moi je peux faire quelque chose mais ça sera sensiblement pareil,c'est juste bon voilà, il y aura peut-être une condition par-ci par-là qui sera différente.
01:03:33 :Si on veut vraiment faire quelque chose de différent,oui il faut passer sur de la PO, là ça sera vraiment différent que ce qui a été proposé.
01:03:40 :Si je fais un truc sans PO,en fait je pense que tu n'apprendras rien de plus que la correction de Thibault.Donc je pense que PO c'est une bonne idée Raphaël.
01:03:52 :Et du coup, c'est cool vous me donnez des idées pour les prochains mentorats.Et du coup il y avait la question, le labyrinthe aussi,peut-être que c'est pour ça que je voulais montrer,Pygame mais peut-être qu'on peut voir,on peut peut-être faire quelque chose avec le labyrinthe et Pygame les deux.
01:04:15 :Ouais je le note.Salvatore, Pygame et labyrinthe,à la réflexion, ok c'est plutôt la logique qu'il y a derrière.Ok, désolé, franchement j'avais noté que tu voulais le revoir,et je t'avoue que je n'ai pas eu le temps de le regarder,et pour moi c'était plus,je suis plus efficace sur Pygame du coup ça m'a pris moins de temps de préparer ce petit truc,
01:04:52 :mais je n'avais pas oublié,je le note, labyrinthe c'est vrai que ça peut être un bon exercice.Du coup j'ai noté jeux de rôle en PO et labyrinthe pour l'instant,c'est déjà du bon programme.
01:05:09 :Et puis si ça vous intéresse je ferai de temps en temps des petits rappels comme on a fait au début avec les properties,ça fait pas mal de se rafraîchir la mémoire sur des trucs comme ça.
01:05:27 :Oui oui j'essaye un peu,je vois que tu avais la main levée Salvatore, c'est bon c'est répandu.Pas de soucis.Bon on va s'arrêter là, si ça vous va, si vous avez d'autres questions,de toute façon comme d'hab vous pouvez les poser sur la communauté ou dans les questions.
01:05:53 :Merci, bonne soirée, je reste encore juste quelques minutes si vous avez des questions, sinon je quitte.J'ai une petite question sur le jeu de rôle,quand on change les variables à chaque fois on va taper dans le code,est-ce qu'on pourrait voir à ce moment là aussi d'ajouter une sorte de fenêtre paramétrable en interface graphique?
01:06:22 :Avec TKinter par exemple?Ouais par exemple, moi j'utilise custom code,pour que ça soit plus joli.Genre par exemple changer la vie, changer les attaques.
01:06:40 :Mais en temps réel du coup, pendant le jeu ou tu veux dire avant de commencer le jeu?Ouais je pensais avant, mais en temps réel ça serait trop bien.
01:06:50 :Ouais il faudrait faire une boucle,un while comme ça, un peu comme ce qu'on a vu là avec Pygame,il faut un while et du coup il faut pouvoir interagir à chaque fois.
01:07:05 :En fait moi quand, je sais pas si t'avais déjà vu,comme je disais, tu vois par exemple ces trucs là qu'on a un peu hardcoded,on a mis en dur dans le code, moi j'aime pas faire ça, mais là je l'ai fait comme ça pour l'exemple.
01:07:20 :Mais en gros moi ce que je fais, c'est je les mets dans un fichier JSON,je sais pas si tu as déjà fait ce genre de truc,tu vois je fais un truc config.json, là je mets
01:07:35 :par exemple, je sais pas, j'aurais mis5, et puis en fait,ici dans le jeu,là en fait tu vois pour avoir l'avis, j'aurais plutôt fait un trucwith open config.json,
01:08:00 :du coup c'est que en read as input,et puis là j'aurais fait,on aurait dit inputjeu, et là on aurait misjson.loadf, je crois un truc comme ça,
01:08:25 :je sais pas si t'as déjà vu ce genre de truc, si t'as déjà utilisé.Si, justement moi j'ai fait un fichier de sauvegarde.Ouais, et comme ça tu définis tes paramètres dans un fichier JSON à côté.
01:08:40 :Bon ça si tu connais déjà, je ne ferais pas ça,je vais voir ce qu'on pourrait faire avec Pygame notamment, je pense que c'est pas mal de le réutiliser,parce que je trouve que c'est, moi je suis pas du toutPyside et tout ça, TKinter je ne maîtrise pas beaucoup, du coup je préfère pas trop utiliser des trucs que je ne maîtrise pas,
Aucune occurrence trouvée pour « ».