News
TDM n°5 – Du « Pixel Art » !
Le Tuto Du Mercredi [TDM] est une idée qui fut proposée par Ne0tux. Un mercredi sur deux, nous postons un tutoriel sur l'Utilisation de la calculatrice, le Transfert, la Programmation, ou encore la Conception de jeu. Je vous en présente la cinquième édition !

Dessiner de beaux sprites et maitriser le Pixel Art :

Niveau : ★ ★ ★ ☆ ☆

Ce TDM-ci, à l'instar du tout premier Tuto Du Mercredi, portera sur les graphismes de vos jeux. Ici, je vais aborder des techniques qui vous permettront de dessiner vos personnages, qu'ils soient déjà existants (Zelda, Mario, Pokemon) ou qu'il s'agisse de créations originales qui viennent de vous. Toutefois, ce tutoriel ne traite pas de la manière d'intégrer ces graphismes à votre jeu, qu'il soit en C ou en Basic Casio.

Partie I – Redessiner un sprite pour une adaptation.

Dans ce tutoriel, je monterai les manipulations à effectuer sous GIMP. Elles sont tout à fait possibles sous un logiciel de traitement d'image équivalent comme Photoshop.

Un nombre conséquent de jeux de ce site, notamment parmi les plus téléchargés, sont des adaptations de jeux préexistants, comme le fameux The Legend Of Zelda. Pour que l'univers visuel de votre jeu se rapproche le plus possible du jeu original auquel il se rattache, il semble logique de partir des sprites originaux de ce dernier. C'est ce que je vais faire dans mon exemple. Mon choix se portera cette fois-ci sur le jeu Shovel Knight , afin d'en tirer un sprite monochrome de 16 * 16 pixels :


La première étape consiste à trouver le sprite à partir duquel vous voulez redessiner. L'image que j'ai trouvé est parfaite : les pixels ne sont pas floutés. Ils sont bien nets. Faites en sorte d'avoir cette qualité d'image-là. Par la suite, les principales manipulations que j'utiliserai se résumeront à cela :
– Redimensionner l'image sans anti-crénelage
– Dessiner des pixels noirs et blancs avec le crayon
– Rogner l'image
– Effectuer un seuillage
– Sélectionner un carré

