Kawax : mon appel à devenir un martyr de Candy Crush.

Historique

Il y a quelques années, après avoir terminé Blarg, je m’étais lancé dans la réalisation de Kawax. Un jeu vidéo, non pas de type match-3, mais de type « match sum(x) ».

Puis j’ai abandonné son développement pour un faisceau de raisons : le fameux « quotidien » dont on nous rebat les oreilles, le fait de m’être fait jeté comme un malpropre de ma mission d’ouvrier-codeur, le fait d’avoir jeté comme une malpropre la boîte à viande d’informaticien qui m’employait à cette époque, le code du jeu qui commençait à devenir un peu bordélique, etc.

Disgression : je continue de penser que dans l’ensemble, je code pas trop comme une porcasse, mais parallèlement, j’apprends d’autres techniques, ce qui me permet de me rendre compte que ce que j’ai fait dans le passé n’est pas toujours génial.

Ce n’est pas le premier projet que j’abandonne, et sûrement pas le dernier. Mon disque dur est rempli de petits avortons que j’ai désiré, rêvé, chéri et élevé pendant un certain temps, pour ensuite les laisser se refroidir et se figer tel des petits enfants trisomiques malformés qui auraient atterris chez les Courjault.

Bbabord

Seulement voilà, Kawax, j’y avais passé un certain temps (6 ou 7 mois), et le principe du jeu est relativement original. Ça m’embêtait de voir tout ce Travail non rentabilisé et ne me procurant pas la récompense de flattage d’ego que j’espérais au départ.

Juste pour voir, j’ai ressorti ce petit avorton de création de son congélateur. Il était bien mal en point. Si je l’avais lâché en l’état dans la nature difficile et impitoyable des œuvres vidéoludiques indépendantes, il n’aurait pas tenu 10 secondes, et aurait probablement fini asphyxié entre deux poubelles suite à une insuffisance pulmonaire, des vautours lui dévorant joyeusement les joues et les cuisses.

Alors je l’ai repris en main, je lui ai consacré un peu de mon temps et de mon amour, j’ai vissé des petites roulettes à la place de ses pieds atrophiés, et j’ai scotché quelques bouts de métal pointus à ses gencives. Ainsi, il pourra ramper avec ces substituts de dents, se défendre contre les vautours et espérer rester vivant plus d’une minute dans le monde extérieur.

Photo de la boîte de jeu, même si c'est un objet qu'existe pas.

Photo de la boîte de jeu, même si elle n’existe pas.

Récupérer le jeu

Je l’ai enregistré sur le site IndieDb. Vous pouvez télécharger l’exécutable Windows ici : http://www.indiedb.com/games/kawax/downloads/kawax-v01-for-pc

Et l’exécutable Mac OSX ici : http://www.indiedb.com/games/kawax/downloads/kawax-v01-for-mac

L’installation est assez simple : télécharger, décompresser le fichier, double-cliquer sur l’exécutable.

Lorsque le menu principal du jeu s’ouvre, appuyez sur la touche « 1 » pour démarrer le tutoriel.

Screenshot du tutoriel. C'est beau hein ?

Screenshot du tutoriel. C’est beau n’est-ce pas ?

Il n’est pas possible de revenir au menu principal après qu’une partie soit commencée. Pour tester un autre mode, il faut arrêter et relancer le jeu. Veuillez nous excuser pour ce désagrément.

J’ai mis tout le code source, les ressources graphiques, les sons, etc. sur mon github : https://github.com/darkrecher/Kawax

Le repository comporte une grosse doc de conception, décrivant comment j’ai structuré le code. Car même s’il est un peu bordélique, au moins, tout est décrit.

Je vous ai également fait cadeau d’un brouillon, regroupant les idées que je voulais mettre dans le jeu. J’avais imaginé une bonne quantité de variantes, d’objets, de super-pouvoirs, … N’hésitez pas à vous servir.

screenshot_indiedb_02

Ce que vous pourriez faire pour être gentils

Comme vous le savez, je suis constamment en recherche de flattage d’ego, voire de dons en brouzoufs. Je serais donc très heureux que vous fassiez une ou plusieurs des gentilles actions suivantes :

  • De base : télécharger et essayer le jeu.
  • Mettre une étoile sur mon repository github
  • Donner une note au jeu sur IndieDb. Même une pourrie, ce sera déjà ça. Pour l’instant, il n’y a aucune note.
  • Flattrer :

Bouton Flattr pour mon jeu Kawax

  • Me filer des bitcoins, ou une autre crypto-monnaie :
    • Bitcoin (BTC) : 12wF4PWLeVAoaU1ozD1cnQprSiKr6dYW1G
    • Litecoin (LTC) : LQfceQahHPwXS9ByKF8NtdT4TJeQoDWTaF
    • Dogecoin (Ð) : DKQUVP7on5K6stnLffKp3mHJor3nzYTLnS
    • Next (NXT) : 12693681966999686910

 

Cette dame boit du café, donc elle joue à Kawax.

Cette dame boit du café, donc elle joue à Kawax.

Et le rapport avec Candy Crush ?

Vous avez inévitablement entendu parler du jeu vidéo « Candy Crush Saga ». Ce que vous savez peut-être moins, c’est que King, la société éditrice de ce jeu, passe régulièrement pour une salope géante du patent trolling. Ses dirigeants sont suffisamment blindés contre l’auto-dérision et la prise de recul pour être capables de jouer sur les deux tableaux de la lame à double-tranchant du patent trolling :

C’est d’autant plus amusant qu’ils abandonnent systématiquement leurs charges après force procès endiablés, qui doivent certainement coûter plusieurs myions de brouzoufs comme tout procès endiablé qui se respecte.

Le monde n’a pu s’empêcher de réagir à ces abracadabrantesques pantalonnades, avec, par exemple, le site CandyJam (http:// itch.io/jam/candyjam).

Le King aime l'argent

Le King aime l’argent

C’est là où je me dis que se faire attaquer par King est une chance incroyable. Ça vous coûte au final pas grand-chose, puisqu’ils abandonnent à la fin, et vous passez pour le gentil menacé injustement par le grand méchant (David et Goliath, tout ça). Bref, devenir un martyr de Candy Crush et de la société King, c’est un énorme coup de pub.

Kawax s’apparente à un jeu de match-3, comme Candy Crush. Mais l’idée maîtresse de mon jeu, le fameux « match sum(x) », me semble assez originale. À ma connaissance, aucun autre jeu ne l’a exploitée. Je suis donc le candidat idéal pour me faire plagier par King.

Mon jeu est placé sous deux licences différentes, au choix : Licence Art Libre ou Creative-Commons-By. Le plus simple, pour reprendre mes idées, est d’utiliser la CC-BY. Il faut donc me citer, ce que King ne daignera bien évidemment pas faire. C’est là où, une fois de plus, la rocambolesque bataille d’avocats aura lieu, et je deviendrais célèbre tout en ayant une image de gentil.

Donc, annonce publique bien forte pour que tout le monde entende :

Vas-y King, viens plagier mon jeu. J’ai besoin de ton martyrisage.

En contrepartie, King, je suis prêt à racheter quelques-unes de tes actions pour t’aider à te remettre à flots en Bourse. Par contre je paye qu’en crypto-monnaie. Désolé c’est tout ce que j’ai.

Lisa Canon. Secrétaire sexy BBW.

Cette femme est une working girl, donc elle joue à Kawax.

Absolument rien à voir, mais à signaler quand même.

« KAWAX ?

Tu peux nous rappeler la définition de Kawax, Liliane ?

Oui t’as de très belles lettres dans ton mot mais la deuxième condition du scrabble c’est que ça veut dire quelque chose. »

Pierre Palmade

Merci à Josmiley de chez pygame, pour son commentaire qui, il faut le reconnaître, est plutôt pertinent. (http:// pygame.org/project/2916/#comment-1549266824)

Zut, maintenant Pierre Palmade va vouloir m’attaquer en justice pour usurpation de marque. Devenir un martyr de Pierre Palmade, c’est bankable ou pas ?

Blarg pour tout le monde

Salut les étrusques.

Ça y est, mon jeu vidéo s’offre à la vue, aux oreilles, au nez et à la bite de tous !

Blarg !

blarg screenshot 2.1

Les versions Windows et Mac, ainsi que le code source, sont téléchargeables gratuitement et librement ici : http://indiedb.com/games/blarg/downloads.

J’ai commis de nombreux articles au sujet de jeu, sur le site Ulule :

  • Quelques menus détails expliquant comment l’installer.
  • Ce que je compte faire de la montagne de dons pécuniers qui m’a été généreusement octroyé.
  • Des métriques de code bien débiles : nombre de fichiers, de lignes de programme, de commentaires, …
  • D’autres choses, incluant un dessin approximé au premier degré du mouton du Petit Prince.

Cette prolifération de blabla est intégralement consultable ici (http:// fr.ulule.com/blarg/news).

Je viens donc officiellement de terminer une quête principale qui me tenait à cœur, depuis un an. À savoir : [Créer un espèce de jeu vidéo]. En mode solo !

Qu’a apporté cette quête à ma fiche de personnage ?

TCG geek disgruntled GM

  • La compétence [programmation python & pygame] niveau 1.
  • L’achievement [auto-satisfaction pour avoir mené un gros projet de création artistique jusqu’au bout]. Je l’avais déjà gagné deux fois : ici et ici.
  • L’achievement [gagner du poignon autrement que par un boulot-alimentaire, sans vendre d’armes ni de drogues]. En effet, j’ai reçu 55 euros de dons de la part de connaissances plus ou moins proches : 50 euros via Ulule et 5 en liquide sous le manteau. Un grand merci à ces généreux donateurs. J’ai écrit, pour chacun de vous, des compliments plus ou moins personnalisés (http:// fr.ulule.com/blarg/comments/).
  • Le haut fait [réaliser tous les bruitages d’un jeu vidéo avec la voix]. Je compte le re-obtenir lors de quêtes ultérieures.
  • Quelques pourcentages dans le skill [dessin avec des logiciels super-pros tels que Paint ou Pixia]. Mais je ne compte pas le développer plus que ça. Je sous-traiterais les crafts qui y sont liés, en les proposant sous forme de quêtes annexes.

Quelques foirages de Pygame

Lors de ma quête, j’ai eu l’occasion d’harvester quelques bugs présents dans cette librairie pythonienne. Il y eut d’abord cette sombre histoire de dirty sprite, dont j’ai déjà parlé ici.

Bel exemple de dirty rect

Bel exemple de dirty rect

J’ai également relevé un couillage géant lors de la mise en plein-écran de résolutions exotiques, par exemple 400×300. Ce couillage peut varier diversement : affichage tourné à 90 degrés, curseur de souris décalé, …

Et pour finir, il y a des « schmürtzes » dans la variable event.unicode, censée contenir le caractère correspondant à la touche appuyée, pour laquelle l’événement « event » a été généré. (J’aime bien cette phrase, elle est alambiquée à rallonge. Par contre, désolé pour le mot « schmürtz ». C’est ringard, c’est le tic de langage d’un collègue,et  j’avais envie de lui piquer, gratuitement).

Ouais donc, cet event.unicode est censé gérer toutes les subtilités du clavier : diacritique, dispositions qwerty/azerty/autres, majuscules-minuscules, touches muettes pour activer les accents bizarres, etc.

Sauf que ça va pas toujours bien.

Le tout premier texte en unicode

Le tout premier texte en unicode

  • Sur Mac, certaines touches censées ne rien écrire (flèches de direction, F1, F2, …) ont un caractère dans leur event.unicode. Caractère non-imprimable, certes, mais présent.
  • A l’inverse, sur PC, le slash du pavé numérique donne un event.unicode vide, alors qu’il devrait valoir « / ».
  • Le changement qwerty/azerty ne fonctionne pas forcément bien. (Je ne sais plus trop les détails).

Tout ce bordel fera peut-être l’objet d’articles plus poussés, ou de rapport de bugs sur le site pygame.org. Mais c’est pas garanti, car :

  • j’ai la flemme
  • ces problèmes ne sont pas critiques
  • j’aime bien râler dans mon coin sans rien régler.

Bref, à part ces quelques schmürtzes, tout a globe-allemand bien fonctionné, et je réitérerais le même mode de fabrication, de demande de dons et de distribution, pour des œuvres futures (jeux vidéos ou autres). Faut juste que je me bouge le cul et que je m’y mette.

Oui tiens au fait, que va-t-il se passer ensuite ?

Pour commencer, je vais reprendre ce blog en main afin de le sortir de sa jachérisation. Je vous propose d’ailleurs de commencer tout de suite, avec des nichons dans un maillot de bain poilu.

Mya Jane Busty hairy top

Voilà. Ne me remerciez pas, c’est naturel.

Je vais également rattraper mon retard concernant les articles récapitulatifs d’articles de 42. J’ai 2 numéros à annoncer, hop hop, au boulot, feignasse de cerveau.

Je suis d’ailleurs toujours dans la fringante équipe de rédaction de ce webzine polysomique. Faut que je m’y replonge. Je voudrais pas m’éloigner de cette excroissance multirécidiviste du web.

Et comme vous vous en doutiez, j’ai un autre projet de jeu vidéo en cours d’élaboration. Ça s’intitulera « Kawax », et se sous-intitulera « Le stagiaire et la machine à café ». Pour l’instant je n’en dis pas plus, c’est ultra-secret.

giant coffee

Et maintenant, en route vers de nouvelles aventures !!

Du nouveau concernant des trucs pas intéressants ?

Oui ! Plein ! Au niveau de le mon super Travail d’ouvrier-codeur, j’ai appris, du jour au lendemain, que ma mission à Merluchon Corp se terminait.

Nan j’exagère, c’était pas du jour au lendemain, c’était de la semaine à la semaine suivante. J’ai juste eu le temps de faire mon pot de départ au Riesling.

Donc là présentement, il y a quelques chances que me sois offert un peu d’inter-contrat de glanderie, à coder des macros Visual Basic pour des besoins internes. (« Besoins internes » ne signifiant absolument pas : « je sens dans mon corps qu’il faut que j’aille faire caca »). Après, je risque de me re-taper de la grosse merde niveau transport. Exactement comme ce que je racontais ici-même, y’a deux ans.

Dans tous les cas, j’espère que mes prochains environnements de le Travail m’offriront la possibilité de vous éjaculer plein d’articles corporate.

(Et maintenant, en route vers de nouvelles aventures)-bis !!

Rocket Ranger 08813guili2

J’ai créé un jeu. Donnez-moi votre argent !

Mon jeu s’appelle Blarg, c’est un shoot’em up en 2D. Il faut dégommer des magiciens avec un fusil à pompe. Tous les bruitages ont été fait à la bouche.

En échange de quelques piécettes, vous pourrez le récupérer en avant-première, avec en exclusivité le mode invincible. Vous donnez ce que vous voulez. Même 1 euro, c’est suffisant.

Vous pouvez aussi donner plus, pour avoir divers goodies : votre nom dans le générique, une version dédicacée, la possibilité de participer au contenu artistique du jeu en beuglant dans un micro, etc.

Pour contribuer, rendez-vous sur le beau site de crowdfunding Ulule. J’y ai mis une vidéo du jeu, des images, et toutes les explications nécessaires. C’est ici : http://fr.ulule.com/blarg/

La description et les news du projet vous apprendront une pléthorée de choses intéressantes :

  • Comment ce jeu va sauver les cerveaux des informaticiens.
  • Pourquoi suis-je aussi cupide, et pourquoi vous demande-je de l’argent.
  • Pourquoi les programmeurs de jeu doivent-ils lécher leur créations.
  • Le titre de ma prochaine œuvre.

Pour les impatients, je met la vidéo directement ici :

Ça vous a plus ? Alors vous savez ce qu’il vous reste à faire. Je remets le lien ici, comme ça vous n’avez même pas besoin de re-croucrouler vers le haut avec votre molette de souris. http://fr.ulule.com/blarg/

Je sais que c’est pas le jeu du siècle, mais j’étais tout seul à le faire. J’y ai vraiment passé beaucoup de temps : presque une année, à travailler 1h30 par jour, dans le bus qui m’emmène au boulot.

Je vous le dis, là, sincèrement, sans blagues, sans digressions débiles comme je fais d’habitude : faire des jeux vidéos, c’est mon projet de vie personnel, j’y crois et je m’accroche à cet idéal. Et j’aimerais vraiment savoir si mes créations intéressent un minimum de gens, si je dois continuer à y consacrer du temps, ou si je ferais mieux de tout laisser tomber pour des choses plus simples.

Des tas d’idées fourmillent dans ma tête. Je veux créer plein d’autres jeux originaux, amusants, bizarres, dérangeants… Mais pour cela, il me faut un tout petit peu d’encouragement, s’il vous plaît.

Voilà. Faites ce que vous voulez.

blarg screenshot death

Edit 2013-08-11 : Voici des images de femmes rondes. Ça manquait à l’article.

Jade, avec un shotgun (même si c’est pas vraiment un shotgun)

Jade 125Q

Et comme c’est un peu violent, en voici une toute douce pour contrebalancer, avec des feuilles d’épinards géantes (même si c’est pas vraiment des feuilles d’épinards géantes).

bbw spinach leaf

Vulture repellent doesn’t work !!!

Edit 2015-11-27 : en réalité, les DirtySprites de pygame fonctionnent. La taille de la zone à nettoyer est définie par la taille de l’attribut rect, et non pas par la taille de l’image du sprite. Ce n’est pas le même comportement qu’avec les RenderUpdates, et c’est documenté nul part. D’où ma non-compréhension. Tout est expliqué plus en détail dans une question que j’ai posée sur le site IndexError (http:// indexerror.net/79/pygame-groupe-sprite-layereddirty-renvoie-bons-rects-refresh).

Maintenant, il ne vous reste plus qu’à lire cet article devenu obsolète !

 

Haha, ouais ! « Vulture repellent doesn’t work ». Ça kille, no ? C’est une private joke rien que pour moi.

Durant mes folles années, je jouais au jeu-fusion « Might and Magic 4 & 5 : World of Xeen ». Je l’ai terminé. Je vous en parlerais un jour.

Comme dans tout bon jeu de rôles, on peut discuter avec des gens dans des tavernes. Enfin disons qu’on les écoute déblatérer leurs conneries d’ivrognes, sans rien pouvoir répondre. Le jeu n’est pas non plus un modèle d’interactivité. (Hey ! Depuis quand les ivrognes sont interactifs ?)

hé, Yörgl ! Un ch'ti canon ?

hé, Yörgl ! Un ch’ti canon ?

Bref, à un moment, y’en a un qui beugle « Vulture repellent doesn’t work !! » Ah c’était quelque chose. J’avais la version CD-collector du jeu, avec les voies digitalisées de tous les dialogues. Elles étaient très bien faite, beaucoup d’accents variés et prononcés, des phrasés super bizarres : « Ayt’s alwèïze eu plésure teu see you, Ghôôsslayèrze », « The MejjjaDragon » … On sentait bien qu’ils s’étaient lachés sur les voix, et ça faisait chaud à la partie de mon cerveau « esthète du jeu vidéo ».

dans les RPG, on sauve des princesses

dans les RPG, on sauve des princesses.

Bref-bref, un ivrogne générique me gueule ça à la gueule, et je comprends pas du tout. Ça c’est éclairci un peu plus tard, quand je suis tombé sur des monstres appelés « Vulture Roc ». Pas évident à tuer ces saletés, du moins au niveau où j’étais. Or, dans la même ville que l’ivrogne, résidait un clampin vendant du « vulture repellent », à only 250,000 gold. Et il doesn’t workait, bien entendu.

Mais, euh.. Osef complètement ?

Stupidement, cette phrase m’a marqué. Le cri du cœur de ce personnage, sa sentence complètement insolite, l’intonation de sa voie… J’ai décidé d’en faire mon « internet meme » personnel. Maintenant, à chaque fois que je tombe sur un truc quelconque qui fonctionne pas, ce meme fait dzoing dans ma tête.

might and magic gardian tower schtroumpfs

Donc, acte :

pygame

dirty

sprites

doesn’t

work !!!

Comme vous ne le savez pas, en ce moment je fais joujou avec la libraire pygame, qui permet de faire des jeux rigolos en python. On y trouve une classe, fort adéquatement appelée pygame.sprite.Sprite. Celle-ci contient un attribut « rect », pour les coordonnées, et un attribut « image », pour haha l’image.

On peut mettre ces sprites dans des classes « Group », pour les afficher/rafraîchir en un seul appel de fonction. La classe RenderUpdates est un type de Group particulier, et est trop cool. Comment ça marche ?

  • Tu fous tes sprites dans ton RenderUpdates.
  • Quand il faut les effacer, tu lances RenderUpdates.clear(), en spécifiant l’image de background pour l’effaçage. Hop, à ce moment là, le RenderUpdates, il enregistre les positions et tailles de tes sprites. Où stocke-t-il ça ? J’en sais rien. Mais ça marche tout seul, c’est magique.
  • Tu fais toutes les conneries que tu veux avec tes sprites. (déplacement, changement d’image, sexe avec des écureuils…)
  • Quand faut les réafficher, tu lances RenderUpdates.draw().
  • Arrivée à cette étape, si t’es un bourrin de plâtrier, tu prends toute la grosse image que tu viens de créer (background + sprites) et tu blit le tout à l’écran. Plaf !!
  • Mais ne serait-ce pas plus économique et plus subtil de ne remettre à jour que les zones qui ont changées ? C’est à dire, les zones où se trouvaient les sprites avant, ainsi que les zones où ils se trouvent maintenant ? Oh si alors !
  • Noël !! Noël !! Cet opération est automatisée par le RenderUpdates. Quand tu fais un draw, il te renvoie une liste de rectangles sales (dirtyRects), indiquant les zones à réafficher.
  • Plus qu’à faire un petit display.update(), en filant directos la liste de dirtyRects. (Surtout pas de display.flip() de plâtrier bourrin). Et le tour est jouay !!! Ça marche, c’est simple, c’est optimisé, on est content.

Petit exemple de RenderUpdates

Le script python est à récupérer ici : dirtyno.py

Le fond de l’écran est vert. Il n’y a qu’un sprite : un carré rouge. Au début il est immobile, puis il se déplace vers la droite. C’est moche et saccadé. Et j’ai même l’impression que ça clignote, (ou alors c’est mes yeux). Mais on s’en fout.

Ca nous y fait ceci :

Là vous le voyez pas bouger, car c’est qu’une image. Pour avoir une émulation à peu près fiable du logiciel, Faites de petits mouvement de tête, comme un pigeon.

Comme je suis d’un naturel curieux…

Haha, quelle titre de merde !! J’ai toujours rêvé de dire ça un jour, en restant stoïque et avec un petit sourire en coin. Comme les gars qui se la pètent, mais sans en avoir l’air. Genre « hu-hu-hu je suis un type normal et tout à fait modeste, mais je suis d’un naturel curieux. Oooohhh, aimez-moi, regardez-moi comme je suis un mec bien, je suis un gentleman avec une petite moustache fine, je ne veux pas donner l’impression de me vanter mais je le fais quand même avec mes gros sabots dégueulasse pleins de boue. Je brâme ma vacuité dans vos oreilles. Brâââââhhhâââââ. Mon sperme est à vendre ! Une occasion unique de faire quelque chose de bien de votre vie ! Fabriquez un enfant ayant mon patrimoine génétique et admirez-le !! Pââââmez-vous, pââââmez-vous !! »

Et merde, encore raté.

Bref, moi et ma curiosité, on voulait juste voir le contenu de ces fameux dirtyRects. J’ai mis un print dans mon programme d’exemple, ça me donne ceci :

coucou !!!
mode normal. liste des rect a repeinturer :
[<rect(10, 100, 50, 50)>]
mode normal. liste des rect a repeinturer :
[<rect(10, 100, 50, 50)>]
mode normal. liste des rect a repeinturer :
[<rect(10, 100, 80, 50)>]
mode normal. liste des rect a repeinturer :
[<rect(40, 100, 80, 50)>]
mode normal. liste des rect a repeinturer :
[<rect(70, 100, 80, 50)>]
mode normal. liste des rect a repeinturer :
[<rect(100, 100, 80, 50)>]
mode normal. liste des rect a repeinturer :
[<rect(130, 100, 80, 50)>]

Le coucou du début, faites y pas gaffe. C’est mon init.

A chaque fois, la liste contient un seul dirty rect. Les valeurs numériques indiquent (coord_X, coord_Y, largeur, hauteur). Au début, le sprite ne bouge pas, donc le dirtyrect à rafraîchir lui correspond exactement. C’est normal.

Ensuite, la coordonnée X du dirtyRect augmente de 30 en 30. Normal, c’est la distance de déplacement de mon sprite, à chaque cycle.

On remarque aussi que la largeur du dirty rect passe à 80. Normal aussi. Le sprite a une largeur de 50. Le RenderUpdates a fusionné la position initiale (le sprite à effacer), avec la position finale (le sprite à afficher). 50 + 30 = 80. Toute la zone nécessaire est rafraîchie (toute ? oui). Ça se gère automatiquement, c’est super.

Donc ça marche.

Dirty Sprite. Ce n’est pas sale.

Quand on est un gars bien, avec une moustache fine, on sait qu’un niveau d’optimisation supplémentaire est possible. En effet, tous les sprites n’ont pas toujours besoin d’être rafraîchis à chaque cycle : si ils ne bougent pas et ne changent pas, pas la peine de les redessiner. C’est là qu’interviennent les dirtySprites ! Tadzam !

C’est comme les sprites normaux, sauf qu’un attribut supplémentaire est ajouté : « dirty ».

  • dirty = 0. Le sprite n’est jamais redessiné.
  • dirty = 1. Le sprite est redessiné une seule fois, puis l’attribut est automatiquement fixé à 0.
  • dirty = 2. Le sprite est toujours redessiné.

Pour avoir ce fonctionnement, il faut utiliser le Group « LayeredDirty », au lieu de « RenderUpdates ». OK c’est cool.

Comme je suis d’un naturel essayiste, j’ai repris mon programme tout moche, j’ai remplacé le group et le sprite, et j’ai fixé dirty à 2. Concrètement, quel est l’intérêt ? Aucun. Le sprite sera redessiné à chaque cycle, comme avant. Mais c’est juste pour tester.

Petit exemple de LayeredDirty

Voici le programme modifié : dirtyyes.py
Et à l’écran, ça donne quoi ?

But ! But !! It’s all fucked up !!! THIS IS AN OUTRAGE !!!

Quand au résultat du print, c’est pas mieux :

coucou !!!
mode dirty. liste des rect a repeinturer :
[<rect(0, 0, 400, 300)>]
mode dirty. liste des rect a repeinturer :
[<rect(10, 100, 50, 50)>]
mode dirty. liste des rect a repeinturer :
[<rect(10, 100, 50, 50)>]
mode dirty. liste des rect a repeinturer :
[<rect(40, 100, 50, 50)>]
mode dirty. liste des rect a repeinturer :
[<rect(70, 100, 50, 50)>]
mode dirty. liste des rect a repeinturer :
[<rect(100, 100, 50, 50)>]
mode dirty. liste des rect a repeinturer :
[<rect(130, 100, 50, 50)>]

Le premier dirty rect fait tout l’écran. Ça a l’air normal, car au début il faut tout rafraîchir. En vertu de quelle lubie pygame se décide à gérer ça maintenant, alors qu’il le faisait pas avant ? De toutes façons m’en fout, je fais un flip global à l’init. Pas besoin de leur connerie. Passons.

On retrouve les deux premiers dirtyRects du début, qui ne bougent pas. Jusque là OK. Ensuite, on se déplace de 30 pixels vers la droite. Mais la largeur reste toujours 50 ! What the fuck ?

Je ne vois que deux explications possibles : soit je suis idiot, et j’ai pas compris comment ça fonctionnait. Soit leur truc est buggé.

J’ai cherché de l’aide par-ci-par-là-lulé sur internet. Que d’alle. Et comme j’ai pas le courage de traduire tout mon blabla en anglais pour poser la question sur un forum ou sur leur IRC-mailing-list, je me contente de râler dans mon coin et d’en faire un article. Voilà.

Je terminerais avec bonnet-de-nuit-man, qui n’est pas très très content de toute cette gabegie :

bonnet de nuit man

M’en fout, je vais continuer de coder mes trucs sans utiliser cette connerie de dirtySprite. Bien fait. Et pour finir, une dernière image de notre plumpprincess :

plump princess