Planète Casio - Tout le forum - Flux RSS http://www.planet-casio.com Programmes Casio, Jeux, Cours pour Calculatrices Casio fr-FR https://www.planet-casio.com/images/logo.gif Planète Casio - Tout le forum - Flux RSS http://www.planet-casio.com 55 50 Programmes Casio, Jeux, Cours pour Calculatrices Casio. Tue, 24 May 2022 03:39:53 GMT Tue, 24 May 2022 03:39:53 GMT contact@planet-casio.com (Planet Casio) contact@planet-casio.com (Planet Casio) 5 Est-il possible télécharger des programmes à une calculette GIII? https://www.planet-casio.com/Fr/forums/topic17081--.html Mon ami a une calculette GIII et il veux mes programmes. Comment les télécharger à sa calculette? Thu, 19 May 2022 18:57:34 +0200 Je n'arrive pas a suprimer un programme https://www.planet-casio.com/Fr/forums/topic17080--.html Bonjour tt le monde j'ai mis un programme : Mindmap2- sur planete casio et je e suis trompé lors de la création du programme car j'ai mis Graphs 75/85/95 (SD) a la place de Graphs 35 à 100 et je ne peux pas le changer dans: modifier un programme :sry: je voulais donc essayer de le suprimer mais je ne le vois pas non plus :sry: j'espere que vous allez m'aider merci d'avance :sry: :sry: :sry: Tue, 17 May 2022 17:18:28 +0200 Press Shift #8 – Ipod FallBlocs https://www.planet-casio.com/Fr/forums/topic17079--.html À tour de rôle, les rédacteurs de Planète Casio présentent un jeu innovant, drôle, beau ou bien conçu. Blockbuster ou trésor oublié, venez (re)découvrir des jeux d'une qualité remarquable ! Aujourd'hui, nous allons voir... Ipod FallBlocs de Kirafi. Le contexte Salutations ! Aujourd'hui nous nous attaquons à l'un de mes jeux préférés du forum, par ses graphismes et son gameplay : Ipod FallBlocs. Sorti en 2015 par notre cher Kirafi, il s'agit d'un jeu d'arcade/scoring où le joueur doit survivre le plus longtemps possible à une chute continue de blocs, tout en récoltant divers points bonus et power-ups. Le jeu propose trois modes : Un mode classique, un mode "tower" où les blocs apparaissent par deux, et un mode "rain" où les blocs tombent continuellement, sans vague. https://www.planet-casio.com/storage/program-images/2819-iPod_FallBlocs.gif Si le jeu marche aussi bien, c'est parce que Kirafi n'en est pas à son premier essai. En effet, Ipod FallBlocs s'inscrit dans la série des jeux "Ipod", adaptations issues du monde vidéoludique mobile. En voici une liste exhaustive : Ipod Dextris, adapté de SHREDD Ipod Gravitron, adapté de Super Gravitron de VVVVVV Ipod SpikeBird, adapté de Don't Touch The Spikes Ipod FallBlocs, adapté de Run Bird Run Ipod Spin, création originale. Run Bird Run est un jeu développé par le studio français Ketchapp, spécialisé dans les petits jeux mobiles à grand public. Depuis leur création en 2014, ils ont produit pas moins de 200 jeux ! Le studio est connu pour avoir adapté 2048 sur téléphones, et est devenue filiale d'Ubisoft en 2016. Elle continue encore à produire des jeux de nos jours (souvent d'une qualité douteuse). https://youtu.be/SueA-3K-Smo Kirafi conserve le coeur gameplay tout en l'augmentant (via les power-ups), mais a dû totalement se séparer de l'esthétique mielleuse des jeux mobiles pour l'adapter à l'écran de nos chères calculatrices monochromes. Et c'est là que nous rentrons dans le vif du sujet ! Un chef-d'oeuvre finement exécuté Sans conteste, FallBlocs séduit par ses graphismes et son gameplay addictif. Le pixel art est élégant, de l'interface des menus jusqu'aux animations in-game, et en fait un exemple de design graphique réussi sur calculatrices. Les changements de menu sont finement orchestrés, allant du simple glissement lorsqu'on lance une partie à un effet de fondu grandiose pour accéder aux succès. Les boutons sont juteux, on a envie de cliquer dessus grâce aux effets d'ombres. Ce jeu est une friandise pour les yeux... Comme les jeux mobiles, après tout. Regardez ces pièces de puzzle, vous n'avez pas envie de les croquer ? PS_Fallblocs3.png Du côté du gameplay, FallBlocs ne déçoit pas non plus. Les parties sont dynamiques et demandent plus de précision qu'il n'en a l'air. D'ailleurs il est parfois dur de se positionner correctement entre deux blocs, menant à une mort frustrante. Les divers objets distribués au cours d'une partie en peuvent totalement bouleverser le cours. Les boules de points, tombant par moments entre deux vagues de blocs, appellent notre cupidité à prendre des risques. Un instant d'inattention, et nous voilà encerclé par des blocs. Disponibles en trois variantes (2, 5 et le délicieux 30 points), ces boules de points rythment les parties. Les power-ups quant à eux, qu'il s'agisse de bonus ou bien de malus, sont attribués temporairement lorsqu'une barre se rechargeant au cours du temps est remplie. Vous ne voudriez pas avoir les malus qui obscurcissent votre vision, ou bien ceux qui inversent vos contrôles... Le pire est celui qui vous fait perdre des points équivalent à ceux que vous récoltez, une véritable horreur ! :waza: Du côté des bonus, ils permettent généralement de détruire des blocs ou d'augmenter votre score. Exception pour le "bonus" rapetissement, qui – comme son nom l'indique – réduit votre taille et augmente votre vitesse... Vous rendant assez incontrôlable. Voici le trailer du jeu pour vous en rendre compte : https://youtu.be/ZCPVSZqMWPc Un jeu fortement addictif La série des jeux Ipod constitue probablement les meilleurs jeux d'arcade/scoring du site. Kirafi arrive à combiner un style graphique singulier et juteux, associé à un gameplay simple à comprendre, dynamique et amenant toujours à casser son High Score. Si dans Ipod Spikebird, les bonbons à récolter et permettant d'acheter des skins augmentait considérablement la durée de vie du jeu ; les succès jouent ce rôle dans FallBlocs. 36 achievements sont à débloquer en complétant divers objectifs de scoring ou de survie. Petite touche originale, les succès libèrent des pièces de puzzle, révélant de petits tableaux. De quoi satisfaire les plus complétionniste d'entre vous! PS_Fallblocs5.png De plus, les différents modes de jeu changent assez bien le rythme des parties. Le mode "tower", par exemple, invite à la vigilance sur le placement : la présence de double blocs en continu rend plus difficile l'escalade, et menace le joueur de se faire écraser : il faudra donc éviter de se tenir à proximité de tours de blocs. Le mode "rain" quant à lui est très dynamique : la chute de blocs (et de boules de points !) en continu teste nos réflexes et, plus que jamais, nous invite à anticiper les chutes de blocs, qui apparaissent de manière accélérée. Ce jeu constitue un parfait exemple des petits ajouts possibles dans un jeu pour augmenter considérablement sa durée de vie. Des succès, des modes de jeu alternatifs... Mais aussi pourquoi pas une monnaie permettant de modifier le cours des parties ou de customiser son personnage ? Conclusion Si vous jouez encore à des jeux sur calculatrices monochromes, alors la série des jeux Ipod est un must-have. Plus particulièrement, FallBlocs est une perle, tant sur le plan esthétique que ludique. Nul doute que ce jeu vous occupera de longues heures. Le jeu n'est néanmoins pas dénué de petites coquilles, parmis lesquelles on retrouve un manque d'ergonomie dans les touches du menu, ainsi que la lisibilité des blocs mouvants dû à la rémanence de l'écran. Mais ces légers défauts ne troublent en rien l'expérience : Ipod mérite amplement son label de qualité et sa moyenne de 9.59/10. Page du programme (compatible Graph 35+E II !) Liste des jeux de Kirafi Sur ce, je retourne y jouer. On se retrouve dans la Revue des Projets, la semaine prochaine ! Et à bientôt sur Planète Casio ! 8-) Le Press Shift précédent : Press Shift #7 – Island of the Dead Kings (Shadow15510) oh shoot maintenant j'ai envie de faire un jeu ipod Sun, 15 May 2022 18:00:00 +0200 casio880.com est-il fiable? https://www.planet-casio.com/Fr/forums/topic17078--.html J'ai acheté un câble SB-62 de casio880.com, mais je ne sais pas si c'est fiable. Ma mère pense que c'est une escroquerie. Si ce n'est pas fiable, où achète-on un câble SB-62? Sat, 14 May 2022 15:15:18 +0200 Essai de communication via port Serial 3-pins CG10/20/50 https://www.planet-casio.com/Fr/forums/topic17077--.html Hello, ayant juste un petit peu de temps, cette fin de semaine avant d'être une semaine off-line, je voulais regarder un peu la libsnd et le port serial 3-pins. Je me suis donc imprégné de la documentation que j'ai pu trouver ici et là. Mes recherches m'ont permis d'identifier les sources suivantes : - les sources de la libsnd de Thomas Williamson (utilisée dans l'excellentissime Nesizm) et du PrizmSDK - la doc de la bible PC collectée par Simon Lothar (partie CG20 - Serial) dispo ici : serial CG20 - l'explication de texte des syscalls correspondants dans le Wiki de Cemetech ici : wiki Serial A partir de cela, je me suis fait une mini-librairie (je sais, c'est maladif en ce moment :E ) appelée libserial (original, vous ne trouvez pas) qui reprend les syscalls suivants directement liés au port serial 3-pins, ainsi que le header correspondant (serial.h) : - Serial_ClearRX - Serial_ClearTX - Serial_Close - Serial_IsOpen - Serial_Open - Serial_Peek - Serial_PollRX - Serial_PollTX - Serial_Read - Serial_ReadSingle - Serial_Write - Serial_WriteSingle - Serial_WriteUnbuffered ainsi que les suivants, plus ou moins éloignés, mais repris dans le prizmSDK (je les virerais si il ne servent effectivement pas) : - App_LINK_GetDeviceInfo - App_LINK_GetReceiveTimeout_ms - App_LINK_Send_ST9_Packet - App_LINK_SetReceiveTimeout_ms - App_LINK_SetRemoteBaud - App_LINK_TransmitInit - App_LINK_Transmit - Comm_Close - Comm_Open - Comm_Terminate - Comm_TryCheckPacket Pour vérifier que tout fonctionne, j'ai fait un simple petit programme pour vérifier l'état du port serial (ouvert et / ou fermé), puis procéder à son ouverture et à sa fermeture, tout cela sur ma CG50 (Graph 90+E) et ma CG20 pour vérifier que les syscalls sont toujours bien utilisables. Ok, ça compile, ça link et surtout ça fonctionne. Voici le code utilisé : #include <gint/display.h> #include <gint/keyboard.h> #include <serial.h> int main(void) { dclear(C_WHITE); dtext(1, 1, C_BLACK, "Sample fxSDK Communication add-in."); if (Serial_IsOpen() != 1) { dtext(1,21, C_RED, "Serial port is CLOSED !!!" ); dtext(1,31, C_RGB( 31, 24, 0), "Trying to Open it ..." ); unsigned char mode[6]={0,9,0,0,0,0}; Serial_Open( mode ); } if (Serial_IsOpen() == 1) dtext(1,41, C_GREEN, "Serial port is now OPEN !!!" ); else { dtext(1,41, C_RED, "Failed to open the Serial port : STILL CLOSED !!!" ); dtext(1,51, C_BLACK, "Press a key to exit back to OS ..." ); dupdate(); getkey(); return 0; } if (Serial_IsOpen() == 1) { dtext(1,121, C_RED, "Now closing the Serial Port !!!" ); Serial_Close( 1 ); } if (Serial_IsOpen() != 1) dtext(1,141, C_GREEN, "Serial port is now Closed !!!" ); dupdate(); getkey(); return 1; } C'est donc un début vraiment encourageant, dans le sens où la gestion du port se fait correctement et la mini librairie semble bien fonctionner de son côté. Bon, donc plein d'espoir, j'essaie de passer à l'étape suivante : - sur une des 2 machines, envoyer un paquet de char dans le buffer de transmission (donc transmettre, en langage décodé), - sur l'autre machine, recevoir un paquet de char dans le buffer de réception (donc recevoir :) ). Le but étant ici juste d'envoyer d'un côté et de lire de l'autre côté, sans contrôle d'erreur et tout ce qu'il faudrait faire pour avoir des vraies communications "sérieuses" (donc pas taper merci :E ) ... on reste dans le très très expérimental par un gars qui découvre :D . Ceci étant réalisé par le code suivant (enfin, l'expression adéquate serait plutôt : "ceci devant être réalisé par le code suivant" :( ) : * #include <gint/display.h> #include <gint/keyboard.h> #include <serial.h> #include <stdio.h> #include <string.h> int main(void) { dclear(C_WHITE); dtext(1, 1, C_BLACK, "Sample fxSDK Communication add-in."); if (Serial_IsOpen() != 1) { dtext(1,21, C_RED, "Serial port is CLOSED !!!" ); dtext(1,31, C_RGB( 31, 24, 0), "Trying to Open it ..." ); unsigned char mode[6]={0,9,0,0,0,0}; Serial_Open( mode ); } if (Serial_IsOpen() == 1) dtext(1,41, C_GREEN, "Serial port is now OPEN !!!" ); else { dtext(1,41, C_RED, "Failed to open the Serial port : STILL CLOSED !!!" ); dtext(1,51, C_BLACK, "Press a key to exit back to OS ..." ); getkey(); return 0; } dtext(1,210, C_BLACK, "SEND"); dtext(60, 210, C_BLACK, "RECV"); dtext(1, 61, C_BLACK, "Press F1 to set Send mode and F2 to set Receive mode" ); dupdate(); if (getkey().key == KEY_F1) { char MessageToSend[256]; strcpy( MessageToSend, "Hello World !!!" ); int CountSend = 15; dprint(1, 81, C_BLUE, "Will send a message %s ", MessageToSend ); dupdate(); getkey(); // int result = Serial_Write( (unsigned char*) MessageToSend, CountSend ); // Fait Crash la babasse int result = Serial_WriteSingle( (unsigned char) 'Y' ); // idem, fait aussi crash la babasse if (result==0) { dprint(1, 101, C_GREEN, "Message sent" ); } else if (result==2) { dprint(1, 101, C_RED, "buffer is full" ); } dupdate(); getkey(); } else if (getkey().key == KEY_F2) { unsigned char MessageRead[256]; int MaxCountRead = 256; short int CountRead = 0; dtext(1, 81, C_BLUE, "Will receive a message " ); dupdate(); int result = Serial_Read( MessageRead, MaxCountRead, &CountRead ); if (result==0) { dprint(1, 101, C_GREEN, "%s", MessageRead ); } else if (result==1) { dprint(1, 101, C_RED, "buffer is empty" ); } dupdate(); getkey(); } if (Serial_IsOpen() == 1) { dtext(1,121, C_RED, "Now closing the Serial Port !!!" ); Serial_Close( 1 ); } if (Serial_IsOpen() != 1) dtext(1,141, C_GREEN, "Serial port is now Closed !!!" ); dupdate(); getkey(); return 1; } En mode réception (appui sur F2 sur une des machines, cela semble fonctionner (sauf qu'il y a rien à lire donc j'ai le message correspondant affiché), par contre en émission (sur l'autre machine, après appui sur F1), j'ai systématiquement un crash avec reboot de la machine sur la ligne du Serial_Write/Serial_WriteSingle. J'ai bien entendu testé chacune des machines en réception ET en émission, et c'est bien le même comportement sur chacune d'elle. L'émission fait systématiquement crasher et rebooter la machine. Auriez-vous une idée ou un semblant d'idée pouvant expliquer ce comportement ? Je précise que les syscalls sont bien ceux de la page ici (avec leur code respectifs) : serial CG20 Ciao Sly Wed, 11 May 2022 08:22:32 +0200 Problème CASIOWIN et IDA PRO pour fx-gc50 https://www.planet-casio.com/Fr/forums/topic17076--.html Bonjour, j'espère que vous passez une bonne journée. Il y a quelques temps j'ai dump le casiowin du censuré de la fx-gc50 pour pouvoir reverse un petit peu le firmware mais seulement je suis confronté à un problème. IDA Pro n'affiche aucune XRefs et aucune fonction ne semble utiliser de strings. J'apprécierais de l'aide svp ;) Le CASIOWIN en question: casiowin Ma version de IDA PRO: 7.6 Exemple d'instructions qu'IDA me retourne: https://i.ibb.co/BcXccq6/Capture-d-cran-2022-05-10-194753.png Merci de vos réponses. Tue, 10 May 2022 19:51:15 +0200 Résultats du vote du Jeu du Mois de Février/Mars/Avril https://www.planet-casio.com/Fr/forums/topic17075--.html Bonsoir, casionautes ! Nous nous retrouvons ce soir pour annoncer l'heureux gagnant de cette nouvelle édition du Jeu du Mois ! Cette édition était un peu spéciale, car elle regroupait des jeux issus des trois mois précédents – pour rattraper un certain retard. En conséquent, nombre de jeux de qualité y étaient présents, et la bataille fût rude :) Mais nous avons enfin notre gagnant ce soir, après pas moins de 10 votes ! Et sans grande surprise, le jeu qui emporte le trophée est le magnifique Duet de Yatis et Lephenixnoir ! https://www.planet-casio.com/storage/program-images/4173-Duet.png Un jour ils verront que c'est toujours la même image qu'on ressort :E En effet, le jeu a marqué un score exceptionnel de 19 points en se faisant une place de choix dans le cœur de nombreux votants ! Voici le classement complet : Duet de Lephenixnoir et Yatis, 19 points OutRun de SlyVTT,13 points AfterBurner de Lephenixnoir, 9 points Delta de Potter360, 7 points Teh Moon Show de Massena, 4 points Tiny Mutant Axelotl de KikooDX et Massena, 3 points Pong 3D de Hackell, 2 points Merci à tous d'avoir participé à cette édition du Jeu du Mois ! Plus on est nombreux, plus c'est convivial :) Bonne soirée à tous, Et à bientôt sur Planète Casio ! Mon, 09 May 2022 20:43:53 +0200 libJPEG pour Casio prizm/G90+E https://www.planet-casio.com/Fr/forums/topic17074--.html Hello, Comme annoncé dans l'update de la SDL_image, il est désormais possible d'importer des images JPG (ou JPEG) dans les addins gint grâce à la libJPG recompilée pour nos chères Casio CG10/20/50 (PRIZM et G90+E). Cette librairie a pour but de permettre la lecture des fichiers JPG et de rendre les données du fichiers accessible sous une forme facilement exploitable (en gros un tableau de pixels (R,G,B,A) associé à une structure d'entête contenant diverses infos utiles telles que la largeur et la hauteur de l'image lue). Cette librairie est utilisée par la SDL_image mais il peut s'avérer utile le l'utiliser en dehors de la SDL, par exemple pour un addin gint avec dimage(). L'un des principaux avantage du format JPG étant d'offrir des ratios de compression d'images très importants, avec ou sans perte de qualité. Ceci est tout à fait possible et je vous prépare la version "standalone" que vous pourrez utiliser pour créer une image bopti_image_t (format utilisé par gint via les méthodes dimage et dsubimage). Il faudra bien penser à disposer de cette lib pour pouvoir utiliser le code joint, ainsi que de mettre les options de linkage adhoc dans le Makefile ou CMakeLists.txt (Je ferai un tuto quand tout sera fignolé aux petits oignons :lol: , je commence à avoir pas mal de taf pour écrire les tutos qui vont bien, coder c'est bien, mais documenter c'est mieux). #include <gint/gint.h> #include <gint/display.h> #include <gint/keyboard.h> #include <stdio.h> #include <stdlib.h> #include <jpeglib.h> #include <jerror.h> struct imgRawImage { unsigned int numComponents; unsigned long int width, height; unsigned char* lpData; }; struct imgRawImage* loadJpegImageFile(char* lpFilename) { struct jpeg_decompress_struct info; struct jpeg_error_mgr err; struct imgRawImage* lpNewImage; unsigned long int imgWidth, imgHeight; int numComponents; unsigned long int dwBufferBytes; unsigned char* lpData; unsigned char* lpRowBuffer[1]; FILE* fHandle; fHandle = fopen(lpFilename, "rb"); if(fHandle == NULL) { #ifdef DEBUG fprintf(stderr, "%s:%u: Failed to read file %s\n", __FILE__, __LINE__, lpFilename); #endif return NULL; /* ToDo */ } info.err = jpeg_std_error(&err); jpeg_create_decompress(&info); jpeg_stdio_src(&info, fHandle); jpeg_read_header(&info, TRUE); jpeg_start_decompress(&info); imgWidth = info.output_width; imgHeight = info.output_height; numComponents = info.num_components; dwBufferBytes = imgWidth * imgHeight * 3; /* We only read RGB, not A */ lpData = (unsigned char*)malloc(sizeof(unsigned char)*dwBufferBytes); lpNewImage = (struct imgRawImage*)malloc(sizeof(struct imgRawImage)); lpNewImage->numComponents = numComponents; lpNewImage->width = imgWidth; lpNewImage->height = imgHeight; lpNewImage->lpData = lpData; /* Read scanline by scanline */ while(info.output_scanline < info.output_height) { lpRowBuffer[0] = (unsigned char *)(&lpData[3*info.output_width*info.output_scanline]); jpeg_read_scanlines(&info, lpRowBuffer, 1); } jpeg_finish_decompress(&info); jpeg_destroy_decompress(&info); fclose(fHandle); return lpNewImage; } size_t image_size_profile(int width, int height) { size_t size = sizeof(bopti_image_t); size += width * height * 2; return size; } void set_pixel(bopti_image_t *img, int x, int y, int color) { if((unsigned)x >= img->width || (unsigned)y >= img->height) return; uint8_t *bytes = (void *)img->data; img->data[y * img->width + x] = color; } bopti_image_t *convert_jpg_to_bopti( char *filename ) { struct imgRawImage* myJPEG; myJPEG = (struct imgRawImage*) gint_world_switch( GINT_CALL( loadJpegImageFile, "testimg.jpg" ) ); if (myJPEG==NULL) return NULL; int Wmax = myJPEG->width; if (myJPEG->width%2==1) Wmax++; // si largeur impaire, on rajoute un pixel transparent size_t size = image_size_profile(Wmax, myJPEG->height); bopti_image_t *image_temp = malloc( size ); if(!image_temp) return NULL; image_temp->profile = 0; // par defaut on a pas la transparence (on updatera si besoin après) image_temp->alpha = 0x0001; image_temp->width = Wmax; image_temp->height = myJPEG->height; uint16_t color; for (long unsigned int v=0; v<myJPEG->height; v++ ) { for( long unsigned int u=0; u<myJPEG->width; u++ ) { if (myJPEG->numComponents == 1) { unsigned char Grey = myJPEG->lpData[v*myJPEG->width+u]>>3; set_pixel(image_temp, u, v, C_RGB( Grey, Grey, Grey ) ); } else if (myJPEG->numComponents == 3) { unsigned char R = myJPEG->lpData[(v*myJPEG->width+u)*3+0]>>3; unsigned char G = myJPEG->lpData[(v*myJPEG->width+u)*3+1]>>3; unsigned char B = myJPEG->lpData[(v*myJPEG->width+u)*3+2]>>3; color = C_RGB( R, G, B ); if (color!=0x0001) set_pixel(image_temp, u, v, color); else set_pixel(image_temp, u, v, 0x0000); } else if (myJPEG->numComponents == 4) { unsigned char R = myJPEG->lpData[(v*myJPEG->width+u)*4+0]>>3; unsigned char G = myJPEG->lpData[(v*myJPEG->width+u)*4+1]>>3; unsigned char B = myJPEG->lpData[(v*myJPEG->width+u)*4+2]>>3; unsigned char A = myJPEG->lpData[(v*myJPEG->width+u)*4+3]; if (A>=128) set_pixel(image_temp, u, v, C_RGB( R, G, B ) ); else { set_pixel(image_temp, u, v, 0x0001); // set transparency image_temp->profile = 1; // on mets à jour le profil car il y a de la transparence } } } if (Wmax!=myJPEG->width) // si on doit ajouter un pixel supplémentaire sur la largeur { set_pixel(image_temp, Wmax, v, 0x0001); } } free(myJPEG->lpData); free(myJPEG); return image_temp; } bopti_image_t *image = NULL; bopti_image_t *image2 = NULL; int main(void) { // Jute ici pour désactiver le triple buffering par défaut uint16_t *vram1, *vram2; dgetvram(&vram1, &vram2); dsetvram(vram1, vram1); dclear(C_WHITE); dtext(1, 190, C_BLACK, "Sample libcJPG to bopti test :"); dupdate(); image = convert_jpg_to_bopti( "testimg.jpg" ); image2 = convert_jpg_to_bopti( "nofile.jpg" ); // fichier qui n'existe pas, controle de la stabilité dimage( 0, 0, image ); dimage( 0, 0, image2 ); // ne doit pas planter dsubimage( 200, 50, image, 21,15, 120, 88, DIMAGE_NONE ); dsubimage( 200, 50, image2, 21,15, 120, 88, DIMAGE_NONE ); // idem, sans plantage dupdate(); getkey(); if (image!=NULL) free(image); if (image2!=NULL) free(image2); return 1; } et ce qui donne sur l'écran (la grosse image de rose est un dimage() obtenu depuis une image externe en JPG et la petite est obtenue via un dsubimage() ). https://imgur.com/xH4UFHj.png On peut donc bien utiliser les fonctions usuelles de gint avec la librairie. Par contre attention, contrairement à l'habitude, les images ne sont pas allouée en statique, il faut donc bien penser à libérer la mémoire avec un free() et surtout attention à ne pas dépasser la taille maxie de RAM !!! Pour info cette image de rose, de dimension 227x149 pixels en RGB888 pèse : - 49,3ko en PNG - 5,8ko en JPG on comprend vite l'intérêt de ce format. Le dépôt gitea est en cours de fabrication. Je passerai les infos asap. Ciao Sly Sun, 08 May 2022 21:17:41 +0200 La revue des projets – 230 https://www.planet-casio.com/Fr/forums/topic17073--.html Bonsoir à tous, et bienvenue dans cette revue des projets qui s'annonce fascinante quoi qu'un poil technique. SlyVTT vient d'achever nombre de ports de bibliothèques utiles, et on va voir ensemble de quoi il retourne. Mais avant ça, on attaque doucement avec le jeu de la semaine ! ^^ Frozen Frenzy 2 (Massena) Topic du projet : Frozen Frenzy® 2 Dernier build (Graph 90+E): lzy.g3a On commence donc avec un platformer. Il faut remonter au CPC #28 pour trouver Frozen Frenzy, la participation de Massena qui avait remporté le concours. Un jeu très solide mais apparemment pas assez pour Massena, qui veut maintenant le détrôner avec un successeur encore meilleur. Quelques images et informations tombaient par miettes sur `#projets` depuis quelques temps, mais on a cette semaine un topic concret, et même une version jouable avec un niveau de test, ci-dessous en vidéo ! :D https://www.youtube.com/watch?v=wPDJPOkCHf4 Il suffit de jouer quelques secondes pour sentir qu'on a bien plus de contrôle sur δ que dans le premier opus (pour mon plus grand plaisir). Et le programme met l'eau à la bouche : Des graphismes et des environnements urbains et industriels entièrement conçus par mes soins. Un gameplay travaillé, qui se veut plus précis, flexible et simple d'accès que le premier. Une grande variété de pièges, mécaniques centrées autour du feu et de la glace, ainsi que différents objectifs de niveaux (tout geler, mais aussi fuir, s'infiltrer, aller chercher un pancake et revenir...) Un level design intelligent où s'entremêlent voies simples d'accès et passages hardus mais récompensant les speedrunners. Un système à la Celeste/Super Meat Boy avec des niveaux optionnels plus complexes et remplis de pics ! Une mini bande-dessinée dont chaque fragment est dévoilé en début de chapitre, racontant l'odyssée de δ. On le suivra attentivement ! Bibliothèques SDL, SDL_image, libPNG, libJPEG et zlib (SlyVTT) Topic SDL: Développement d'une version de la SDL pour Casio PRIZM (fx-CG10/20/50) Topic SDL_image: libSDL_image pour Casio Prizm / G90+E (fx-CG 10/20/50) Topic libPNG: libPNG pour Casio prizm/G90+E Topic zlib: Zlib pour Casio fx/cg (développement et benchmark) SlyVTT a récemment porté beaucoup de bibliothèques pour la PRIZM et Graph 90+E. Ces bibliothèques permettent trois choses : utiliser la SDL sur Graph 90+E, charger des images PNG/JPG, et enfin compresser des données dans un add-in. Le port de la SDL permet d'écrire des programmes avec l'API SDL 1.2 (l'ancienne) sur Graph 90+E, avec l'avantage majeur que plein de gens connaissent cette API et que les programmes écrits ainsi peuvent être compilés trivialement pour l'ordinateur en plus de la Graph 90+E. ;) Par exemple, voici un Tetris écrit par SlyVTT pour TI-Nspire avec la SDL 1.2, qui marche nickel sur notre machine CASIO (SDLTetris.g3a): https://imgur.com/WAdCUUh.png Ce port supporte le module vidéo (seulement en 396x224 16-bit), les timers, le clavier, ainsi que les fichiers (modulo les world switch qui vont bien dans gint). En gros il supporte tout ce qui est utilisé couramment. :D Sauf peut-être que la SDL toute seule ne sait charger que des images BMP, qui sont un peu nulles. D'où la suite ; SlyVTT a aussi porté la bibliothèque SDL_image qui permet d'utiliser plein d'autres formats, dont PNG, JPG, et PNM. ;) Mais quitte à supporter les fichiers PNG et JPG (ainsi que la méthode de compression/décompression des PNG), SlyVTT nous fournit au passage de quoi les utiliser hors de la SDL, via un port de la libPNG et un port de la libJPEG9d (pas encore de topic à ce jour, mais ça vient). Grâce à ces outils, il est possible d'utiliser des images PNG et JPG dans un add-in sans les pré-convertir comme on le fait par exemple avec fxconv. Il est possible de les charger depuis la mémoire de stockage, ce qui offre beaucoup d'opportunités pour des packs de textures et autres options de customisation. :D Mais ce n'est pas tout ! En effet, le format PNG utilise sur une méthode de compression générique qui est implémentée par zlib. Puisque SlyVTT a porté zlib pour avoir libPNG, il nous montre aussi comment utiliser zlib tout seul dans un add-in, pour compresser des données et des fichiers. Les résultats sont assez parlants, car il y a pas mal de choses qu'on peut compresser : https://imgur.com/OqnbqfT.png Nul doute que cela aiderait à alléger les add-ins et les terribles temps de transfert. ^^ Si vous êtes perdus, voici un résumé des bibliothèques. Chaque sous-liste représente une dépendance (par exemple SDL_image utilise libPNG qui utilise zlib) : SDL 1.2 : une lib classique pour programmer applications et jeux SDL_image : une extension SDL pour charger des images libPNG : implémentation de référence du format PNG zlib : outil de compression de fichiers (notamment utilisé par PNG libJPEG : implémentation de référence du format JPG Sinon, n'hésitez pas à demander des précisions ! C'est tout pour cette fois. La semaine prochaine ce sera probablement un Press Shift, auquel cas on se retrouve dans deux semaines. Et à bientôt sur Planète Casio ! ;) Un seul programme a été posté depuis la dernière RdP : :here: Eigenvalues de TheBigBadBoy Lire la RdP précédente : La Revue des Projets – 229 Besoin d'aide ? Une idée ? Un projet ? Un article ! Sun, 08 May 2022 19:05:40 +0200 [Tutoriel] Utiliser les émulateurs CASIO sous Linux avec Wine https://www.planet-casio.com/Fr/forums/topic17072--.html Les émulateurs officiels de CASIO sont très utiles pour avoir un aperçu de chaque modèle, pour tester des programmes sur les calculatrices qu'on ne possède pas, prendre des captures d'écran ou des captures vidéo, ou même tester des add-ins en développement. Ils ne sont officiellement pas compatibles avec Linux, mais Wine vient à notre rescousse pour les utiliser de façon transparente ! Wine Wine est un outil classique des Linuxiens. C'est un niveau de compatibilité qui traduit les API Windows en Linux/BSD, ce qui permet de lancer nativement des applications Windows sous Linux. Généralement, la difficulté avec Wine c'est qu'il est difficile de supporter l'intégralité de l'environnement Windows et ses API, et donc il y a souvent des subtilités pour installer/lancer correctement les applications. D'où ce tutoriel, qui vous aidera à tout mettre en place :) Émulateur Graph 90+E Commencons par un facile : l'émulateur Graph 90+E (ici en version 3.60 - lien de téléchargement). Lancez le fichier téléchargé avec la commande `wine` ou directement depuis une interface graphique : % wine fx-CG_Manager_PLUS_Subscription_for_fx-CG50_GRAPH90_series_Ver.3.60.exe Wine démarre. Si une popup s'affiche parlant de `wine-mono` pour les applications .NET, vous povez l'ignorer ("Cancel"). Ensuite vient la sélection de la langue. https://gitea.planet-casio.com/Lephenixnoir/Tutoriels/raw/branch/master/Utiliser%20les%20%C3%A9mulateurs%20CASIO%20sous%20Linux%20avec%20Wine/cg50-lang.png Ensuite le contrat de licence, et après quelques étapes l'installation se termine de façon automatique. https://gitea.planet-casio.com/Lephenixnoir/Tutoriels/raw/branch/master/Utiliser%20les%20%C3%A9mulateurs%20CASIO%20sous%20Linux%20avec%20Wine/cg50-license.png Pour lancer l'émulateur, il faut maintenant appeler l'exécutable qui a été installé. Cependant, il faut aussi spécifier un argument, sans quoi on a une erreur (un fait découvert par Redoste) : wine "$HOME/.wine/drive_c/Program Files (x86)/CASIO/fx-CG Manager PLUS Subscription for fx-CG50series/fx-CG_Manager_PLUS_Subscription_for_fx-CG50series.exe" /n"fx-CG Manager PLUS Subscription for fx-CG50series" Et voilà ! Je conseille d'ajouter un alias à votre terminal. https://gitea.planet-casio.com/Lephenixnoir/Tutoriels/raw/branch/master/Utiliser%20les%20%C3%A9mulateurs%20CASIO%20sous%20Linux%20avec%20Wine/cg50-emu.png Émulateur Graph 35+E II L'émulateur Graph 35+E II (ici en version 3.50 - lien de téléchargement) est plus récent et un peu plus complexe : il faut aussi installer des dépendances. Pour ça, on va utiliser WineTricks, un utilitaire de Wine (technique découverte par Ptitjoz). # Installation de WineTricks pour Debian/Ubuntu/Linux Mint et dérivés: % sudo apt install winetricks # Installation de WineTricks pour Manjaro/Arch et dérivés % sudo pacman -S winetricks Les deux composants dont on a besoin sont `vb6run` et `vcrun2015`: % winetricks vb6run % winetricks vcrun2015 Une fois ces formalités accomplies, on peut continuer comme pour la Graph 90+E : % wine fx_Manager_PLUS_Subscription_for_fx_9860GIII_GRAPH35_series_Ver.3.50.exe Et de même, il faut un argument spécial pour le lancer : wine "$HOME/.wine/drive_c/Program Files (x86)/CASIO/fx-Manager PLUS Subscription for fx-9860GIIIseries/fx-Manager_PLUS_Subscription_for_fx-9860GIIIseries.exe" /n"fx-Manager PLUS Subscription for fx-9860GIIIseries" Et voilà, ça roule ! https://gitea.planet-casio.com/Lephenixnoir/Tutoriels/raw/branch/master/Utiliser%20les%20%C3%A9mulateurs%20CASIO%20sous%20Linux%20avec%20Wine/fx-emu.png Émulateur fx-92 Scientifique Collège+ L'installation se déroule comme pour les autres. Commencez par lancer l'installeur directement dans Wine : % wine "ClassWiz Emulator Subscription for fx-92+ Speciale College Ver.2.01_b.exe" Pour celui-ci le lancement est direct, pas besoin d'un argument supplémentaire : wine "$HOME/.wine/drive_c/Program Files (x86)/CASIO/ClassWiz Emulator Subscription/fx-92+ Speciale College Emulator/fx-92+ Speciale College Emulator.exe" Et voilà ! Le terminal se plaint de divers problèmes, mais ça marche quand même. https://gitea.planet-casio.com/Lephenixnoir/Tutoriels/raw/branch/master/Utiliser%20les%20%C3%A9mulateurs%20CASIO%20sous%20Linux%20avec%20Wine/fx92-emu.png Amusez-vous bien avec ces émulateurs ! :D Sun, 08 May 2022 18:21:45 +0200