Je commence par isoler mon petit personnage. Pour cela, il faut que je sélectionne le personnage avec le moins de blanc possible. Je fais aussi en sorte que la sélection soit carrée. Pour cela, j'utilise l'« Outil de sélection rectangulaire » (j'appuie sur R) et, dans les réglages, je clique sur « Fixe » pour garder toujours le même ratio. Dans l'espace correspondant, je tape « 1:1 » afin que la sélection soit toujours carrée.


Je rogne ensuite l'image en cliquant dans « Image » → « Rogner depuis la sélection ».


Maintenant que notre personnage est isolé, je le redimensionne. J'utilise pour cela l'« Outil de remise à l'échelle » (Maj + S). Faites bien attention à sélectionner, dans les réglages de cet outil, « Type d'interpolation : Aucune ». Par défaut, il devrait être réglé sur « Cubique ». Cliquez ensuite sur votre image pour la redimensionner. Je sais que la mienne a des pixels deux fois plus gros, par exemple. Faites donc en sorte de réduire votre image le plus possible sans faire disparaître de pixels et sans perdre d'information.


Je procède ensuite au seuillage. Pour cela, c'est très simple : allez dans « Couleur » → « Seuil ». Réglez le seuillage comme bon vous semble, afin d'avoir un bon équilibre entre les valeurs de noir et de blanc.


Redimensionnez votre image à nouveau pour qu'elle soit à la taille souhaitée. Dans mon cas, je veux un sprite de 16 * 16 pixels. Je redimensionne donc mon image en 16 * 16, toujours en faisant attention d'avoir réglé l'interpolation sur « Aucune » afin d'empêcher l'anti-crénelage.


Rognez à nouveau l'image, et utilisez l'outil « Crayon » (N) pour redessiner sur votre image qui a, cette fois, perdu des informations. Dans les réglages, prenez le soin de régler la brosse sur « Pixel » avec une taille de 1. Appuyez sur X pour intervertir la première et la deuxième couleur (Noir et Blanc).


Cette partie est la plus délicate. Étant donné que votre sprite est plus petit, vous n'avez pas d'autre choix que de sacrifier des détails. Tentez de garder visibles et reconnaissables les éléments caractéristiques de votre personnage. Mon chevalier a un heaume à corne très important, ainsi qu'une épée en forme de pelle. Je vais donc faire en sorte de mettre en valeur ces deux éléments. Surtout, prenez votre temps, et souvenez-vous que vous pouvez annuler avec Ctrl + Z. Enfin, voici le résultat pour ma part :


Partie II – Dessiner vos propres sprites.

Pour ce qui est de vos créations originales, je vous recommande de passer par une étape préliminaire sur papier. Autrement dit, de dessiner avec vos mains.
« Mais je ne sais pas dessiner ! »
Ça, c'est surement ce que vous êtes en train de vous dire. Je vous répondrais que, tant que vous penserez cela de vous, vous ne pourrez pas dessiner.
« Mais tu dis ça parce que tu sais dessiner, toi ! »
Je vous arrête de suite : j'ai toujours, et encore aujourd'hui, profondément détesté mes dessins. À peine avais-je dessiné quelque chose que je ne voulais plus le regarder. Essayez ! Le but ici n'est pas de faire de merveilleux artworks, mais de vous faire une base sur laquelle partir. Saisissez vos crayons, en avant !

N'hésitez pas, si vous êtes en manque d'idées, à vous inspirer de ce qui existe déjà ; de jeux que vous aimez, de films que vous avez vus, de bandes dessinées qui vous enthousiastent, de peintures que vous appréciez... Ce n'est pas du vol, ce n'est pas non plus une preuve de manque de créativité. L'inspiration n'est pas un souffle divin qui nous tombe sur la tête, il faut la stimuler. Personnellement, je suis particulièrement séduit par les créatures du jeu The Binding Of Isaac, par leur côté morbide, malsain, affreux, cauchemardesque et en même temps enfantin. Gardez en tête que si votre sprite doit être petit (16*16pixels ou moins), il est inutile de faire beaucoup de détails. Une fois que vous avez dessiné, numérisez votre dessin si possible. Passez par un scanner si vous en avez un (ce n'est pas mon cas). Voici le dessin à partir duquel je vais commencer :

Remarquez la qualité dégueulasse de ma photo.

Ouvrez l'image sur GIMP, et procédez à des manipulations similaire à la partie précédente. Découpez l'image dans un carré et effectuez un seuillage pour n'avoir que des valeurs de blanc et de noir :


Réduisez la taille de l'image. Ne la réduisez pas immédiatement à la taille que vous souhaitez. Essayez de la réduire sans trop perdre d'informations.


Les traits les plus fins de votre dessins risquent de disparaître : il parait alors logique de les épaissir. vous pouvez tenter de le faire avec l'outil crayon. Une autre petite astuce consiste à aller dans « Filtres » → « Artistiques » → « Dessin au crayon... ». Réglez le rayon et le pourcentage de noir à des valeurs suffisamment élevée pour que le changement soit significatif.


Après cette opération, effectuez de nouveau un seuillage pour ne plus avoir les valeurs de gris qu'aura rajouté le filtre. Comme pour la partie précédente, réduisez ensuite l'image à la taille souhaitée (32*32Pixels pour mon cas) puis utilisez l'outil crayon pour redessiner et perfectionner votre sprite. Voici le résultat !


Et ce sera tout pour aujourd'hui ! N'hésitez pas à partager vos créations sur Planète Casio !

Liens utiles :
Voir le TDM précédent : Gérer les entrées !
Voir le TDM n°1 : Créez de magnifiques écran-titres !
Un tutoriel pour réaliser ses tilesets monochromes.
Connaissez-vous le Super Drawstat ?


Commentez cette news ! (3)
écrit par Drak le 15/08/2018 18:00 Voir toutes les news

La Revue des Projets - 117
Bienvenue dans cette 117ème édition de la Revue des Projets ! Pas grand chose cette semaine à se mettre sous la dent, mais la qualité est au rendez-vous !

Et donc on retrouve Massena qui nous parle des avancées de son projet de RPG Evocalc. Vous en avez entendu parler dans les RDP 113 et 116, voici quelques nouvelles fraîches !

Massena a écrit :
Helloooo tout le monde !

J'ai du nouveau sur mon projet Evocalc !

J'ai ENFIN fini la map. Elle est constituée de 6 pictures mises en rectangle de 3x2.
La voici :



Elle est pas belle ?
En tout cas, j'ai bien galéré ( J'ai tout fait sur la calto avec un programme graphique bricolé par mes soins ( bon ok à l'arrache ) où on voit PAS le curseur, on trace pixel par pixel, bref, c'est pas GUMP )

On se retrouve dans deux semaines cette fois ( Je pars à la plaaaage ! ) pour parler du moteur de combat basique, avec description technique et images.

Je vous rappelle aussi que vous pouvez consulter le topic officiel si vous avez des suggestions !

Bonne soirée !
Masséna


Y'a pas à dire, personnellement je trouve que ça roxe ! Pour du pixel art, c'est du pixel art de qualité. J'ai hâte de voir ce que va donner le moteur de combat, ça s'annonce bien.

Et vous, qu'en pensez-vous ?


Cette semaine, 1 programme a été posté :

Useless Game par KikooDX, un jeu de tire vue de dessus. Il est en cours de développement, d'autres fonctionnalités devraient arriver prochainement.

Vous aussi participez à la RDP !

Lire la RDP précédente : RDP - 116

À bientôt sur Planète Casio !


Commentez cette news ! (24)
écrit par Dark storm le 12/08/2018 18:00 Voir toutes les news

La Revue des Projets – 116
Il fait chaud. Vous transpirez sur votre siège. Votre ordinateur peine à refroidir sa carte mère. Vous avez soif. Vous avez aussi la flemme d'aller vous chercher une bouteille d'eau. Vous ne sortez plus. Elle est là, elle nous attend tous. La canicule est à nos portes ! Alors que l’infamie frappe à nos portes et à nos volets, quelques courageux individus poursuivent leur quête sous la chaleur accablante de l'été. Ils sont quatre. Massena montre de grandes avancées sur Evocalc, Zezombye fait une démonstration de compétence avec son MicroPython, Lephenixnoir nous réserve une surprise et moi-même m'apprête à vous mettre l'eau à la bouche.

Sans attendre davantage, voyons les merveilleux projets que porte cette RDP ! Vous savez, c'est aussi la saison des mirabelles et des melons ; alors voyons voir si ces fruits sont mûrs...

Nous commençons avec Massena et son superbe projet Evocalc ! Vous en avez peut-être déjà entendu parler dans la RDP–113, il s'agit d'un jeu qui s'appuie sur le principe d'Evoland, un jeu retraçant l'histoire et l'évolution du jeu vidéo dans ses graphismes et son gameplay. Evocalc retracerait donc un ensemble de techniques utilisées pour faire des jeux, du plus élémentaire au plus poussé ! Je vous laisse contempler ce que Massena a à nous montrer.
Massena a écrit :
Bonjour à tous !

Comme j'ai fait joujou avec les graphismes de la calto et avec BIDE aussi, au grand daim de ma calculatrice... Je vous fais part de certaines images, comme ça. Gratuitement.

Commençons par la première :


Bon, là vous voyez l'écran d’accueil, fait avec le TDM n°1
J'ai mis une heure à le faire, et j'en suis plutôt fier.


Là, vous voyez la map rétrécie pour qu'on voie tous les éléments.
La map sera constituée de 6 pictures assemblées en 3x2.
Je ne gère pas encore le moteur de collision...
Étrange, un deuxième cadre s'est mis là.


Là, un bout de map tel que vous le verrez sur la calto.
On voit le château et la chaîne de montagne en arrière-plan.

J'ai aussi bossé sur le jeu textuel. C'est basé sur une aventure dont vous êtes le héros, et je viens de la terminer. Il y a 50 paragraphes, c'est peu, mais vous oubliez que je suis un sadique . La difficulté va être rehaussée !

Bon, voilà, j'ai vidé mon chapeau.
La semaine prochaine, je vous partagerai la map en entier, si je la finis.
Bon, salut, et à la semaine prochaine !

Je dois dire que – pardonnez ma familiarité – j'étais sur le cul lorsque j'ai vu ces graphismes ! Je me doutais que Massena pouvait faire de beaux jeux, mais à ce point... ! Je suis également heureux que le premier TDM ait été utile à quelqu'un !

À présent, poursuivons notre récolte. C'est au tour de Zezombye, qui nous fait part de ses avancées sur son port de MicroPython pour calculatrices monochromes. C'est un projet assez complexe qui nous permettra, bientôt, de coder en python sur une calculatrice monochrome ! Alors, Zezombye ? Les fruits sont-ils beaux ?
Zezombye a écrit :
Pour le MicroPython, j'avance pour l'instant assez vite :

- Le shell fonctionne, je peux exécuter des commandes basiques (genre print) mais il faut que j'écrive les fonctions manquantes de la libc nécessaires pour compiler les features manquantes (les flottants, math, urandom...)

Aussi, pour une raison que je ne connais pas, la fonction input() ne marche pas, j'arrive pourtant à faire "import sys" :

Après il restera juste du graphique (gérer le retour arrière dans le shell par exemple).

Au niveau de l'éditeur, je suis sur un fork de Edit ( https://www.planet-casio.com/Fr/programmes/voir_un_programme_casio.php?showid=2186&page=2 ) et pour l'instant le plus dur est de modifier le code pour ne pas faire de retour à la ligne du tout.
J'ai presque fini, il me reste juste quelques bugs au niveau du copier/coller et de la suppression après le curseur.
(j'ai bien galéré pour avoir ce gif )
Edit : Un .mp4 n'est pas un gif ; j'ai fait la conversion. – Drak

Ensuite, il restera juste le catalogue, les fonctions rapides (avec les touches F1-F6), gérer les touches, et linker l'éditeur et le shell.

Toute aide pour le projet est la bienvenue (merci à Lephenixnoir qui m'a bien aidé ) !

J'imagine qu'il nous faudra bientôt des tutoriels sur le python ! En tous les cas, je tire mon chapeau : faire un port de MicroPython sur des calculatrices monochromes, c'est pas de la tarte. Un grand bravo à toi, ZZ-top ! On t'encourage !

La suite avec mon propre projet de RPG en Basic Casio. Ce dernier continue de s'appeler Aventura, Le Royaume Poudingue, mais pourrait changer de nom bientôt. Cette fois, je viens avec l'artillerie lourde :
Drak a écrit :
Hey tout le monde !

C'est encore moi – je vous apporte des nouvelles concernant mon projet de RPG ! Et je peux vous dire qu'elles sont plutôt encourageantes. Jusque là, je m'occupais du code, du code, du code, et encore du code. À présent, j'en suis arrivé à un point où l'ensemble de la structure du jeu (le moteur de jeu, pourrait-on dire) est presque complet. Il ne me reste plus que quelques petits détails à implémenter à droite à gauche. Le système de Map est complètement fonctionnel, le moteur de dialogue aussi, le moteur de combat l'est également, le joueur peut sauvegarder, regarder ses caractéristiques, regarder le carte (qui ressemble à rien pour le moment), changer d'étage, etc. Bref, presque tout fonctionne. Presque ? Oui, presque. Il ne me manque plus que ces quelques détails à ajouter au jeu :

– Possibilité de choisir le skin de son personnage
– Possibilité de changer des tiles de place avec une avancée de quête (easy)
– Gérer les différentes zones (Indiquer le nom de la forêt, du donjon, etc.) en changeant les monstres que le joueur peut rencontrer.
– Peaufiner le système de sauvegarde
– Et c'est tout !

J'ai également renforcé la compression des chaînes de caractère qui contiennent les map. J'ai calculé un gain de place d'approximativement 15% sur un ensemble de map !

Mais ce n'est pas tout ! J'ai aussi pris le temps – que dis-je ? Le luxe ! – de me programmer deux outils complémentaires pour créer mes map super facilement ! Vous le savez peut-être déjà si vous suivez de prêt le projet, mais mon système de sauvegarde de map est complexe et rend le level design compliqué sans outil approprié. Pour vous donner une idée, voici à quoi ressemble le code compressé d'une salle de donjon :
θ*4Z*6→44→34﹣﹣006{2→6﹣Y04→8﹣→3f00e(100*6Z{1*5
Et son code décompressé :
θ﹣﹣﹣﹣Z﹣﹣﹣﹣﹣﹣000040004﹣﹣006{2000000﹣Y0400000000﹣000f00e(100﹣﹣﹣﹣﹣﹣Z{1﹣﹣﹣﹣﹣

Assez hard de faire plus d'une centaine de map, voire une deux-centaine, si vous voulez mon avis. Alors voici : je vous présente le Générateur de Map ainsi que l'Éditeur de Mappemonde !
Le Générateur de Map, semblable au logiciel Tile dans son fonctionnement.

L'Éditeur de Mappemonde, qui sert à avoir un aperçu d'ensemble et à générer le code.


Je suis moi-même surpris d'être arrivé aussi loin dans ce projet. À partir de maintenant, je n'ai plus le choix : je ne peux que finir ce projet de jeu ! Par ailleurs, les deux outils que j'ai programmé ne sont disponibles ni sur le site, ni sur le dépôt Git. Je suis encore en train d'y apporter un bon nombre de petites rectifications. Une fois que ce sera bon, je les mettrai sur le Git du projet.

Et enfin, mais pas des moindres... Un article de notre administrateur adoré, j'ai nommé Lephenixnoir, qui arrive en retard ! Je lui laisse le micro pour parler de Gint, son fabuleux projet.
Lephenixnoir a écrit :
Bonsoir Planète Casio ! C'est un honneur de vous retrouver dans cette Revue des Projets.

Comme je ne me lasse pas de programmer ce puits sans fond que j'appelle gint, j'avance sur mon portage Graph 90+E doublé d'une réécriture avec optimisation. Récemment, j'ai réussi plusieurs choses très cool :

- Porter mon driver pour les timers matériels, précis à ~100 ns contre 25 ms pour SetTimer() ; et en écrire un driver pour les timers ajoutés par Casio, précis à ~ 30 µs. Il y a un seul timer ajouté sur SH3, mais 6 sur SH4 et en particulier sur Graph 90 !

Pour ça j'ai bien galéré, des subtilités d'optimisation de compilateur aux différences comportementales (non documentées) entre les deux types de timers, en passant par ce que je considère comme un bug hardware. Mais voilà, ça marche et c'est une bonne chose ! Car ces timers sont utiles pour mesurer les perfs de tout plein de trucs. Par exemple :

- J'ai écrit la version normalement finale du gestionnaire d'interruptions : l'ancien pouvait traiter jusqu'à 180'000 interruptions par seconde, mais celui-ci peut monter jusqu'à 320'000 !

- Et puis j'ai porté le driver pour la RTC, l'horloge de la calculatrice.

Là je suis en train de me pencher sur les horloges, notamment l'overclock et la fréquence de tout ce qui oscille dans la calculatrice. Mes timers sont pas hyper précis pour l'instant, c'est pas très grave mais je vais voir si ça peut s'améliorer.

Tout ce que je vous raconte là marche sur SH3, SH4 et Graph 90 avec le même code, c'est très intéressant à développer ! La prochaine fois j'espère vous parler d'overclock et de dessins : ou bien des trucs jolis sur la Graph 90, ou bien des trucs fulgurants sur la monochrome.

À la prochaine !

Que de performances ! Je m'impatiente à l'idée de voir ce que Lephenixnoir nous réserve pour la suite !

C'est avec quatre articles que je boucle cette Revue Des Projets, ce qui est tout de même honorable ! Je tiens à vous rappeler, chers lect·eur·rice·s, que c'est avec vos projets que Planète Casio s'anime ! Alors, si vous aussi vous avez quelque chose à partager, n'hésitez pas !
Et, comme toujours... Stay tuned!

Cette semaine, 4 programmes ont été postés :
Penalty game de Manolo. « c'est un jeu de penalty, c'est tout... », nous dit son concepteur ! Un jeu conçu pour les Graph 90+E.
Essai, un Add-in pour CG75/85/95, ou encore 35+ tweakée. Il s'agit du tout premier jeu de Shadow15510 en C : déplacez votre personnage dans un sympathique décor.
Données pro, un utilitaire de Vanonym pour CG90+E, permettant de « stocker de manière sécurisé jusqu'à 333 données sur votre calculatrice. »
CasioPython, le portage de MicroPython pour calculatrices monochromes de Zezombye. Référez-vous à son article dans cette RDP.

Lire la RDP précédente : RDP – 115


Commentez cette news ! (9)
écrit par Drak le 05/08/2018 18:00 Voir toutes les news

TDM n°4 – Gérer les entrées
Le Tuto Du Mercredi [TDM] est une idée qui fut proposée par Ne0tux. Un mercredi sur deux, nous postons un petit tutoriel sur l'Utilisation de la calculatrice, le Transfert, la Programmation, ou encore la Conception de jeu. En voici la quatrième édition !

Gérer les données entrées par l'utilisateur

Niveau : ★ ☆ ☆ ☆ ☆

Dans ce TDM, je vous expliquerai les techniques utilisables en Basic Casio pour que le joueur interagisse avec votre jeu via des commandes : c'est ce qu'on appelle les entrées. En fonction des besoins, il vous faudra adapter les méthodes que vous allez utiliser. Je vous expliquerai aussi les erreurs et les fautes que l'on commet souvent avec les entrées, et comment faire pour les éviter.

Partie I – La commande «?»

La manière la plus simple de demander quelque chose au joueur est d'utiliser la commande ?. Cette commande met le programme en "pause" jusqu'à ce que l'utilisateur ait fini d'entrer quelque chose et qu'il ait appuyé sur [EXE]. Le code suivant demande au joueur d'entrer un nombre.
"Entrez un nombre" ? → A
Jusque là, rien de bien dur. L'exemple suivant montre exactement la même chose, mais le résultat est cette fois-ci stocké dans une chaîne de caractère.
"Quel est votre nom" ? → Str 1

Attention toutefois, les erreurs arrivent vite :
"Entrez un nombre" ? → A //Cas n°1
"Quel est votre nom" ? → Str 1 //Cas n°2

Voici ce que j'obtiens dans chaque cas quand j'entre...
–> 5
A = 5 //Cas n°1
Str 1 = "5" //Cas n°2

–> BONJOUR
A = ??? //Généralement, A égale 0 car il fait le produit des variables B, O, N, J, U, et R. Toutefois, vous pouvez avoir à peu près tout et n'importe quoi.
Str 1 = "BONJOUR" //Cas 2, tout va bien

–> 2X² + log (3)
A = //Le résultat numérique de 2X² + log 3
Str 1 = "2X² + log (3)"

Voici un autre cas typique d'erreur :
"Entrez un nombre entre 1 et 128"? → A
//Le joueur, taquin, s'amuse à rentrer la valeur -30
Text 40,A, "Hello World! Whheeeeee!
Dans ce cas c'est l'erreur d'argument. La fonction Text renvoie une erreur d'argument lorsqu'on rentre une valeur qui n'est pas comprise dans les intervalles [1,64] et [1, 128]. Cette valeur doit aussi être un entier ! Ainsi, il faudra s'assurer que la valeur soit correcte.
Do
"Entrez un nombre entre 1 et 128"? → A
LpWhile A<1 Or A>128 //disque rayé !
Text 40,Int A, "Hello World!"

Vous commencerez peut-être à comprendre qu'on ne peut JAMAIS être sûr de ce que le joueur entre. Ne faites pas confiance au joueur. Il peut entrer une valeur fausse par étourderie, ou même sournoisement pour voir comment le programme réagit. Soyez malins et anticipez les erreurs possibles !

Dans le cas des chaînes de caractère, Rien n'empêche le joueur d'entrer un nom à rallonge qui fait plus de 100 caractères. Il faut prévoir cette éventualité. Sans doute n'aurez-vous jamais assez de place pour afficher son nom s'il est trop large. Voici comment faire.
"Votre nom" ? → Str 1
If StrLen(Str 1) > 8
Then StrLeft(Str 1, 8) → Str 1
"Votre nom a été réduit à 8 caractères."◢
IfEnd

Maintenant, dans des cas de figures un peu plus particuliers, un joueur peut s'amuser à faire de la merde et à taper VRAIMENT n'importe quoi :
"Votre nom" ? → Str 1
//Je rentre "sin log ln cos tan "
If StrLen(Str 1) > 8 //... et ça passe.
Then StrLeft(Str 1, 8) → Str 1
"Votre nom a été réduit à 8 caractères."◢
IfEnd

Les fonctions sin , cos, etc. (écrites directement sur les boutons correspondants du clavier de la calto) sont traitées comme un caractère chacun dans la chaîne. On peut contrer cela sans en écrire beaucoup :
Do
"Votre nom" ? → Str 1
If StrLen(Str 1) > 8
Then StrLeft(Str 1, 8) → Str 1
"Votre nom a été réduit à 8 caractères."◢
IfEnd
For 1→A To 6
StrSrc(Str 1, StrMid("log ln sin cos tan ", A, 1)) ⇒ Break //Si StrSrc renvoie une valeur non nulle, alors on sort prématurément de la boucle For pour recommencer au début
Next
LpWhile A < 6


Partie II – Les GetKeys

Pour commencer, ayez toujours bien en tête cette image :
Merci Zezombye pour cette image.

Cette image décrit le code numérique correspondant à chacune des touches du clavier de la calculatrice. Ce code numérique, vous pouvez le récupérer via la fonction GetKey. Dans la plupart (la totalité ?) des cas, on utilise cette fonction dans une boucle :
Do
GetKey → G
LpWhile Not G //Tant que la valeur de G est nulle, on tourne en boucle.
Retenez bien que, par défaut, le GetKey renvoie la valeur 0 : Autrement dit, si aucune touche n'est appuyée, il égale toujours 0. Quand une touche est appuyée et tant que celle-ci reste appuyée, GetKey renvoie la valeur correspondante de la touche, qui est indiquée sur l'image ci-dessus. Le code suivant continue de tourner tant que le joueur n'appuie pas sur la touche "0" :
Do
GetKey → G
"Appuie sur 0, bougre d'idiot !"
LpWhile G≠71

Voici alors comment on peut fabriquer un petit moteur de jeu qui fait avancer votre personnage. On prend en compte que ce dernier a I et J comme coordonnées.
While 1
Do
//On redessine le joueur si besoin
Do
Getkey → W
LpWhile Not W
W = 28 ⇒ Dsz J //Touche du haut, on monte
W = 27 ⇒ Isz I //Touche de droite, on va à droite
W = 38 ⇒ Dsz I //Touche de gauche...
W = 37 ⇒ Isz J //Bas
W = 48 ⇒ Break // Menu, on fait autre chose
LpWhile1
// Le menu, autres truc, etc.
[...]
WhileEnd // On revient au début.

Un problème qui arrive souvent est celui-ci :
//Début du programme
"MEGA-JEU"
"Appuie sur [EXE] pour commencer !"
While GetKey ≠ 31
WhileEnd
Cls
Stop
Lorsque le joueur lancera le programme, il n'en verra même pas la couleur : un «done» s'affichera, indiquant que le programme a fini de tourner. Pourquoi ? Tout simplement parce que le joueur n'aura pas eu le temps de relever le doigt de la touche [EXE] (Sauf s'il est trèèès rapide) et que donc, le GetKey restera à la valeur 31. C'est comme si la boucle n'existait pas. Pour éviter cet inconvénient, voici la parade :
//Début du programme
"MEGA-JEU"
"Appuie sur [EXE] pour commencer !"

While GetKey
WhileEnd //Tant que le joueur a un doigt sur une touche, il ne sort pas de cette boucle. Donc, il n'arrivera à la suite qu'au moment où il aura relevé le doigt de la touche EXE.

While GetKey ≠ 31
WhileEnd
Cls
Stop
Cette solution est à placer devant chacun de vos GetKey qui sont susceptibles de rencontrer ce problème. Elle ne prend que 3 octets et permet d'éviter beaucoup de désagréments.

Partie III – Choses à ne PAS FAIRE !

Il y a un certain nombre d'erreurs de débutant que l'on commet facilement quand on découvre tout cela. Ces choses sont à ne pas faire sous peine de se faire foudroyer pas la colère des Dieux.
Lbl 1
GetKey → G
G = 31 ⇒ Goto A
Goto 1
Les raisons pour lesquelles il est déconseillé (voire implicitement interdit) de faire ceci sont nombreuses. En voici une liste, sans doute non exhaustive :
– Les Labels ne sont pas conçus pour faire des boucles. Ils ne sont pas adaptés pour cela.
– Une boucle avec un Label est plus lente à l'exécution qu'une boucle While ou Do LpWhile.
– Les Labels sont souvent sources d'erreur, parfois très difficile à comprendre pour quelqu'un qui découvre le Basic Casio
– L'utilisation des Labels de manière générale n'est pas recommandée. Il a été prouvé qu'un code avec Label peut toujours avoir son équivalent à l'exécution sans Label.
– L'utilisation des Labels désorganise facilement la structure de votre code et le rend moche. Affreux. Désastreux.

Alors, retenez bien : On ne fait pas de boucles avec les Labels.
Faites plutôt ceci. C'est plus simple, plus sain, plus propre :
Do
GetKey → G
LpWhile G≠31

De même, ne faites plus ceci :
Do
Getkey → W
W = 28 ⇒ Dsz J
W = 27 ⇒ Isz I
W = 38 ⇒ Dsz I
W = 37 ⇒ Isz J
W = 48 ⇒ Break
Text 1, 1, "Joueur : " + Str 1
Prog"INFO"
//Etc.
LpWhile Not W
Ce code a un énorme défaut : la boucle du GetKey cohabite avec plein d'autres commandes : des conditions, des fonctions graphiques, un appelle d'un sous-programme... Tout ce que vous demandez à la calculatrice demande un certain temps à être effectué. Donc il se peut que le joueur appuie sur la touche quand la calculatrice est en train d'afficher Text ou encore quand elle est dans le sous-programme INFO. Autrement dit, au moment où la boucle en revient à la ligne avec le GetKey, le joueur aura déjà relevé le doigt de sa touche. Et c'est comme si le joueur n'avait jamais appuyé sur un bouton. C'est ce qu'on appelle la réactivité : pour que votre GetKey soit réactif et réponde le plus efficacement possible, il faut l'ISOLER LE PLUS POSSIBLE du reste. Dans notre cas, faites en sorte d'avoir plutôt quelque chose comme ceci :
While 1

Do
Getkey → W //Le GetKey est seul dans sa boucle, et c'est très bien.
LpWhile Not W

W = 28 ⇒ Dsz J
W = 27 ⇒ Isz I
W = 38 ⇒ Dsz I
W = 37 ⇒ Isz J
W = 48 ⇒ Break
Text 1, 1, "Joueur : " + Str 1
Prog"INFO"
//Etc.
WhileEnd

De même, je déconseille fortement de faire ceci :
//Du code...
Prog"GETKEY"
If G = 71
Then //[...]
IfEnd
//Et encore du code, etc.

//___________________
PROGRAMME : "GETKEY"
Do
GetKey → G
LpWhile Not G
//Fin du sous-programme
Dans ce code, le programmeur a décidé d'éditer un sous-programme qui fait le GetKey, pour l'appeler plus facilement avec Prog"GETKEY" dès qu'il en a besoin. Cela pourrait être intelligent... Mais en fait ça ne l'est pas. Pourquoi ? En voici les raisons :
– L'appel d'un sous-programme est un poil plus lent que si on écrivait directement la boucle GetKey à la place du Prog"GETKEY".
– Un sous-programme vide prend 32 octets. L'appel du sous-programme prend toujours 3 octets (Prog " ") PLUS un octet pour chaque lettre du nom. Autrement dit, dans notre cas, on gaspille 9 octets à chaque fois PLUS 39 octets avec le sous-programme GETKEY, alors que la boucle GetKey toute seule n'en prend que 7.
– Si vous avez déjà 10 sous-programmes d'ouverts, ce sera l'erreur lorsque vous appellerez votre sous-programme GETKEY. Donc, potentiellement, un souci supplémentaire.
Bref, maintenant, je vous recommande d'arrêter de mettre un simple GetKey dans un sous-programme. Le code à effectuer n'est pas assez long pour que ça devienne rentable de faire cela.


Et ce sera tout pour cette fois ! Si vous avez des petites suggestions ou remarques pour compléter ce tutoriel, vous êtes la bienvenue. Si vous avez des questions, n'hésitez pas non plus. Si vous avez des envies particulières pour le TDM suivant, là encore, je suis ouvert à vos propositions. Bien sûr, n'hésitez pas à visiter les liens utiles que je vous donne ci-dessous !

Liens utiles :
Voir le TDM précédent : Manipuler les Str !
Manipulez les valeurs numériques du GetKey avec ce tutoriel.


Commentez cette news ! (12)
écrit par Drak le 01/08/2018 18:00 Voir toutes les news

La Revue des Projets - 115
Bonsoir à tous !
Cette soirée tranquille va être agrémentée d'une belle revue des projets. Vous vous souvenez de Redeyes ? Ce nouveau membre très motivé ? Eh bien il est de retour avec de belles avancées. Lightmare a des projets intéressants : le chatbot... On passera un joyeux moment devant une vidéo de Ninestars sur Windmill. Sans oublier notre ami Massena qui se lance pour la première fois à nous écrire un article ... Et nous terminons par notre bon vieil admin : Lephenixnoir


Nous avions laissé Redeyes avec la première partie de son jeu de rôle qui se passait entre Tokyo et un mystérieux monde parallèle dont je vous en dit pas plus... Toujours est-il qu'avant de passer à la deuxième partie de son jeu, notre jeune membre a décidé de pousser à a perfection la première partie de son jeu... Si vous ne connaissez pas : téléchargez-le, et si vous avez déjà jouer... eh bien refaites-le ! Cette version 2.0 est une réelle refonte du moteur physique et des dialogues du jeu. Ce qui nous offre un tout autre point de vue sur ce jeu. Je vous assez baratiné pour la semaine place au développeur !

RedEyes Kurenai a écrit :
Après un long silence, je reviens vers vous pour vous présenter l'avancement de mon rpg, Sword Burst Zero Proto-Z. Alors, je n'ai pas vraiment eu l'occasion d'avancer sur la deuxième partie du jeu et j'en suis sincèrement désolé. J'ai plutôt décidé de faire une rénovation complète du jeu en passant du mode Locate au mode Graphique, pour vous présenter les lieux de manière bien plus perceptible, étant donné qu'avec Locate, les graphismes sont peu significatifs, voire pas du tout.

Ainsi, j'ai conçu un logo pour le jeu et je l'ai placé dans l'écran titre que j'ai quelque peu modifié: Voici donc le logo avec l'écran titre:


De plus, les personnages principaux du jeu sont représentés en sprites et aussi en taille réelle en multi drawstat:



En ce qui concerne les boites de dialogues, elles sont affichées avec la photo de l'interlocuteur comme ceci:


Et lorsque l'on change de lieu ou d'univers (area 1 vers area 2 ou monde réel vers l'Online-Universe) la présentation du nouveau lieu à été modifiée ainsi:

Ici, c'est la ville de Tokyo


En ce moment, je travaille sur les cartes des lieux et le moteur de déplacement où je compte élargir la carte par rapport a celle imaginée précédemment. Les sprites ont une dimension de 9x9, j'ai ainsi organisé les cartes avec une dimension 14x7. Ainsi j'ai pu concevoir l'intérieur de la maison de notre personnage, là où tout commence, ainsi que la conversation avec un pnj:





Voilà, c'est tout pour le moment! Merci et à la prochaine revue!


Bon eh bien voila... un beau projet avec un membre motivé et hop : un beau jeu en plus ! Si vous souhaiter lui faire part d'idée ou de conseil n'hésitez plus ! Cliquez ici !

Vous connaissez le chatbot ? Mais si : ce sont ces intelligence artificielles qui, comme "Siri" vous permettent de converser avec une machine... Ces IA doivent bénéficier d'une grande base de données pour permettre des réponses cohérentes et sur une calculatrice c'est un projet complexe. Un petit zoom sur les défis techniques à relever :
Lightmare a écrit :
Bonjour ! aujourd'hui, pas de projet à proprement parler mais un petit descriptif de mon idée pour créer un chatbot ( IA dont le rôle est de vous faire la conversation comme Siri ou Alexa ).

Alors pour commencer, je tiens à vous prévenir qu'il y a certaines étapes pour lesquelles je n'ai pas la moindre idée de comment les réaliser en Basic (Mais ne vous en faites pas, c'est juste parce que j'ai eu la flemme de plancher sur le sujet car j'ai d'autres trucs en cours ).
Pour que vous comprenniez, je vais décomposer le problème en deux phases elles mêmes divisées en plusieurs étapes :


Phase 1 : la décomposition de la phrase

Par exemple, admettons que je rentre une phrase du type : LE PETIT CHIEN NOIR MANGE

l'IA va d'abord décomposer la phrase en mots et va les comparer avec une base de donnée de mots répartis en diverses catégories ( je t'en cite quelques unes que j'ai imaginées ) :

- les déterminants : ou tous les mots courts du genre : le, la, les, ce, cette, ceux-ci... etc ( dans la phrase qu'on a choisie, le déterminant sera LE )
- les radicaux des verbes : ici se rangent uniquement les racines des verbes ( par exemple, le radical du verbe MANGE dans ma phrase du début est MANG, cela permet ainsi de ne pas différencier les verbes en fonction de leur terminaison, car pour le moment on s'intéresse seulement à leur nature )
- les verbes irréguliers : ce sont tous les verbes comme ETRE ou AVOIR qui n'ont pas de radical, ils sont donc stockés ici, conjugués à tous les temps et tous les modes ( c'est long ! )
- les terminaisons des verbes : c'est l'autre moitié de la catégorie des radicaux des verbes, donc ici sont stockés les terminaisons comme -AIT -AIS -ERA... etc
- les noms : catégorie la plus simple à expliquer ! Elle regroupe tous les noms propres et noms communs. Comme elle costitue la plus grande liste de mots de la base de donnée, il faudra la diviser en sous-catégorie comme "noms propres", "animaux" ou "plantes". Ces catégories seront agencées en arborescence pour que l'IA puisse donner un "sens" aux mots qu'elle analyse, comme par exemple dans le cas qui nous concerne, le mot CHIEN sera dans la catégorie "animaux de compagnie" qui sera dans la catégorie "animaux", et ce pour quasiment tous les noms.
- les compléments : cette catégorie aussi devra être subdivisée en catégories comme "adjectifs" ou "compléments du nom", et là, comme pour les noms, les différentes parties seront structurées en arborescence.


Une fois les mots retrouvés dans la base de donnée, l'IA leur aura aussi attribué un sens. Comme pour le cas du mot CHIEN, pour lequel elle saura q'il s'agit d'un animal de compagnie comme le chat ou le hamster. De même pour l'adjectif PETIT, quisera interprété comme étant un adjectif de taille, traitant du physique.
Ensuite intervient une nouvelle phase, celle de la construction de la réponse !


Phase 2 : conception d'une phrase


Le challenge à relever ici est de construire une phrase :
- grammaticalement juste
- cohérente
- en rapport avec la phrase de l'utilisateur ( et éventuellement avec les phrases qui précèdent, dans le cas d'un dialogue, mais je théorise encore sur ce sujet )

Pour la première contrainte, c'est assez facile : il suffit d'imposer un ordre de construction de la phrase ( d'abord le sujet, puis le verbe et enfin le complément, dans le cas d'une réponse sous forme d'affirmation ).
Pour la deuxième contrainte, le principe de subdiviser la base de donnée des mots en diverses parties de plus en plus spécifiques va jouer un rôle majeur : en effet, l'IA va pouvoir créer une réponse d'abord autour d'un sujet choisi aléatoirement dans une liste de mots appartenant à la même sous-catégorie que le sujet de la phrase de l'utilisateur. Par exemple, ici notre sujet est LE PETIT CHIEN NOIR. L'IA va d'abord enlever le déterminant LE, puis les adjectifs PETIT et NOIR, pour avoir juste le mot CHIEN qui apprtient à la sous-catégorie "animaux de compagnie". L'IA va donc choisir un sujet dans une liste composée de plusieurs noms d'animaux de compagnie avec une préférence pour choisir le chien, comme l'utilisateur.
On va admettre que le sujet choisi est à nouveau CHIEN.

Ensuite vient le choix du verbe, et par le même principe que le sujet, il va être choisi aléatoirement parmi une liste de verbes similaires, donc comme MANGER ( ou plutôt MANG comme on va chercher dans la catégorie des radicaux de verbes ) appartient à la sous-catégorie des verbes se rapportant à la nourriture, la liste sera composée de verbes liés à la boustifaille ^^.
On va admettre une fois de plus que le radical choisi est VOM ( comme VOMIR )
Ennnnnnsuiiiiite vient le choix de la terminaison de notre verbe, ce qui est un choix beaucoup moins difficile puisque dans notre cas, il n'y en a qu'ue seule de possible étant donné que la terminaison du verbe employé dans la phrase de l'utilisateur appartient à la sous-catégorie "présent" ( qui elle même appartient à la catégorie "verbe du 1er groupe" ), et que comme le sujet n'est pas un pronom personnel (je, tu, il... ) et que le déterminant est au singulier, on en déduit que la terminaison devra être à la 3eme personne du singulier. ET comme VOMIR est un verbe du 3eme groupe, l'IA va aller chercher la terminaison à la 3eme personne du singulier dans la sous catégorie "présent" de la partie "verbe du 3eme groupe", ce qui donne VOMIT.
Pour finir, vient le choix du déterminant puis du complément. Le déterminant est simple à trouver, il s'agit de LE, et le complément sera un adjectif qualificatif choisi aléatoirement parmi ceux employés par l'utilisateur ( ici la liste de choix est composée de NOIR et PETIT ). On va admettre que l'IA a choisi PETIT.

ET enfin la phrase de réponse obtenue est:

LE PETIT CHIEN VOMIT

Ce qui constitue une réponse qui me ferait bien rire si je l'obtenait
Vous a écrit :
...Mais, que ce passerait-t-il si l'IA ne connaissait pas le mot CHIEN ?


Et bien les programme va tout d'abord déduire le maximum d'information sur le mot concerné, dans notre cas il s'agirait de déduire le genre masculin ou féminin du mot CHIEN ( masculin enraison du déterminant LE qui est masculin ).
Ensuite, l'IA vous dira qu'elle ne comprend pas ce mot, puis vous demandera de remplir un formulaire pour déterminer à quelle catégorie de noms le mot CHIEN sera affecté et à quelles notions il sera lié ( les questions pourraient ressembler à : "Quel est son féminin ?" ou "parmi les classes suivantes, à laquelle/lesquelles appartient-il ?" ).
Dans ce genre de cas, libre à vous de lui dire la vérité ou pas , vous pouvez lui faire croire qu'un chien est un arbre fruitier ou autre chose !

Voilà ! donc pour résumer le principe, l'IA se calque sur les mots employés par l'utilisateur et un facteur aléatoire pour constituer des phrases.
Je tiens quand même à rappeler que je décris ici le cas le plus probable et le plus simple. Donc j'espère que ceci éveillera peut-être votre flamme créatrice !
A plus !

Lightmare

Imaginez que vous conversez de cette sorte avec votre calto ... Un doux rêve qui va se concrétiser grâce aux travaux de Lighmare ! On vous tient au courant promis.

Passons à Ninestars : son projet Windmill qui jusque là avançais masqué, vient de sortir de l'ombre de l'ignorance par deux fois... Voila le résultat :


Ninestars a écrit :

Jour 17



Et voilà la vidéo tant attendue que j'avais promis il y a quelques semaines !
Le moteur est super stable et il n'y a plus d'artéfactes visuels majeurs !!
C'est un vrai plaisir à regarder Pour ça rien de mieux qu'une vidéo !
Je teste ici sur émulateur et sur la machine


Le problème de clipping est résolu !
Pour récapituler, j'ai intégré du clipping sur l'axe devant-derrière pour couper les triangles passant derrière la caméra. Puis j'ai créé une nouvelle fonction pour découper les triangles sur l'axe haut-bas/droite-gauche, c'est à dire les bord de l'écran pour régler des problèmes d'overflow (cf jour 16). Le résultat est que le moteur est capable d'afficher des triangles dans n'importe quelle position, même la plus tordue sans bug, ou déformation du triangle.

A cette occasion j'ai revu toute la structure interne pour gérer l'affichage des objets. Je commence avec 1 triangle, et le clipping peux me renvoyer 1 à 10 triangles. Au lieu de gérer chaque point individuellement et avec des conditions à n'en plus finir, j'ai tout inséré dans un tableau que j'envoie à mes fonctions, et tout roule tout seul. c'est beaucoup plus léger et propre.

J'ai rajouté une synchronisation de la caméra avec le rendu. Le déplacement de la caméra (gestion du clavier) est appelé par un timer à interval régulier, ce qui peut tomber pendant le rendu d'une frame. Du coup je commence à dessiner un objet en regardant sous un angle X, la caméra se mets à jour et je termine de dessiner l'objet sous un angle Y. Ça provoquait des secousses et bugs visuels.

Résolution d'un bug sur le z-buffer.

Correction des quelques soucis avec le rendu du sol.

Un peu d'optimisation sur quelques variables.

Un projet qui avance vite et bien ! On peut presque dire que Windmill aboutit... Voici le lien : Windmill


Oh ! un invité surprise... mais qui est-ce ? L'image devient nette... et il s'agit de... de... Massena Eh ! pss t'as vu ? Le pseudo est bien écrit ! Bon Massena a un projet dont nous avions eu l'occasion de voir l'ouverture il y a deux semaines... Depuis des brouillons ont été fait et le projets se précise sur le papier : je vous parle d'Evocalc
Massena a écrit :
Bonjour chers Planetcasiociens ! Comment on vous appelle déjà ?
C'est mon premier projet dans la RdP, je ne sais pas trop comment rédiger...

Donc aujourd'hui je vais vous parler de l'avancée de mon projet Evocalc !

Rappel du projet
Rappel du projet
Evocalc est un jeu inspiré d'Evoland.
Ce petit bijou nous raconte la grande évolution des jeux vidéos des années 1980 jusqu'à nos jours ! En passant par The Legend of Zelda, Secret of Mana, et Final Fantasy !
Evocalc sera développé en Basic Casio, sous calculatrice monochromes.
Le concept est de raconter l'évolution des projets d'une personne programmant en Basic.


Le jeu n'en est qu'au stade de préparation, bloqué par mon PC sans connexion internet ( j'écris avec un téléphone ) et une absence de piles !
Merci à Drak, Alexot et Shadow pour vos propositions et votre aide, grâce à vous je peux proposer un listing des idées pour le jeu. Je pense qu'une grande majorité d'ajout va arriver lors du codage, c'est pour cela que j'insiste sur le fait que cette liste est provisoire !

INTRODUCTION Dans tous les jeux y'a un moment chiant
- Découverte du Basic Casio.
- Jeux avec les variables.
- Jeux avec le texte.
- Plus ou moins ?
- Quasi aucune interaction...
- Interface graphique absente.

CHAPITRE 1 La nostalgie du tout premier mac...
- Jeu à intrigue textuelle.
- En premier lieu, choix à effectuer en répondant un chiffre avec ?→Var.
- Puis passage au menu avec lbl / goto.
- Puis passage au menu avec Getkey()
- Pause avec ( ◢ ).
- Objets à débloquer.
- Animation de Game Over.
- Cadre de jeu.
- Possibilité d'en choisir plusieurs ?
- Passage du texte MAJUSCULE à Minuscule.

CHAPITRE 2 Mon Dieu ! Je peux bouger !
- Jeu d'exploration en vue-de-dessus
- Affichage des sprites avec Locate ( Rip le graphique ).
- Utilisation de matrices.
- Passage aux strings ?
- Pas de combat.
- Affichage moche à cause du ClrText().
- Découverte du BackGround et des Pictures.
- Objets à débloquer.
- Des skins pour notre héros ! :keur:
- Un item "anti-sortie-de-l'écran" pour éviter le syntaxe error :troll:
- Une baguette anti-clignotement par rapport au BackGround.

CHAPITRE 3 Madame... C'est un petit pixel.
- Jeu vue-de-dessus en mode graphique.
- Découverte de la fonction Text()
- Moteur de combat ( inspiré par Tinker Island ! )
- Le héros et les ennemis ont des PA ( points attaque ).
- Le héros et les ennemis ont aussi des PV !
- À chaque round du combat, un bit est tiré au sort.
- Si le bit = 0, l'ennemi inflige ses PA aux PV du héros.
- Si le bit = 1, le héros inflige ses PA aux PV de l'ennemi.
- Ensuite, passage au round suivant.
- Utilisation du Fline() et de Plot()
- Sauvegarde dans les pictures
- Objets à débloquer.
- Divers épées, boucliers et autres potions pour ses stats.
- Les "dés du dieu" pour avoir deux chances sur trois d'avoir tirage gagnant...
- des graphismes détaillés à gagner !

CHAPITRE 4 /!\ Ce chapitre n'a quasi-aucune chance de paraître dans ma version finale !
- RPG vue-de-dessus complexe.
- Passage en DrawStat.
- Passage en SuperDrawStat.
- Passage en MultiDrawStat.
- Moteur de combat complexe.
- Armes, Sorts, Potions, Alliances...
- Combat au tour par tour.
- Scénario poussé
- Objets à débloquer.
- UpGrade des DrawStat ( migration vers un mode plus rapide, trois niveaux )
- Armes légendaires...
- Super-beaux-graphismes-de-la-mort-qui-tue.

Bon, je pense avoir fait me tour. Je ne pourrais pas intégrer toutes les pictures dans le fichier sur Fa-124, il devrait en avoir trop. Vous devrez supporter des temps de chargement .
Je pense aussi faire une variable / liste de sauvegarde.
Petit rappel : Si vous avez des suggestions, remarques, questions, que vous voulez voir une référence ou votre nom dans le jeu pour la modique somme de 250 € n'hésitez surtout pas à faire un p´tit détour par Le topic officiel !

Sur ce, je vous dis à bientôt dans une prochaine Revue des Projets !
And may the force be with you !

Un projet qui, une fois terminé, nous promet une belle expérience ! Bien entendu le topic dédié existe déjà ici. Si vous avez des idées de niveaux n'hésitez pas

Lephenixnoir nous entretient d'un projet qui lui tient à cœur puisque nous en avons déjà entendu parler lors... de la troisième édition de la Revue des Projets alors présenté par Totoyo... Un grand projet alors qui a beaucoup évolué en 4 ans !
Lephenixnoir a écrit :
Salut Planète Casio ! Je n'ai pas été très actif récemment (stage + vacances isolées en Bretagne) mais j'ai pris du temps pour avancer sur TLT.

Je n'ai pas de moteur physique assez poussé pour vous montrer une démo, par contre j'ai concocté un peu de pixel art. Des sprites d'un côté et des items de l'autre.

Les sprites sont assez difficiles à faire même s'il y a une bonne résolution, ici 24×32. Là où les bras ou les jambes font 2/3 pixels de large, c'est pas gagné pour représenter des petites variations de taille/position. La marche est un cas un peu extrême. Je suis quand même satisfait du résultat


J'ai aussi récupéré des items que j'avais dessinées en gris. Je les ai passées en couleur et légèrement agrandies (de 16×16 à 24×24), plus quelques retouches au passage. Ça aussi ça en jette pas mal !


J'ai essayé deux/trois éléments de maps, mais c'est nettement plus compliqué de représenter les textures (surtout le bois !) alors je les garde pour moi pour l'instant.

À vous les studios !

De très belle images, ce qui promet un magnifique jeu aussi ! On lui souhaite beaucoup de courage pour ses textures et son moteur physique.



C'est la première fois qu'aucun programme n'a été posté cette semaine... La bonne nouvelle c'est que bientôt nous nous retrouvons avec la deuxième édition du vote du Jeu du Mois !

Voie la RdP précédente : la RdP-114
Et en cadeau le lien vers le formulaire pour la RdP

Nous nous quittons sur une note joyeuse : le temps fraichit enfin ! A la semaine prochaine et profitez de vos vacances !
On termine (vraiment cette fois-ci ) par un Troll ( arrête de dire n'importe quoi : c'est un smiley ! ) d'un inconnu au bataillon qui s'amuse à redécouvrir les smiley enterrés du site :
Trololol a écrit :


Commentez cette news ! (30)
écrit par Shadow15510 le 29/07/2018 18:00 Voir toutes les news

Questions & Réponses : l'Intelligence Artificielle (IA)
Pour combler le trou du Tuto du Mercredi (TDM) que Drak nous propose un mercredi sur deux, j'essaye de vous occuper avec une question qui, jusque là, aurait pu paraître sans intérêt voire idiote : Qu'est-ce que l'intelligence artificielle ? Jusqu'où ira-t-elle ? Le Deep Learning est-il vraiment au point ? Je ne prétends pas répondre de manière parfaite à toutes ces questions que vous serez en droit de vous poser et ce pour deux raisons : le progrès et les scientifiques eux-mêmes ne sont pas capable de dire précisément jusqu'où ira-t-on et je ne suis loin d'être un expert dans ce domaine...


Intelligence Artificielle


Tout d'abord qu'appelle-t-on "intelligence artificielle" ? Eh bien c'est en soi un concept plus qu'une simple définition. Il aurait fallu que je clarifie la signification d'intelligence qui est une notion très complexe. Peut-on dire que les fourmis soient intelligentes ? Oui : elles sont organisées, elles éprouvent des sentiments... Nous éprouvons des sentiments. Nous pensons donc nous sommes, oui mais une machine ? Elle existe physiquement, elle calcule mais éprouve-t-elle des sentiments ? Sans doute pas, du moins pas encore... Les livres de Sciences Fiction du début du siècle prévoyait des robots autonomes et nous y arrivons.

L'intelligence artificielle est, selon Larousse, «l'ensemble de théories et de techniques mises en œuvre en vue de réaliser des machines capables de simuler l'intelligence». Une définition très vague car les scientifiques et les philosophes s'arrachent encore les cheveux sur la définition d'intelligence : elle est tantôt mesurée sur des épreuves de logiques mathématiques et physique tantôt sur des tests psychologiques.

Les scientifiques sont parvenus à un compromis l'intelligence est la capacité que nous avons d'analyser certaines choses et d'en tirer des actions à faire. L'intelligence artificielle est donc un algorithme capable d'analyser son environnement et selon ce qu'il voit il arrive grâce à des calculs à effectuer des actions permettant de remplacer l'Homme dans certaines taches. La machine est donc capable d'imiter l'Homme au niveau de ses facultés cognitives.

L'utilisation d'une telle technologie a toujours suscité chez l'Homme une certaines angoisse melée d'envie et de curiosité : les livres et les films de sciences-fictions en sont la preuve, mais aussi les jeux vidéos où le joueur doit détruire une armée de robots tueurs.


Le petit frère de Deep Blue qui a battu Kasparov aux échec en 1997


D'où vient cette idée de machine pensante ? Elle remonte à la moitié du XXème siècle avec Alan Turing qui est le premier à se demander si une machine créée par l'Homme peut penser. A cette époque nous nageons clairement en plein délire. Mais les capacités mémorielles des machines se sont améliorées, les microprocesseurs sont plus puissants, les techniques de programmation ont évoluées ; et aujourd'hui ce n'est plus de la fiction que de dire "les machines sont intelligentes", certes pas autant que l'Homme, mais dans certains domaines très précis comme les jeux de logiques (échecs, jeu de Go, Poker,...) certaines machines parviennent à surpasser l'Homme. Une autre personne Warren Weaver annonce publiquement en 1949 que lorsque les machines seront capables de traduire les textes, elles seront capable de penser. Lui pensait que la traduction était une tâche que seul un humain peut effectuer. Or, nous arrivons aujourd'hui à des programmes qui arrivent à des traductions qui, sans être parfaites, sont toujours de plus en plus exactes...


Alan Turing


Où en est-on vraiment au niveau de l'intelligence artificielle ? Les scientifiques ont décrété vers 1990 que l'intelligence artificielle existait et qu'elle était opérationnelle. Attention : opérationnelle ne veut pas dire parfaitement au point, cela veut dire qu'elle est capable de raisonner sur des questions simples. En 2004 L'institut Singularity annonce sur Internet "Trois lois dangereuses" qui sont en fait celles d'Asimov. Le problème éthique de l'intelligence artificielle commence alors : jusqu'où peut-on décemment «donner» de l'intelligence au robots ? Des scientifiques Coréens ont fixés en 2007 une charte sur l'éthique à respecter vis à vis des utilisateurs et des fabricants de robots.


Issac Asimov


Les politiques ont une autre peur vis à vis de l'intelligence artificielle : si des chartes internationales condamnent les recherches trop poussées dans ce domaine, que faut-il faire ? Arrêter les recherches alors que d'autres pays les continuent sera synonyme d'un retard industriel pour le pays en question. En revanche, continuer les recherches et se faire prendre est-il une solution plus désirable ?

Les scientifiques et les philosophes pensent que l'explosion des capacités de l'intelligence artificielle conduirait à la singularité technologique, c'est à dire à l'hypothèse que l'apparition et le développement d'une telle intelligence produise chez l'Homme des changement irréversibles et incontrôlables... Aujourd'hui l'intelligence artificielle se décline en deux «types» : l'intelligence artificielle forte et faible.

L'intelligence artificielle forte doit raisonner comme l'Homme et correspond à un modèle de machine ayant une conscience de soi en tant qu'être pensant ce qui pose pas mal de problèmes : faut-il payer les robots ? Faut-il leurs donnés des congés payés ? Les mariages humains-robots ou robots-robots sont-ils envisageables ? Devrions-nous rédiger une «Déclaration Universelle des Droits des Robots» ? Ridicule peut-être, mais nous y arrivons... En bref l'intelligence artificielle forte est un modèle d'intelligence calquée sur l'Homme, donc capable d'émettre des opinions et des sentiments. Cette vision de la robotique est très polémique et suscite interêt et effroi. Ce projet est techniquement possible : les processeurs sont assez puissants pour permettre d'analyser les données aussi bien que le cerveau humain. Le problème est le logiciel... «En effet, l'important n'est pas de raisonner plus vite, en traitant plus de données, ou en mémorisant plus de choses que le cerveau humain, l'important est de traiter les informations de manière appropriée».

A l'inverse, l'intelligence artificielle dite «faible» correspond plutôt à un modèle pragmatiste : il s'agit de donner au robot de plus en plus d'autonomie de manière à réduire les coût de maintenance. Ce type d'intelligence est déjà très répandu dans l'industrie. Il s'agit donc plus d'une évolution que d'une révolution, puisque ce type d'IA s'inscrit dans la lignée des recherches précédentes menées depuis les années 60. Ce type d'intelligence n'est pas vraiment intelligente : il s'agit d'un gain d'autonomie ou de boucles conditionnelles placé astucieusement et simulant l'intelligence. Par exemple dans un jeu de rôle, si le joueur à telles coordonnées, alors avancer deux villageois aux coordonnées suivantes. Cette action encercle le joueur sans que "l'IA" ait fait quoi que ce soit "d'intelligent" : elle a avancé deux villageois à des coordonnées données parce que le joueur avait telles coordonnées et pas parce qu'elle sait que cette action allait encercler le joueur.

On parle de plus en plus souvent de Deep Learning, qu'est ce c'est ? Le Deep Learning, ou Apprentissage Profond (je l'appellerai ainsi), correspond à un concept apparu en 2010. Plusieurs facteurs, dont la puissance des machines, les algorithmes discriminants capable de trier les données, et les réseaux de neurones artificiels, ont permis l'émergence de ce type d'algorithme.


Réseaux neuronaux (vue d'artiste)


L'apprentissage Profond évolue en fonction des expériences de la même manière qu'un enfant. Imaginons un enfant qui pense que le niveau de l'eau dans le verre dépend uniquement de la quantité d'eau dans ce verre, puis il va comprendre que ce niveau dépend également du diamètre du verre,...etc Les algorithmes d'Apprentissage Profond agissent de la même manière : ils «testent» et retiennent pour avoir un comportement de plus en plus adapté à leurs environnent. AlphaGo est un algorithme d'Apprentissage profond.

Il y plusieurs type d'application comme reconnaître les émotions sur un visage, reconnaitre un visage, correction automatique, la machine est capable de produire des œuvres musicales, ou de reproduire une œuvre existante à partir d'image.

Ce que l'on appelle "Machine Learning" est, en fait, un apprentissage de la machine basé sur les études statistiques et les probabilités. Ce type de machine n'est donc pas réellement intelligente : elle calcule des statistiques et ses actions se font en fonction des résultats obtenus.


Le Deep Learning ou l'évolution du robot


A quoi sert l'intelligence artificielle ? L'intelligence artificielle à beaucoup de domaine d'application : du jeu vidéo à la gestion d'entreprise en passant par... l'art !! Eh oui les artistes aussi ont opté pour cette forme d'art "en mouvement"... Non parlons ici des application de l'intelligence artificielle faible.
Je vais passer rapidement sur la gestion de fond et des banques. Je citerai Sidetrade, une entreprise où un robot gère seul la totalité des fonds de l'entreprise.
L'armée se sert également des IA avec les drones ou des robots d'assistances à la décision au niveau stratégique. On retrouve des projets d'automatisation de l'armement aux Etats-Unis, qui ont investit 18 milliards de dollars sur ce genre de recherches. Le projet Maven en fait partit.
La médecine s'en sert pour l'aide au diagnostic. Les IA sont utilisées de plus en plus en Droit pour prédire les décisions de la Justice. Je précise rapidement que les intelligences artificielles sont également présentent dans les grandes plateformes logistiques.

Je vais approfondir un peu plus la partie suivante puisqu'il s'agit du jeu vidéo. Le premier jeu créé avec une intelligence artificielle est le jeu d'échec. Puis d'autres jeux ont commencé à apparaître avec des IA. Cette automatisation permet de rendre le jeu plus "vivant" car les personnages non jouables ont des comportements qui changent en fonctions de l'attitude du joueur. Cette partie du jeu a été laissée en retrait par rapport aux recherches qui ont été effectuées au niveau de la recherches graphique. Aujourd'hui les développeurs commencent à inclure des IA performantes dans les jeux ce qui ce traduit par l'apparition de personnages non jouables au comportement a priori intelligent. Il faut donc s'attendre à voir de plus en plus apparaitre des personnes dans les villages avec lesquelles nous pouvons interagir. Les jeux en ligne comme "League of Legend" ou n'importe quel autre jeu de type "MOBA" fonctionnent avec des IA : il y a l'équipe humaine et l'autre équipe qui est gérée informatiquement. Alexot nous a donné le lien du site OpenAI Five qui travaille sur les IA qui sont dans Dota2. Récemment une IA a battu un joueur professionnel en "1 contre1". Et l'entreprise travaille actuellement sur un projet de "5 contre 5".

L'art maintenant... L'intelligence artificielle trouve un écho dans l'art moderne. Au départ, ce sont les Français les premiers à expérimenter cette nouvelle forme d'art. Depuis des artistes américains (Karl Sims), français (Michel Bret, Marie-Hélène Tramus), et bien d'autres encore ce sont pris d'amitié pour ce nouvel art et l'emploient de plus en plus. Ces techniques artistiques sont appréciées pour leurs caractères dynamiques et autonomes. L'art avec l'intelligence artificielle a été appelée "Living Art" par les artistes. Récemment une exposition sur ce type d'art a eue lieux dans le Grand-Palais où plusieurs artistes ont exposés leurs œuvres :


Artistes & Robots


Qu'est-ce que l'Overfitting ? Encore un terme Anglais que j'appellerai ici sous une appellation française (puisqu'elle existe) : le Sur-apprentissage. Peut-être que cela vous parle, peut-être pas, ce n'est pas grave. Le Sur-apprentissage correspond à une surcharge de la base de données. En d'autres termes, le Sur-apprentissage est une des conséquences de l'Apprentissage Profond : la machine teste,et retient énormément de données de manière a avoir un comportement adapté à son environnement (je sais que vous le savez mais vous vous devez l'intégrer). Or, au fil de ses expériences il va emmagasiner des informations contradictoires qui vont perturber ses algorithmes discriminants. Reprenons notre enfant, il a un papa qui lui dit de ne pas dire de gros mots, mais le père dit des gros mots. L'enfant va hésiter, mais ce n'est pas grave le cerveaux est assez puissant pour passer outre cette hésitation, mais ce n'est pas le cas du robot...

Pour faire simple le robot aura trop de données contradictoires en mémoire et ne pourra plus déterminer quelles actions seront à faire ou non.
Par exemple : le robot effectue un test T il obtient une réponse A qu'il mémorise, puis il refait le test T dans les mêmes conditions mais obtient cette fois ci une réponse B qui est l'opposé de A.
Le robot une fois confronté au problème T ne sera pas en mesure de choisir entre A et B.



Si cet article vous a plût : merci de laisser des idées de thèmes sur lesquels vous aimeriez en savoir plus : j'essayerai de faire un autre "Questions & Réponses" sur ce sujet.



Sources : wikipédia, des rapports du CNIL, Larousse,un article de Yoshua Bengio pour l'université de Montreal, un article de Alan Turing, Le Monde, et Sciences & Avenir
NB : toutes ses images sont certifiées comme appartenant au domaine public sous le couvert d'une utilisation non commerciale
[/i]


Commentez cette news ! (7)
écrit par Shadow15510 le 25/07/2018 12:00 Voir toutes les news

La Revue des Projets - 114
Bonsoir tous le monde !
Ce soir mesdames et messieurs une RdP modeste mais intense ! Avec Drak qui nous fait rêver avec son jeu de rôle et Ninestars qui nous entretient des avancées de son moteur graphique.


Nous commençons dès à présent par un petit rappel des épisodes précédents en ce qui concerne le projet de Drak. Ce dernier à découpé le travail en 7 phases.
La première consistait à écrire le jeu : mettre les idées, le scénario, le moteur de combats, etc sur le papier.
Ensuite il faut organiser toutes ces idées : quel programmes fera quoi, dans quel ordre, et comment les programmes pourront "s'emboiter" tout en évitant la phobie du programmeur qui aime les sous-programmes : la Branch Error !
Une fois que l'on a passé ces deux phases d'échauffement on passe à un truc un peu plus sérieux : la phase n°3 soit l'écriture du code... Et c'est là qu'est Drak : dans ce pays immonde et désolé rempli de steppes arides et inhospitalières où il faut éviter les marais et leurs émanations toxiques j'ai nommé l'infect Basic Casio !
Bon... finit les bêtises : on vient de me dire que Drak est encore en vie et qu'il nous a envoyé un pigeon voyageur :
Drak a écrit :
Hey hey hey !

Je vous tiens au courant des avancées de mon projet de RPG, dont vous avez sans doute déjà entendu parler.... J'imagine ? Très bien, je vais aller droit au but ; je suis en ce moment même en train de refaire tout le moteur de dialogue. Celui que j'avais était rigide, et implémenter de nouvelles fonctionnalités à l'intérieur revenait à faire du... spaghetti code ? Bref, ça a commencé à puer quand j'ai voulu rajouter des questions oui/non. Du coup, j'ai tout recommencé à ce niveau. J'ai mis au point un nouveau moteur, sans doute un peu plus léger que le précédent, plus souple, et surtout ; qui n'a plus besoin que j'indique les sauts de lignes à chaque fois par des caractères spéciaux. Il gère tout tout seul. Il beugue encore à certains endroits, mais ça n'est jamais qu'une affaire d'indice à gérer. Pour vous mettre l'eau à la bouche, je vais vous mettre deux screens : un "avant" et un "après", avec quelques nouveaux ajouts graphiques qui s'invitent à la fête.

Avant...

Après !


Si vous aimez ce projet, n'oubliez pas que toute réaction est la bienvenue !

Ce nouveau moteur de dialogue, que je trouve particulièrement beau, est en plus très pratique : on peut afficher des textes bien plus long !
On le soutient de tout notre cœur dans cette épreuve difficile. On espère que tu atteindras la phase n°4 que vous découvrirez sans doute dans très peu de temps. En attendant notre pigeon voyageur et toujours là et si vous voulez soutenir Drak n'hésitez pas à lui envoyer un pigeon via le pigeonnier dont je viens de vous donner l'adresse.


On retrouve une veille connaissance : Ninestars et son projet Windmill. Ninestars est occupé et n'a put faire un article je m'en donc chargerais pour lui. Dernièrement le moteur graphique en 3 dimensions avait pris un bon coup de boost avec la résolution de plusieurs problèmes importants dont des textures et des blocs qui s'effacent en bordure d'écran.
Mais vous connaissez tous la programmation : résoudre une erreur en provoque dix... Nous l'avions quitté sur une erreur cocasse : la fonction clipping() doit être effectuer avant affichage() qui elle même doit être exécutée avant clipping()... Ce bug provoquait des effacements partiel de l'écran : des triangles disparaissaient.
Ninestars a écrit :

Jour 16

Désolé si tu penses que j'ai enfin lancé LA démo ultime que j'ai vendu au jour 15.
Aujourd'hui c'est résolution de bugs.
J'ai résolu le problème du serpent qui se mort la queue en créant une fonction dédié plus rapide. Le problème était de savoir quelle face du triangle afficher, pour rentrer les dimensions de la textures dans les points.

Le problème que j'ai maintenant est une erreur d'overflow, lorsque la surface du triangle à afficher est trop importante, les nombres prennent des valeurs qui dépassent les limites d'un int (+- 2 milliards) et provoquent des bugs terribles sur l'affichage des textures.



J'ai bien ciblé le problème, je sais exactement quand, comment et pourquoi il se produit, je ne sais juste pas comment le résoudre simplement.
Après 3 soirées gachées à essayer de bricoler un truc, j'ai décidé de faire une autre fonction de clipping.
Cette fois l'objectif n'est pas découpé en plusieurs triangles ceux qui passent derrière la caméra (comme au jour 14), mais découpé pour n'avoir que les pixels qui sont à l'écran.
Le petit triangle s'affiche sans problème, le grand à une aire qui overflow et bug visuellement



Je vous rappelle que le topic dédié est ici et que vous pouvez utiliser Windmill dès maintenant : la dernière mise à jour date du dixième jour, on espère qu'une autre sortira bientôt.

Nous nous quittons sur la rubrique étrennée il y a déjà deux semaines : la listes des programmes...

Cette semaine, 1 programme a été posté


Météo de Shadow15510 pour les Graph 35+/75/85/95 (SD). Cet utilitaire vous demande quelques données et vous donne une estimation de la météo à venir...

On se retrouve dans une semaine en attendant vive les vacances et le beau temps !

Voir la RdP précédente : la RdP-113

Commentez cette news ! (15)
écrit par Shadow15510 le 22/07/2018 18:00 Voir toutes les news

TDM n°3 : Utiliser les chaînes de caractères !
Le Tuto Du Mercredi [TDM] est une idée qui fut proposée par Ne0tux. Voici le principe : un mercredi sur deux, nous postons un petit tutoriel sur l'Utilisation de la calculatrice, le Transfert, la Programmation, ou encore la Conception de jeu. Je vous en présente la troisième édition.

Apprendre à se servir des chaînes de caractères (Str) ! (Débutant)

Niveau : ★ ★ ☆ ☆ ☆


Une chaîne de caractère, c'est comme une phrase. Lorsque vous écrivez, vous assemblez des lettres et des signes de ponctuations, des chiffres parfois ou encore d'autres caractères spéciaux. Alors qu'une variable comme A ou θ contient une valeur numérique, les Str – chaînes de caractères, ou string en anglais – contiennent des suites de lettres et de chiffres, des mots, des phrases, etc. Elle sont bien trop peu utilisées dans la plupart des programmes du site, surtout chez les programmes débutants ou les programmes de cours, alors qu'elles peuvent se révéler extrêmement efficaces.

Partie I : Qu'est-ce qu'une Str ?

NB : Ce TDM se veut complémentaire à un cours déjà existant sur l'utilisation des Chaînes de caractères par Totoyo. N'hésitez pas à le consulter également si vous ignoriez jusqu'à présent l'existence des Str.

Comme indiqué dans l'introduction, une chaîne de caractères (Str) contient... des caractères. Des caractères peuvent être des lettres en bas de casse ou capitale, des chiffres, des signes de ponctuations, des espaces, des lettres grecques, des signes mathématiques, et tout autre caractère spécial. Tout ce que vous seriez susceptible d'écrire avec votre clavier, en somme.

Attention toutefois, une Str N'EST PAS une valeur numérique. Toute tentative de calcul entre une Str et une valeur numérique provoquerait une erreur. Il existe cependant des techniques qui permettent de passer d'une Str à une valeur numérique et vice-versa.

Les chaînes de caractère peuvent avoir de nombreuses utilités. Elles peuvent être utilisées pour les programmes de cours, pour les dialogues dans un jeu, pour contenir le nom du joueur ou d'autres informations, et peut avoir des utilisations qui vont même bien au-delà de ce que vous pourriez imaginer : hardcoder des maps pour un jeu, stocker des données sur des monstres ou des attaques dans le code, ou même contenir des caractères qui décrivent des valeurs numériques... Avec un peu d'imagination, tout est possible !

Retenez bien que le premier caractère d'une chaîne est indexé à 1, et non pas à 0. Retenez également qu'une Str ne peut pas contenir plus de 255 caractères. Sachez également qu'un caractère prend 1 voire 2 octets, alors qu'une variable dans une liste en prend 12, voire 24. Employer les Str peut s'avérer très utile à cet endroit-là aussi.


Partie II : Initialiser les Str

Sachez qu'il existe de nombreuses fonctions qui permettent de manipuler les Str. La première chose à savoir faire est d'initialiser une Str comme il se doit. Voici différentes méthodes :
"Bonjour Mister 2 !" → Str 1
Str 2 → Str 1
? → Str 1 //Ce que rentre l'utilisateur va dans Str 1. Utile pour demander le nom du joueur par exemple.

Il existe des cas plus particuliers :
List 1[0] → Str 1
Exp►Str(Y1,Str 1)
La première ligne fonctionne dans les deux sens. Référez-vous au TDM précédent. La deuxième ligne est assez particulière et fait appel à une technique expliquée dans ce tutoriel. Vous n'aurez probablement pas à vous en servir.

Attention toutefois. Les techniques suivantes ne fonctionnent pas :
A → Str 1 //A est une valeur numérique, pas une Str.
"Hello world!"
Str Ans → Str 1 // Str Ans n'existe pas.
BONJOUR → Str 1 //BONJOUR n'a pas de guillemets : il sera considéré comme le produit des variables B, O, N, J, O, U et R. Donc, une valeur numérique.
Hello world!" → Str 1 //Bien sûr, erreur syntaxe s'il manque un guillemet.
Str 2 + A + ", je te love !" → Str 1 //Même délire : A est une valeur numérique.
StrJoin( Str 2, A) → Str 1 //Même problème qu'au dessus.
//Etc.

"Je suis :" → Str 1 //Ne dysfonctionne pas forcément mais peut provoquer des erreurs inattendues : l'interpréteur basic peut considérer le double-point comme un saut de ligne. Soyez vigilants en débugant votre programme si vous faites cela.


Partie III : Manipuler les fonctions pour les Str

Comparer deux Str : StrCmp(
StrCmp( compare chaque caractères des deux chaînes à la suite en partant, bien sûr, du premier caractère à gauche, jusqu'à ce que les deux caractères comparés soient différents. Pour les chiffres et les lettres, voici un ordre croissant pour StrCmp :
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

//Voici d'autres cas :
StrCmp("CAKE", "CAKEISALIE") //"CAKE" < "CAKEI". Renvoie -1
StrCmp("5", "5-") // "5" < "5-", donc renvoie -1.

Inverser une Str : StrInv(
Cette fonction inverse simplement l'ordre des caractères de la chaîne. Peut s'avérer amusant.
StrInv("Bonjour !") → Str 1
// Str 1 contient "! ruojnoB".

Concaténer (assembler) deux Str : StrJoin(
StrJoin( sert à fusionner deux chaînes de caractères. Toutefois, elle ne peut pas fusionner plus de deux Str en même temps : cette fonction ne prend que deux paramètres.
"BALDI" → Str 1
StrJoin("Bonjour, ", Str 1) → Str 1
//Str 1 contient "Bonjour, BALDI"
/!\ Cette technique n'est pas celle que je recommande pour concaténer deux chaînes. Voir la suite.

Concaténer plusieurs Str à la fois : +
Cette technique est vivement recommandée pour concaténer plusieurs Str. Par rapport à Strjoin(, elle est plus courte et permet d'assembler plus de deux chaînes d'une seule traite.
"Darks" → Str 2
"666" → Str 1
Str 1 + " est le code secret, " + Str 2 + " !" → Str 3
// Str 3 contient "666 est le code secret, Darks !"

Extraire une partie de la chaîne : StrMid( (ou StrLeft( et StrRight( )
La fonction StrMid( – et, dans une moindre mesure, StrLeft( et StrRight( – est extrêmement utile. Je ne cesse de m'en servir. Elle permet d'extraire une partie d'une chaîne à partir d'un indice. Elle peut aussi prendre un troisième paramètre : la longueur de la chaîne à prendre. Si ce paramètre n'est pas préciser, StrMid( extrait tout le reste de la Str à partir de l'indice indiqué.
StrMid( Str 1, 4, 8) //extrait les 8 caractères de la Str 1 à partir du 4ème caractère compris.


Obtenir la longueur précise d'une Str : StrLen(
StrLen( renvoie la longueur de la chaîne de caractère indiquée. Attention toutefois, une Str ne peut pas dépasser 255 caractères !
StrLen( "TROLOLOL") // Renvoie la valeur numérique 8.

Modifier la casse des lettres d'une Str : StrLwr( (Minuscules) et StrUpr( (Majuscules)
StrLwr( et StrUpr( mettent respectivement les lettres d'une Str en minuscule et en majuscule. Ils ne prennent comme paramètre que la Str que vous voulez modifier.
StrLwr("Drak A ECRIT CE TUTO !")
// Renvoie "drak a ecrit ce tuto !"
StrUpr("Je n'aime PAS le chiffre 7."
// Renvoie "JE N'AIME PAS LE CHIFFRE 7."

Rogner une Str par la droite ou la gauche : StrShift(
StrShift( prend deux paramètres : la Str à manipuler et le nombre de caractères à rogner. Ce nombre peut être positif ou négatif. Les caractères qui disparaissent sont remplacés par des espaces.

Rechercher un caractère ou une chaine de caractères dans une Str : StrSrc(
Extrêmement utile, à connaître. StrSrc( renvoie la position (valeur numérique) de la première occurrence indiquée trouvée. Pour faire une analogie, c'est comme si vous faisiez Ctrl + F sur votre navigateur internet. Bien sûr, StrSrc( respecte la casse. Peut prendre un troisième paramètre qui indique l'indice à partir duquel chercher. Attention : SrtSrc( s'arrête à la première occurrence trouvée. Quand rien n'est trouvé, renvoie 0.
"ATTENTION ! ZONE DANGEREUSE !" → Str 1
StrSrc(Str 1, "!") //Renvoie la valeur 11.
StrSrc(Str 1, "!", 12) //Commence la recherche à partir du 12ème caractère. Renvoie la valeur 29.
StrSrc(Str 1, "TENTION !") //Renvoie la position de "T" : 3.
StrSrc(Str 1, "x") //Renvoie 0 : Il n'y a pas de "x".
StrSrc(Str 1, "TENTION !", 9) //Renvoie aussi 0.
StrSrc(Str 1, "TABLE") //Renvoie également 0.
StrSrc(Str 1, "TANTION !") //Idem

Changer une Str en valeur numérique : Exp(
Exp( convertit la chaîne de caractère en une expression mathématique. Si la chaîne contient des lettres, elles sont considérées comme des variables alphanumériques. Si des lettres ne peuvent être converties en variables alphanumériques (minuscules, lettres spéciales, etc.), ou si des caractères ne peuvent être utilisés pour un calcul (espaces, etc.), provoque une erreur syntaxe.
Exp("32") //Renvoie la valeur numérique 32.
Exp("32A") //Renvoie le résultat de 32 * A.
Exp("32 * A") //Erreur syntaxe à cause des espaces.
Exp("BONJOUR") //Renvoie le produit des variables B, O, N, etc.
Exp("Bonjour !") //Erreur syntaxe.
Exp("5i+A*ln (12)-2") //Fonctionne, si "ln " a été entré avec la touche "ln" de la calculatrice.

Faire se déplacer du texte dans une Str : StrRotate(
StrRotate( décale de N les caractères d'une Str. N peut être positif ou négatif, et peut dépasser la longueur de la Str. Elle permet, entre autres, de simuler un défilement de texte.
StrRotate("Achetez les frites de FRITEMAX !  ", 3)
//Renvoie "etez les frites de FRITEMAX !  Ach"
StrRotate("Achetez les frites de FRITEMAX !  ", -5)
//Renvoie "X !  Achetez les frites de FRITEMA"


Partie IV : Application
Il y a de nombreuses manières d'exploiter les fonctions des Str ! En voici quelques unes, assez simples, qui pourront se révéler surement très utiles pour vos programmes, petits ou gros ! N'hésitez pas à poser des questions si besoin !

Enregistrer un nom de joueur.
Que ce soit pour nommer un personnage ou pour enregistrer un nom pour un score de jeu, il est souvent pratique d'être en mesure d'avoir le nom du joueur (ou un pseudonyme choisi par ce dernier). Nous pouvons très simplement récupérer son nom, et même faire en sorte qu'il commence par une majuscule et que le reste soit en minuscule !
"Votre nom"?→Str 1 //Str 1 contient donc le nom.
StrUpr(StrLeft(Str 1, 1)) + StrLwr(StrMid(Str 1, 2))→Str 1
//Dans cette deuxième ligne, on met la première lettre en majuscule et les suivantes en minuscule.

Faire une fonction qui affiche un message en combat.
Plutôt que de réécrire 100 fois un truc affreux comme "Text, 1,1,"Je suis..." : Text 9,1,"Très fort !", etc.", servez-vous des Str ! Dans un moteur de combat, par exemple, vous aurez surement besoin d'afficher des messages à chaque attaque. Mettons que j'enregistre le message à afficher dans Str 2 et que le nom du joueur soit dans Str 1. Cette fonction sera contenue dans un sous-programme.
PROG "COMBAT" :
//Début de tour :
Str 1 + " se prépare à agir !" → Str 2
Prog "TEXT"
[...]
//Au moment de l'attaque, dont le nom est dans Str 3 :
Str 1 + " lance " + Str 3 + " ! " → Str 2
Prog "TEXT"
[...]
//En fin de tour, par exemple :
Str 1 + " a terrassé l'ennemi ! Wheeee!" → Str 2
Prog "TEXT"
//Etc.

_________________________
PROG "TEXT" :
Cls
Text 1,1,Str 2
Do
GetKey
LpWhile Ans ≠ 77
//Affiche le texte et se met en "pause" tant que le joueur n'appuie pas sur [ALPHA]

Faire afficher sur une ligne un texte trop long.
En mode graphique, les lettres prennent, en moyenne, 4 px de large. L'écran de la calculatrice fait 128 px. 128 / 4 = 32. On peut donc considérer qu'à partir de 32 caractères, le texte à afficher dépassera vraisemblablement du cadre. On a le choix entre faire en sorte à ce que le texte ne dépasse jamais 32 caractères, l'afficher sur une deuxième ligne ou bien l'afficher sur une unique ligne en le faisant défiler. Voici comment faire pour cette dernière méthode :
"Je suis la phrase à afficher et j'ai beaucoup trop de lettres. Oh mon dieu ! Achetez les frites de chez FRITEMAX !" → Str 1
Text 1,1,Str 1
Do
If StrLen(Str 1) > 31 // Si la phrase est trop longue...
Then For 1 → A To StrLen(Str 1) Step 2
Text 1,1,StrRotate(Str 1, A) //On la fait défiler dans une boucle
GetKey⇒Break // On sort dès que le joueur presse une touche
Next
IfEnd
GetKey
LpWhile Not Ans //On arrête à l'appui d'une touche.

Hardcoder des données sur des personnages.
Mettons que vous ayez des données par défaut à attribuer à des personnages. Par exemple, une valeur qui correspond à sa force, une autre à sa sagesse et une autre à la robustesse de sa barbe (lol ?), et que vous voulez les attribuer à une liste lorsque le joueur choisit tel ou tel personnage. Si de telles données sont comprises entre 0 et 9, alors vous pouvez tout à fait avoir quelque chose de très propre comme ceci :
//J est l'ID du personnage.
J = 1 ⇒"645Jasper" →Str 4
J = 2 ⇒"428Pavel" →Str 4
J = 3 ⇒"908Brutus" →Str 4
J = 4 ⇒"373Gael" →Str 4
[...]
For 1→A To 3
Exp( StrMid( Str 4, A, 1)) → List 1[A] //On récupère les carac
Next
StrLeft( Str 4, 4)→Str 1//On récupère le nom.

Sélectionner un Sprite pour votre héros en Locate.
Lorsque vous faites un jeu en Locate avec un personnage qui s'y déplace, vous l'affichez surement en faisant :
Locate A, B, "θ"
Sachez que "θ" est aussi une chaîne de caractère. Alors pourquoi ne pas enregistrer ce caractère dans un Str, changeable à volonté ?
ClrText
"==================== Choisissez le heros"
0→D //Le compteur
"αβδσθ" → Str 1 //Les skins disponibles
While 1
StrLeft( StrRotate( Str 1, D), 1) → Str 2
Locate 10,4,Str 2
Do
GetKey
LpWhile Not Ans
Ans = 77 ⇒ Break //Le joueur valide
Ans = 27 ⇒ Isz D
'a //Ce commentaire évite le saut de ligne de Isz D si D = 0.
Ans = 38 ⇒ Dsz D
'a
WhileEnd
Str 2 → Str 1 //Str 1 contient le sprite choisi.


Et voila ! Maintenant, vous n'avez plus d'excuse. UTILISEZ LES STR ! Si ce tuto vous a plu et que vous souhaiteriez voir des techniques plus avancées sur l'utilisation des Str, alors manifestez-vous dans les commentaires !


Liens utiles :
Voir le TDM précédent : Manipulez les Listes !
Tuto pour avoir 40 Str supplémentaires
Cours officiel de Planète Casio sur les Str.
Var2Str, un utilitaire de Totoyo pour convertir une variable en Str.


Commentez cette news ! (20)
écrit par Drak le 18/07/2018 18:00 Voir toutes les news

La Revue des Projets – 113
Ah, les vacances. Certains écartent leurs doigts de pieds sur la plage, au soleil, paille à la bouche. D'autres respirent le grand air de la montagne et font travailler leurs mollets en randonnée. D'autre encore retrouvent leurs grand-parents adorés pour cueillir les fruits du jardin et préparer la confiture. Oui, c'est les vacances, cette belle et douce période qui fond de tendresse comme une cuillerée de miel chaud.

Très bien. Il est donc l'heure de la cent-treizième édition de la Revue des Projets ! Voyez-vous, tout le monde n'a pas la chance de partir au loin avec sa famille ou ses amis. Il y en a qui restent chez eux, en toute simplicité, et qui continuent de travailler – un bien grand mot, je vous l'accorde.

Sans transition, commençons à regarder dans la boîte magique ! J'y plonge la patte et... Surprise ! Mais que voila donc ? Il s'agit d'Odyssée, ce projet collectif entamé il y a là près de deux semaines par plusieurs membres de la communauté. Shadow15510 prend la parole pour tous les participants et nous mettre l'eau à la bouche ! Si vous ne connaissez pas Odyssée, alors peut-être pourriez-vous regarder un peu dans le topic dédié ? En tous les cas, je vois quelques belles images !

Drak, Math680, Redeyes, Lightmare, Ti64CLi et Shadow15510 a écrit :
Bonjour à tous !
Un petit article pour vous dire que notre projet de jeu collectif se concrétise... On va vous mettre une petite galerie d'image tirées du jeu Je pense que le moment est venu de vous en dire un peu plus sur le scénario... Mais attention, hein, juste un peu !

Alors voyons voir :
Vous habitez dans un village perdu au sud d'un pays ravagé par la dictature... Votre père est mort et vous laisse un testament qui sera lu dans la ville de son décès à 200 km au nord de votre position. Vous trouvez cela un peu futuriste comme cadre ? Détrompez-vous : tous les noms de villes sont des noms latins, et le jeu se passe dans un cadre antique... Le village s'appelle Secreta, la ville que vous devez rejoindre est Eporie et c'est également la capitale d'un pays nommé Lugubriss dans lequel vous évoluez...

La mort de votre père révèle des choses qui auraient dû rester cachées ! Vous seul êtes en mesure de sauver votre peau (et celle du pays) tout en restant discret... car vous êtes surveillés de très très près.






J'en profite pour remercier Drak qui est à l'origine du bois de Nemuroris et des effets autour des pictogrammes

Wow. Je tiens à préciser auprès de nos lecteur·trice·s que le scénario a été écrit par Shadow, et qu'il a longuement travaillé dessus ! Je dois dire que je suis particulièrement séduit par les noms de ville et celui du pays. Je crois que ça me motive même à donner un autre coup de patte pour les graphismes de ce jeu ! Par ailleurs, ce projet de jeu devrait aussi être porté sur la Graph 90+E, alors... Quand verrons-nous la version couleur de ces images ? J'ai hâte !

Replongeons notre main dans la boîte magique... Hmmm ? Sommes-nous à court d'articles ? Ha ! Je refuse de me laisser faire ! J'ai récemment eu vent d'un petit (grand ?) projet naissant, porté par Massena, à la fois fier et frustré d'être arrivé à la deuxième place du jeu du mois... à 1 point de moins que le gagnant ! Je souhaitais vous en parler un peu, chers lecteur·trice·s , pour que cette RDP ne soit pas trop modeste d'une part, et parce qu'un projet de ce type mérite votre attention d'autre part. Mais, attention ! Je ne ferai pas cela tout le temps !

C'est un projet qui se nomme Evocalc ! Il s'agit d'un jeu qui sera, en quelques sortes, une adaptation d'Evoland, un jeu vidéo qui parle de ... l'évolution du jeu vidéo ! Je vous montre le trailer du jeu, vous allez comprendre.


Voici. Ce projet semble assez complexe, et Massena souhaite bénéficier d'un peu d'aide pour réaliser ce jeu et trouver des idées. Rendez-vous sur le topic dédié pour en apprendre davantage !

Eh bien, chers lecteur·trice·s, il ne me reste plus qu'à sonner la fin de cette RDP ! Je vous remercie d'avoir pris le temps de nous lire, et vous souhaite à tou·te·s une agréable journée ! Et, comme toujours... Stay tuned!

Cette semaine, 1 programme a été posté.

KhiCAS, de Bernard Parisse, pour la Casio Graph 90+E. Il s'agit du portage de Xcas en Add-in pour Casio Graph 90+E. Il est enfin disponible !

Voir la RDP précédente : RDP – 112.


Commentez cette news ! (14)
écrit par Drak le 15/07/2018 18:00 Voir toutes les news

Résultat du Jeu du Mois de Juin 2018
Bonsoir à vous !
Comme promis, ce soir, le compte rendu des élections du Jeu du Mois de Juin 2018. Je rappel que 8 programmes au total ont été proposés.


Mesdames et messieurs ouvrez grand vos oreilles,... euh, non vos yeux ! Le gagnant de cette toute première ré-édition aura le droit de mettre la coupe emblématique dans la description de son programme... Mais aussi de bénéficier d'une mise en avant d'un mois en page d'accueil.


Nous avons Flower de arcree et Tuile & co de Shadow15510 avec 1 point. Un grand bravo à vous deux pour vos jeux ! Merci infiniment de votre participation. Et, qui sait ? peut-être avez vous un projet de jeu que nous aurons le plaisir de voir sur le podium le mois prochain?
On continue avec Parc Safari de spongitude avec 2 points. Merci de ta participation !
Les deux prochains se suivent de très très près : il s'agit de Sword Burst Zero ProtoZ de Redeyes avec 5 points, puis de KanColle AirStrike avec ses 6 points ! Bravo à Oradimi.

Nous arrivons au bas du podium, en troisième place avec Plague.inc encore un jeu de Shadow15510 qui avec 7 points. Merci de ta participation et de la qualité de ton jeu.

En deuxième place avec un programme de massena : Aviator qui a 11 points ! Vous avez bien lu : 11 points ! On se rapproche du haut avec ce jeu qui en a fait rêver plus d'un. Bravo pour ce jeu, et peut-être à une prochaine fois pour la première place...

Ahhh ! Le gagnant de cette première ré-édition est... Comment ça tu as perdu le lien... Mais... Je leurs dis quoi moi maintenant ? Hein ? Bon... Euh... Ah oui ! Le gagnant est Alexot avec 12 points ! Le score était serré mais Neural Bird l'emporte ! On l'applaudit ! Bravo pour ce très beau programme qui explose les scores ! Nous espérons te revoir très bientôt dans le vote du Jeu du Mois !
Neural Bird


Merci à tous ceux qui ont votés, et sans qui ce vote serait tombé à l'eau... Merci beaucoup à tous les programmeurs pour leurs jeux !
On se retrouve dans un mois pour l'élection du Jeu du Mois de Juillet 2018 ! On l'espère plein de bonnes surprises et de jeux.
En attendant je vous souhaite un bel été !
Voici le classement récapitulatif :
Première place : Neural Bird d'Alexot
Seconde place: Aviator de massena
Troisième place : Plague.inc de shadow15510
Hors podium :
- KanColle AS d'Oradimi
- Sword Burst Zero de Redeyes
et enfin, ex æquo en dernier :
- Flower d'acree et Tuile & co de Shadow15510

Commentez cette news ! (24)
écrit par Shadow15510 le 08/07/2018 20:00 Voir toutes les news

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 28 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd