Planète Casio - Projets de programmation - 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 - Projets de programmation - Flux RSS http://www.planet-casio.com 55 50 Programmes Casio, Jeux, Cours pour Calculatrices Casio. Wed, 30 Apr 2025 22:11:12 GMT Wed, 30 Apr 2025 22:11:12 GMT contact@planet-casio.com (Planet Casio) contact@planet-casio.com (Planet Casio) 5 Xeno Threat (Jeu pour Graph 25) https://www.planet-casio.com/Fr/forums/topic18725--.html Bonsoir tout le monde ! Je passe faire un petit coucou pour faire un état des lieux de mon petit projet de jeu que je développe sur ma vieille Graph 25. https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJXZJNQBjg4gPrTtDDs1jATCf3Xx3kNBXlPjBT5enh2spIIfRKqy8SncftemsvUj2cXJs831iqdsOVNu9Yzrp0zSZBOKQDvxMpCylq_Rm3LrShPLeyqDZstuxJ7KkXSsTzEpEkIWKeWlwEVAPKLVu5NmPzG95Oudn-yI3mB7GX4KqDsAET0mGnT6W9CImf/s1600/IMG_0411-256.jpg Il s’agit d’un petit RPG, en gros un donjon. D’affreux extraterrestres ont envahi votre vaisseau spatial, le Dedalus, et vous devez rejoindre la capsule de sauvetage à l’autre bout de la map pour vous enfuir. Le jeu se joue en vue à la première personne. Comme il n’y a pas la commande GetKey sur Graph 25, l’interface alterne entre illustrations dont on sort avec la touche EXE et phases texte où vous entrez le numéro de l’action que vous voulez effectuer. Du coup, les phases de combat se font naturellement en tour par tour. Petit échantillon de ce que vous pourrez voir en jeu. https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-M22Dcr2luuYlPGJOuOo8ouxgr2GLD5Bv-FH8dW1ba_9WI2ZoOEjOCRzJGLyXj_6lxeXLzlassW8WkQBGcawjp1JlBKX9xPyECe5y9NrVWlM9Xha9tAQ1WTE56Kk5fyh4h-8TCuo7myRScj5YkeAbPzIfEXdNQdLiEkuyMOsqnCJGE4FVIbe-Iyyx43oZ/s1600/IMG_0412-256.jpghttps://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif2Im2iKp-2YL0w1NaOASlaa-vg886fPzVELoh-DZe1JaAwnwgVoU6P8ZpPmtxaqBfG3RvS57D8OWMt9l7uwToPKv7Lilw7wFOCeVu1KiIO5XlPsbYxwQuNIF2ctsJemgOLFBJHHjFLgNDiHtCE4YERxx9gaJm7zjSpHc1qO8_Ud0uyY2sFSzZyPhe8TWD/s1600/IMG_0413-256.jpghttps://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5_jl0A0sUjJne7PY1F1zEA__1XQRW9W66i5awc6jueao726zc6RjJuZCyjDuz3dFigZxC9D3fbz_si4KZQStXssNCCbJrdGXNzOWvfcRoOs2J6L1Ir8ML-TW4fFoGXRNaYYMUq8xlhxgZNuF3yqmqD12N_vaXZfPTcz0gguhH4ba8nJ4Loyyoo5wD8F26/s1600/IMG_0420-256.jpghttps://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUuRiwaHnZAOsKmlG826BmQeUqdM-cGxPHrjzifCJ2nxWjFd8hjWoLYRylYeXloy8Y09BwahGYYGQLodr7aWjaJ_x4zajA1eKgE83zOF0tT37R5HpCKF2cfZx4uH3WTX62DmFQAqDl8_K0HOnVDW84-aGnmZ3sm5nAlhtOu0foqumGuJ-JNnw1Z0cwfhX3/s1600/IMG_0414-256.jpg Le jeu est terminé sur ma calculette à part quelques ajustements de difficulté. Il me reste encore à le reporter sur mon ordi pour pouvoir le distribuer. Ma petite machine étant trop vieille, je ne peux pas faire de transfert et je dois… Tout recopier à la mimine. x) Avant ça, maintenant que j’ai fait l’acquisition d’une Graph-90, je vais m’empresser d’apprendre les spécificités de casioplot et de PythonExtra pour poster une petite participation à la game jam. Bonne semaine à tous ! :D Tue, 22 Apr 2025 03:08:37 +0200 prog-tools add-in for programming on CG50 https://www.planet-casio.com/Fr/forums/topic18696--.html I've been working on an add-in to do programming on the CG50. It has tabs like tmux, and each tab can be split once either vertically or horizontally allowing for up to 12 programs to run at once. Only the currently selected program runs until you switch to another tab or split. I think this will work better than the way the built-in Python does it where you have to save the file and lose your place every time you want to run something. https://raw.githubusercontent.com/JoeyShepard/prog-tools/refs/heads/main/images/planet-casio/pt-main.png https://raw.githubusercontent.com/JoeyShepard/prog-tools/refs/heads/main/images/planet-casio/pt-split.png Each of the 12 splits has its own memory in the 2MB of RAM starting at 0x8c200000. When you start a program or move back to a program that's already running, the add-in shifts the memory for the selected program to the top of the heap so it's contiguous with the rest of the free memory and easy to expand. https://raw.githubusercontent.com/JoeyShepard/prog-tools/refs/heads/main/images/planet-casio/pt-mem.png I'm close to being finished with a simple shell so I can manipulate files without having to leave the add-in. Thanks to LephenixNoir for the help with file system operations and everything else. I plan to add a Forth interpreter next to write programs that run on the calculator. https://raw.githubusercontent.com/JoeyShepard/prog-tools/refs/heads/main/images/planet-casio/pt-command-line.png I made a small framework with SDL2 for testing the add-in. It configures the video memory the same as the CG50 so writing a pixel there works exactly the same as on the calculator. It reimplements some of the gint functionality too so I can compile the add-in for linux which is very convenient for testing. I'll add some more information as I finish more features. Please let me know if you have any suggestions! GitHub repo here. Sat, 05 Apr 2025 18:42:09 +0200 MemTrack - Détection de fuites mémoire https://www.planet-casio.com/Fr/forums/topic18688--.html Hello les gens ! ^^ Voici un petit système pour détecter les fuites mémoire dynamiques dans un programme Casio utilisant gint, compatible aussi bien en C qu’en C++. Le but est simple : à la fin du programme, savoir combien de blocs mémoire n'ont pas été libérés, même ceux alloués dans des libs externes. Fonctionnalités - Remplace malloc/free et new/delete par une version trackée - Compatible avec les appels depuis des libs .a - Affiche automatiquement un message à la fin du programme - Optionnel, activable/désactivable via CMake - Aucun outil externe requis - Ne modifie pas gint ou la libc Intégration 1. Copier le fichier memtrack.h/.hpp dans votre projet : #if !defined(MEMTRACK_H) && defined(MEMTRACK_ENABLED) #define MEMTRACK_H #include <stdlib.h> #include <stdio.h> #include <gint/gint.h> #include <gint/keyboard.h> #include <gint/display.h> #include <gint/kmalloc.h> #ifdef __cplusplus extern "C" { #endif // --- Compteur global --- static int memtrack_alloc_count = 0; void memtrack_init(void) { memtrack_alloc_count = 0; } // --- malloc/free overrides --- void* malloc(size_t size) { ++memtrack_alloc_count; return kmalloc(size, NULL); } void free(void* ptr) { --memtrack_alloc_count; kfree(ptr); } void* calloc(size_t count, size_t size) { ++memtrack_alloc_count; return kmalloc(count * size, NULL); } void* realloc(void* ptr, size_t size) { return krealloc(ptr, size); } // --- Report à la fin du programme --- __attribute__((destructor)) static void memtrack_report_leaks(void) { dclear(C_BLACK); if(memtrack_alloc_count > 0) { char buffer[64]; snprintf(buffer, sizeof(buffer), "Memory leak: %d block(s)", memtrack_alloc_count); dprint(1, 1, C_WHITE, buffer); } else { dprint(1, 1, C_WHITE, "No memory leaks!"); } dupdate(); getkey(); // pause } #ifdef __cplusplus } #endif // --- Opérateurs C++ --- #ifdef __cplusplus #include <new> void* operator new(std::size_t size) { return malloc(size); } void* operator new[](std::size_t size) { return malloc(size); } void operator delete(void* ptr) noexcept { free(ptr); } void operator delete[](void* ptr) noexcept { free(ptr); } void operator delete(void* ptr, unsigned int) { free(ptr); } void operator delete[](void* ptr, unsigned int) { free(ptr); } #endif // __cplusplus #endif // MEMTRACK_ENABLED 2. Dans main() : reset du compteur #include "memtrack.hpp" int main(void) { memtrack_init(); // Ignore les allocations faites avant main() //code... return 1; } 3. Dans CMakeLists.txt Ajouter en haut cette ligne (ON ou OFF) : option(MEMTRACK "Enable memory leak tracking" ON) Et ajouter les lignes suivantes : if(MEMTRACK) target_compile_definitions(myaddin PRIVATE MEMTRACK_ENABLED=1) target_compile_options(myaddin PRIVATE -fno-builtin-malloc -fno-builtin-free -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-new -fno-builtin-delete ) endif() Voilà en espérant que cela peut vous être utile ^^ PS : Je me suis cassé la tête à chercher dans tout gint la fonction builtin de malloc et free, j'ai trouvé que ça, s'il y a un problème, signalé le moi Wed, 02 Apr 2025 19:40:32 +0200 Sudoku in python https://www.planet-casio.com/Fr/forums/topic18681--.html As my first python program I decided to make Sudoku. https://i.imgur.com/i5zmGs9.jpeg Here's the link It's really not bad though IMHO- I'm a bit of a perfectionist. It has a nice interface and even a custom small number font. The code is probably not very pythonic or optimized though. I also had to keep it under 300 lines so I could use the Casio python script editor. Of course this would not have been possible without ExtraPython, so thank you to everyone involved in that! The game can only run on the ExtraPython add-in. Unfortunately there are no screenshots as I don't know how to build/run the emulator. Maybe someone else can take a few ss/gif? For this version there are no save states, 4 difficulties, and a limited amount of games available. Lephe tells me support for file read/write will hopefully be added to EP in the near future, and then I can add save states and 100s of games. Also possibly on the agenda for the future is a reveal/reveal all option. Let me know what you think, because I'm unsure if that's even a positive feature. If you have any other features requests/comments please let me know! Fri, 28 Mar 2025 02:54:20 +0100 Un équivalent graphique de std::cout et de printf pour Casio https://www.planet-casio.com/Fr/forums/topic18675--.html Hello les gens ! ^^ Pour simplifier le debugging de mes projets casio, j’ai conçu un flux de sortie graphique inspiré de std::cout, appelé casio::dout, et je vais vous le partager. J'ai aussi ajouté un équivalent de printf. Équivalent de std::cout pour C++ Il gère : -La composition de flux avec << -Les retours à la ligne \n -Les fins de lignes avec casio::end -Les types string, int, float, etc. Exemple d’utilisation casio::dout(10, 20, C_WHITE) << "Valeur : " << 42 << casio::end; casio::dout(10, 60, C_WHITE) << "Pi ~ " << 3.14159f << "\nApproximatif" << casio::end; Comment ça marche ? Le système repose sur une classe DoutStream qui encapsule : -Les coordonnées (x, y) initiales -La couleur du texte -Un curseur de position mis à jour dynamiquement Le texte est découpé ligne par ligne, chaque mot est affiché avec dtext(), et les sauts de ligne sont simulés en ajustant les coordonnées via dsize(). Intégration Incluez simplement le fichier dout.hpp dans votre projet, et utilisez casio::dout() comme un flux standard. Code : #ifndef DOUSTREAM_HPP #define DOUSTREAM_HPP #include <gint/gint.h> #include <gint/display.h> #include <string> #include <sstream> #include <iostream> namespace casio { struct DoutEnd {}; inline DoutEnd end; class DoutStream { public: DoutStream(int x, int y, int color) : startX(x), curX(x), curY(y), color(color) {} template<typename T> DoutStream& operator<<(const T& value) { std::ostringstream oss; oss << value; processText(oss.str()); return *this; } DoutStream& operator<<(DoutEnd) { // Force une nouvelle ligne newline(); return *this; } private: int startX; int curX; int curY; int color; void processText(const std::string& text) { std::string line; for (char ch : text) { if (ch == '\n') { if (!line.empty()) draw(line); newline(); line.clear(); } else { line += ch; } } if (!line.empty()) draw(line); } void draw(const std::string& text) { dtext(curX, curY, color, text.c_str()); int w = 0, h = 0; dsize(text.c_str(), dfont_default(), &w, &h); curX += w; // Avancer horizontalement } void newline() { curX = startX; int h = 0; dsize("A", dfont_default(), nullptr, &h); // Hauteur de ligne curY += h + 1; } }; // Interface comme std::cout struct dout_creator { DoutStream operator()(int x, int y, int color) { return DoutStream(x, y, color); } }; inline dout_creator dout; inline void formatFloat(float val, char* out) { int sign = val < 0 ? -1 : 1; val = val < 0 ? -val : val; int int_part = static_cast<int>(val); int dec_part = static_cast<int>((val - int_part) * 1000 + 0.5f); // arrondi sprintf(out, "%s%d.%03d", (sign < 0 ? "-" : ""), int_part, dec_part); } inline DoutStream& operator<<(casio::DoutStream& out, float val) { char buf[32]; formatFloat(val, buf); return out << buf; } inline DoutStream& operator<<(casio::DoutStream& out, double val) { char buf[32]; formatFloat(static_cast<float>(val), buf); return out << buf; } } #endif Équivalent de printf pour C dprint est une réimplémentation simplifiée de printf Ce n’est pas un printf complet : -Pas de gestion des drapeaux (-, +, 0, etc.) -Pas d’alignement ou largeur (%5d, %05d, etc.) -Pas de support Unicode ou internationalisation Fonctionnalités prises en charge -Position (x, y) initiale personnalisable -Couleur personnalisée via int color -Gestion des \n comme retour à la ligne visuel -Reconnaissance et rendu des formats : ▬► %d / %i → int ▬► %u / %lu / %ld → unsigned int, long, unsigned long ▬► %zu → size_t ▬► %f / %.Nf → float ou double avec précision personnalisée ▬► %x → hexadécimal (minuscule) ▬► %p → pointeur ▬► %s → chaîne de caractères ▬► %b → booléen (true/false) ▬► %% → pour afficher un % (Le format %b n’existe pas dans printf, mais dprint le supporte) Exemple d’utilisation dprint(10, 10, C_WHITE, "Bonjour\ntout le monde !"); dprint(10, 30, C_WHITE, "Nom: %s Score: %d", "Alice", 42); dprint(10, 50, C_WHITE, "Pi ≈ %.3f", 3.14159f); dprint(10, 70, C_WHITE, "Taille: %zu octets", (size_t)512); dprint(10, 90, C_WHITE, "État: %b", true); dprint(10, 110, C_WHITE, "Adresse: %p", (void*)0x12345678); dprint(10, 130, C_WHITE, "Hex: %x", 255); dprint(10, 150, C_WHITE, "Progression: 100%%"); Code : #ifndef DPRINT_H #define DPRINT_H #include <gint/gint.h> #include <gint/display.h> #include <stdarg.h> #include <stdio.h> #include <string.h> #include <math.h> inline void formatFloat(float val, char* out, int precision) { int sign = val < 0 ? -1 : 1; val = val < 0 ? -val : val; int int_part = (int)val; int dec_part = (int)((val - int_part) * pow(10,precision) + 0.5f); // arrondi sprintf(out, "%s%d.%03d", (sign < 0 ? "-" : ""), int_part, dec_part); } void dprint(int x, int y, int color, const char* fmt, ...) { char buffer[256] = {0}; int cx = x; int cy = y; va_list args; va_start(args, fmt); while (*fmt) { if (*fmt == '%') { fmt++; int precision = -1; if (*fmt == '.') { fmt++; precision = 0; while (*fmt >= '0' && *fmt <= '9') { precision = precision * 10 + (*fmt - '0'); fmt++; } } char temp[64] = {0}; switch (*fmt) { case 'd': case 'i': sprintf(temp, "%d", va_arg(args, int)); break; case 'u': sprintf(temp, "%u", va_arg(args, unsigned int)); break; case 'x': sprintf(temp, "%x", va_arg(args, unsigned int)); break; case 'l': fmt++; if (*fmt == 'd') sprintf(temp, "%ld", va_arg(args, long)); else if (*fmt == 'u') sprintf(temp, "%lu", va_arg(args, unsigned long)); break; case 'z': fmt++; if (*fmt == 'u') sprintf(temp, "%zu", va_arg(args, size_t)); break; case 'f': { double f = va_arg(args, double); if (precision == -1) precision = 3; formatFloat(f, temp, precision); break; } case 's': snprintf(temp, sizeof(temp), "%s", va_arg(args, char*)); break; case 'p': sprintf(temp, "%p", va_arg(args, void*)); break; case 'b': snprintf(temp, sizeof(temp), "%s", va_arg(args, int) ? "true" : "false"); break; case 'c': snprintf(temp, sizeof(temp), "%c", va_arg(args, int)); break; case '%': strcpy(temp, "%"); break; default: snprintf(temp, sizeof(temp), "%%%c", *fmt); // Unknown format break; } dtext(cx, cy, color, temp); int w = 0, h = 0; dsize(temp, dfont_default(), &w, &h); cx += w; } else if (*fmt == '\n') { int h; dsize("A", dfont_default(), NULL, &h); cx = x; cy += h; } else { buffer[0] = *fmt; buffer[1] = '\0'; dtext(cx, cy, color, buffer); int w = 0, h = 0; dsize(buffer, dfont_default(), &w, &h); cx += w; } fmt++; } va_end(args); } #endif Sun, 23 Mar 2025 19:06:51 +0100 programmation de jeux game boy. https://www.planet-casio.com/Fr/forums/topic18645--.html Bonjour, j'aimerais vous présenter une idée de programmer des jeux game boy avec gb studio. Je mettrais ici tous les jeux que j' aurais créés et si vous voulez en rajouter, dite le moi. ( gb studio est installable sur Windows, Linux et MacOS ) Fri, 28 Feb 2025 15:29:31 +0100 Convertir des addins Graph 90+E/Prizm vers Graph Math+ https://www.planet-casio.com/Fr/forums/topic18627--.html Hello, bon, s'ouvre désormais devant nous un vaste chantier de conversion des addins Prizm/Graph 90+E (les fx-CG10/20/50) vers la nouvelle plateforme Graph Math+ (fx-CG100). Comme vous avez pu voir par ailleurs, tout ne fonctionne pas direct out-of-the-box, et dans un certain nombre de cas, il va falloir mettre les mains dans le cambouis pour convertir les addins pour qu'ils tournent vers cette nouvelle machine. Je crée donc ce fil pour collecter et partager l'expérience de conversion, avec les succès mais aussi les galères afin de rapidement acquérir de l'expérience et partager dans la communauté. Idéalement le but est que ça communique. Mon, 10 Feb 2025 08:56:57 +0100 Compabilité des add-ins mono https://www.planet-casio.com/Fr/forums/topic18615--.html Suite à l'annonce que je contribuerai à la compabilitées des add-ins, je poste ce topic oû je (et n'importe qui autre voulant aider) posterai en commentaire la page de l'add in essayé avec en FJ les fichiers néscessaire (fichier pour SH4 ou pour G35E ii) Si quelqu'un d'autre que moi même veut aider, feel free (ouais, je ne sais pas parler français) de poster aussi si l'add-in essayé est compatible avec les SH4 avec le SH4 compability tool et/ou compatible pour Graph 35+E2 avec le patch binaire de Lephe'. Voilà tous de moi, je commence tout de suite... Pas de temps à perdre Sun, 26 Jan 2025 19:26:32 +0100 Smash bros pour casio https://www.planet-casio.com/Fr/forums/topic18598--.html Bonjour à tous, voici un jeu que je programme en ce moment. C'est un smash bros avec les personnages de brawl stars (d'ou le nom smash brawl). Les seules aides dont j'aurai besoin, ce serait des images en 20*20 des brawlers (personnages de brawl stars) de profile Le jeu est sur C.Basic. Systeme Nombre brawlers Menus Graphismes Mon, 20 Jan 2025 23:49:42 +0100 Outils communautaires de programmation on-calc https://www.planet-casio.com/Fr/forums/topic18583--.html Dans le topic Les projets de Planète Casio pour 2025 Sabercat a relancé l'idée d'avoir des bons outils de programmation on-calc (en plus de la compatibilité 35+E II mais ça ça ira dans un autre topic peut-être). Je liste ici les messages de cette discussion avec un résumé. Messages principaux : #198728, #198735, #198761, #198763, #198767, #198773, #198774, #198775, #198777, #198786, #198788 Ce qu'on pourrait viser comme langages : Python : ok, PythonExtra LuaFX : à porter Malical : à porter — y a-t-il de la demande ? Quelque chose pour coder des add-ins (C ? Autre ?) Basic : il y a déjà C.Basic (intégration sans doute impossible) Ce qu'on peut viser comme éditeur : A priori plutôt un éditeur séparé plutôt qu'un éditeur embarqué dans chaque appli Kiwi Text : mais copyright, pas de sources, apparemment pas complètement stable Micropy : existe déjà et marche, toutefois basé sur le PrizmSDK, et le support langage reste à coder Nouveau programme à base de gint + JustUI comme PythonExtra ou text-viewer Sabercat a mentionné qu'il serait bien de pouvoir coder des add-ins sur la calto. Je suis d'accord. Par contre, avoir un compilateur + linker sur la calto c'est trèèès ambitieux et porter les outils GNU c'est pas possible. Personnellement, je pense qu'il serait plus intelligent de coder des add-ins sur la calto dans un autre langage que le C. Je sais pas ce que vous en pensez... Fri, 10 Jan 2025 13:58:58 +0100