Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Programmer en C sur Graph 35/75 +E
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Programmer en C sur Graph 35/75 +E

Posté le 13/11/2017 18:27

Pour faire des jeux demandant plus de ressources (tels que Jetpack Joyride, Fruit Ninja...) il est possible d'utiliser le langage C sur Graph 75.
Les programmes écrits en langage C ont le format .g1a (incompatible avec le .g1m, qui est un format basique), et sont appelés "addins".
Il est possible de mettre ces fichiers g1a dans une Graph 35 si on l'a tweakée.

Dans ce tutoriel, j'assumerai que vous connaissez déjà le C, et donc que vous êtes familiers avec le concept de structure, pointeurs, variables, etc.
Si ce n'est pas le cas, je vous invite à aller voir le tutoriel d'Openclassrooms : https://openclassrooms.com/courses/apprenez-a-programmer-en-c
Allez jusqu'à la fin du chapitre 2, la SDL ne vous servira pas ici.

Partie 1 : Installation des outils

Si vous êtes sous Linux, allez voir du côté de Gint. Sinon, vous êtes sous windows, et vous devrez donc installer le SDK de Casio. si vous avez un mac, je vous plains

Sous windows, vous utiliserez le SDK Casio. Lors de l'installation, ne le mettez pas dans un dossier avec des parenthèses tel que "Program Files (x86)" !

Certaines parties de ce tutoriel concernant les restrictions du C ne s'appliquent pas à Linux.

Partie 2 : Découverte du SDK

Une fois le SDK installé, ouvrez le. Vous aurez ça :


Nous allons commencer par créer un nouveau projet. Pour ce faire, faites : Project → New puis remplissez les champs.



Il vous dira "No program file could be found in the project! You might build the project first."
Ce message d'erreur indique qu'il n'y a pas de fichier .g1a (normal, on vient de le créer, et on n'a pas encore compilé).
Pour le compiler, appuyez sur "Project" puis faites "Rebuild All". Dans la fenêtre "Build", vous devriez avoir ça :



Si à la fin vous avez une erreur ressemblant à Invalid parameter specified in option "input" : ""C:\Program Files (x86)\CASIO\fx-9860G SDK\OS\FX\lib\setup.obj"" c'est que vous l'avez installé dans un dossier avec des parenthèses ! Refaites tout le tutoriel en lisant bien cette fois.

Ensuite, faites "Run" (ou F5) afin de faire tourner le programme dans l'émulateur intégré. Agrandissez un peu la fenêtre "Display" pour que l'écran s'agrandisse. Ensuite, allez dans le menu puis trouvez votre addin qui est tout en bas (ou tapez "A" pour y accéder directement, si vous êtes flemmard).



(ne faites pas attention à la skin rouge, j'ai tuné mon SDK)

Bref, maintenant on va modifier un peu le code. Allez dans le dossier où est votre projet. Vous devriez avoir ces fichiers :


MainIcon.bmp est un bitmap monochrome qui sera affiché dans le menu, éditez le pour créer l'icône de votre programme (paint suffit).

Ouvrez tutoriel.c avec votre éditeur de texte préféré (je conseille notepad++). Il est possible d'éditer le fichier directement depuis le SDK, mais il n'y a aucune coloration syntaxique et la police n'est même pas monospacée.

Ici, la fonction main() sera cette fonction :

int AddIn_main(int isAppli, unsigned short OptionNum)
{
    unsigned int key;

    Bdisp_AllClr_DDVRAM();

    locate(1,4);
    Print((unsigned char*)"This application is");
    locate(1,5);
    Print((unsigned char*)" sample Add-In.");

    while(1){
        GetKey(&key);
    }

    return 1;
}

C'est par cette fonction que votre programme commencera.
Les paramètres isAppli et optionNum ne vous serviront pas. En fait, un addin peut être lancé soit du menu principal, soit avec un E-act (qui a d'ailleurs disparu avec la mort de la 75+E, et qui de toute façon ne servaient à rien sauf à y mettre ses cours). Etant donné que votre addin sera toujours lancé depuis le menu principal, vous pouvez ignorer ces variables.

La première chose à noter est : il n'y a pas de printf(). Normal, la calculatrice n'a pas de notion de flux d'entrée et de sortie comme sur PC. Il faudra faire des "locate" comme en Basic. Ici, le locate est divisé en 2 parties : une fonction locate(int x, int y) qui place le curseur à la position x,y et Print(char* str) qui affiche le string à l'écran à la position du curseur.
Il n'y a pas non plus de scanf(), mais il ne vous manquera pas : j'imagine que vous voulez faire des jeux, or la plupart des jeux ne demandent pas de taper du texte.
Si vous avez besoin que l'utilisateur tape du texte, codez la fonction vous-même ou utilisez la librairie EasyInput.
Si vous avez besoin d'afficher un chiffre à l'écran, deux choix s'offrent à vous :
- Soit vous utilisez la fonction sprintf() qui s'utilise comme printf() mais avec un buffer, comme ceci :

int a = 30, u = 40;
//printf("Le nombre est %d", a);
char* str = malloc(u);
sprintf(str, "Le nombre est %d", a);
locate(1,1);
Print(str);

- Soit vous utilisez une fonction itoa qui n'est pas dans la librairie C standard, mais la voici ci-dessous :

/* itoa:  convert n to characters in s */
void itoa(int n, char s[])
{
     int i, j, sign;
    char c;

     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
}

Je vous conseille la deuxième solution, sachant qu'utiliser sprintf() ajoute 30 ko à votre addin, ce qui est relativement beaucoup.
Attention à bien #include <stdio.h> si vous voulez utiliser sprintf(), car le compilateur du SDK ne vous fera absolument aucune erreur, il compilera et vous aurez une erreur quand vous lancerez l'addin.

Une autre différence importante est que ce qui est supporté est le C89. La différence majeure avec le C99 (que vous avez probablement utilisé dans le tutoriel) est la nécessité de déclarer des variables au tout début de la scope. Par exemple :

void fonction() {
  int a; //fonctionne : c'est déclaré tout au début de la scope
  int b; //fonctionne aussi
  fonction(); //passé ce point, aucune déclaration n'est possible
  int c; //fera une erreur "Unexpected token "int""
}

Cela veut aussi dire qu'on ne peut pas faire for (int i = 0; i < 20; i++), on est obligé de déclarer i avant la boucle for.

La fonction Bdisp_AllClr_DDVRAM() sert à clear (vider) le DD (Display Driver, c'est à dire l'écran) et la VRAM.
Pour savoir la différence entre le DD et la VRAM, imaginons que je doive tracer un sprite. Si je le traçais directement sur l'écran, on verrait le sprite se dessiner au fur et à mesure, et ça serait très moche.
Au lieu de ça, on trace le sprite sur la VRAM, puis on envoie la VRAM au DD lorsqu'on a fini de tracer.
Cet envoi de la VRAM au DD n'est pas automatique, il faut l'initier avec la fonction Bdisp_PutDisp_DD(). Certaines fonctions font ça automatiquement.

Enfin, la fonction GetKey(int *key) sert à attendre un input d'un joueur. Attention, cette fonction est bloquante, c'est à dire qu'elle arrête l'exécution du programme tant que l'utilisateur n'a pas appuyé sur une touche ; nous verrons par la suite d'autres fonctions qui ne sont pas bloquantes. À noter que GetKey met à jour le DD (il envoie la VRAM au DD).

Partie 3 : Utilisation de MonochromeLib

MonochromeLib est une librairie incontournable des programmeurs casio : elle améliore grandement la vitesse des fonctions de dessin (et donc les fps).
Téléchargez la en allant ici : https://www.planet-casio.com/Fr/logiciels/voir_un_logiciel_casio.php?showid=86
Vous aurez des fichiers MonochromeLib.c et MonochromeLib.h, déplacez les dans le dossier où est votre projet.
Ensuite, il faut les ajouter à votre projet. Dans le SDK, tout à gauche, faites un clic droit sur "Source Files", puis "Add", puis naviguez jusqu'à votre projet et sélectionnez les 2 fichiers (ctrl+clic).



Ouvrez le fichier MonochromeLib.h. Vous remarquerez des #define commentés : c'est pour éviter de prendre trop de place (sinon, des fonctions pas utilisées sont exportées dans l'addin, et ça l'alourdit inutilement).
Je vous conseille de décommenter celles là :



Enfin, dans tutoriel.c, ajoutez #include "MonochromeLib.h" puis remplacez le Bdisp_AllClr_DDVRAM() par ML_clear_vram().
Allez dans le SDK, faites "Project - > Rebuild All" (si c'est grisé, appuyez sur "Run" → "Stop"). L'addin devrait compiler normalement, et si vous lancez l'addin il devrait montrer la même chose que précédemment... mais un peu plus vite
À l'avenir, n'utilisez pas les fonctions de dessin natives à Casio, utilisez toujours celles de MonochromeLib (ML).

Partie 4 : Gestion des touches et de l'affichage

Pour gérer les appuis sur les touches, il existe 2 fonctions :
- GetKey() qui est bloquante et affiche automatiquement la VRAM à l'écran
- IsKeyDown() qui n'est pas bloquante et n'affiche pas la VRAM à l'écran.

Laquelle utiliser ? Tout dépend de si votre jeu est en temps réel ou non. S'il n'y a pas de temps réel (par exemple sur un menu), utilisez GetKey(). Lorsqu'il y a du temps réel, utilisez IsKeyDown().

Les valeurs des touches sont trouvables dans les fichiers PDF qui sont normalement dans le dossier d'installation du SDK (fichier "Key Code List.pdf").
Attention aux modifieurs (shift + alpha) qui peuvent retourner une valeur différente (ainsi, si l'utilisateur appuie sur shift+bas, ça donnera la valeur KEY_CTRL_PAGEDOWN au lieu de KEY_CTRL_DOWN).

Par exemple, voici une boucle de jeu où on peut déplacer un carré (pseudo-code) :

while (1) {
  ML_clear_vram();
  ML_pixel(x, y);
  ML_display_vram();
  if (IsKeyDown(KEY_CTRL_UP)) {
    y--;
  } else if (isKeyDown(KEY_CTRL_DOWN)) {
    y++;
  } ...
}


Quant aux fonctions d'affichage, il y a :
- ML_pixel() pour afficher un pixel
- ML_line() pour afficher une ligne
- ML_rectangle() pour afficher un rectangle, etc
Pour toutes les fonctions, regardez MonochromeLib.h, le nom est assez explicite.

Pour afficher du texte, il y a :
- Print(char *str), précédée d'un Locate(int x, int y) pour afficher d'une manière similaire à la fonction Locate du basic
- PrintRev qui fonctionne comme Print mais inverse les couleurs (blanc sur noir)
- PrintXY(int x, int y, char* str, int type) qui affiche str aux coordonnées x,y, en noir si type = 0, en blanc si type = 1
- PrintMini qui fonctionne comme PrintXY mais affiche avec la petite police (comme la fonction Text du basic)
- BetterFont, librairie permettant d'afficher une police avec des caractères customisés
À noter que ces fonctions utilisent le codage Casio, partiellement compatible avec l'ASCII.
Pour l'exemple, nous allons afficher "agréable".
Si vous faites Print("agréable"), vous aurez remarqué que ça affiche ceci :



Ou "agr able" si vous avez sauvegardé votre fichier en ANSI au lieu d'UTF-8.
Il faut donc se conformer au codage casio. Pour le connaître, allez dans le dossier d'installation du SDK, où il y a 5 fichiers pdf. Celui qui nous intéresse est le "Character Set".
À la page 6 du PDF, on voit que le codage de "é" est 0xE60A.

Pour insérer ces octets dans un string, nul besoin d'utiliser un éditeur hexadécimal pour modifier le fichier .c (ce qui pourra d'ailleurs provoquer des erreurs de compilation) : il faut utiliser l'escape hexadécimale \x, qui ne prend normalement que 2 chiffres en argument.
Notre ligne de code sera donc Print("agr\xE6\x0Aable").
Si on l'exécute, ça fait ça :



Quel est le problème ? Apparemment le compilateur considère que le \x prend jusqu'à 3 chiffres, et donc traduit en 0xE6 et 0x0Aa → 0xAA, et 0xE6AA correspond au point du milieu dans l'encodage casio.
Pour éviter ça, il faut savoir que les strings côte à côte sont concaténés automatiquement. Rajouter 2 guillemets suffit pour que le compilateur sache qu'il faut s'arrêter à 0A :
Print("agr\xE6\x0A""able")

Partie 5 : Les syscalls

Les syscalls (system calls) sont des fonctions inhérentes à l'OS. Casio n'a pas fait de doc là dessus, mais grâce aux travaux de Simon Lothar, la plupart des syscalls sont connus : https://bible.planet-casio.com/simlo/chm/v20/

Ces syscalls ne vous serviront sûrement pas, mais ils permettent par exemple de créer un dossier customisé dans la mémoire principale/secondaire, changer le contraste, etc.

Pour utiliser un syscall, il existe différentes manières. En voici une.
Créez un fichier syscalls.src, que vous ajouterez dans le projet (de la même manière dont vous avez ajouté MonochromeLib).
Mettez-y le code suivant :

syscall_table:
    .data.l    H'80010070

    .end

Puis, lorsque vous voulez ajouter le syscall 0x123 que vous voulez appeler monSyscall, ajoutez le code suivant (en haut du code) :


    .export _monSyscall

_monSyscall:
    mov.l    syscall_table, r2
    mov.l    monSyscall_code, r0
    jmp    @r2
    nop
monSyscall_code:
    .data.l    H'123


Dans votre fichier .c, il vous suffira de faire monSyscall() (avec les arguments nécessaires bien entendu).

Partie 6 : Autres fonctionnalités du SDK

Je n'ai jamais utilisé ces fonctionnalités (à tort, ça m'aurait bien servi quand je programmais sur casio), mais elles pourraient vous être utiles.

Premièrement, le SDK possède des breakpoints, qui servent à arrêter l'exécution d'un programme afin de pouvoir mieux le débugger. Il est également possible de voir la valeur des variables dans les fenêtres "global variables" et "local variables".
Lors d'une erreur, il y a une fonction "trace" qui vous pointera sur la ligne de votre code qui a causé l'erreur.
Il est également possible de faire "Run" → "Trace Into", qui vous donne :



Très pratique pour débugger, sachant qu'on ne peut pas faire de printf.

L'onglet "View" permet d'accéder à un désassembleur, mais ne connaissant pas l'assembleur SH3 je ne peux pas dire grand chose là dessus (tutoriel d'initiation).
Il permet également :
- D'avoir une vue de la mémoire flash (très utile si on veut toucher au système avec des syscalls)
- D'avoir une vue de la heap, stack, et call stack
- D'avoir une vue des registres

À noter que vous avez 8 ko de RAM statique (où sont stockées entre autres les variables globales), 32 ko de stack (la ram statique empiète sur ces 32 ko), et 64 ko de heap (dont 256 ko supplémentaires sur les SH4, mais à accéder par pointeur explicite).

Important : le SDK génère par défaut des addins SH3, qu'il faut convertir en SH4 pour les nouvelles calculatrices (> 2012).

Liens utiles :
Erreurs de compilation du SDK
Rendre le SDK compatible SH4 par défaut
Convertisseur SH3 → SH4 (ne fonctionne pas parfaitement dans le cas de syscalls touchant au clavier ou à l'écran)


Précédente 1, 2, 3, 4, 5, 6, 7, 8 Suivante
Shadow15510 Hors ligne Administrateur Points: 5499 Défis: 18 Message

Citer : Posté le 30/07/2018 10:08 | #


Pour Mac il existe une solution alternative à la VM : PlayOnMac. Ce logiciel disponible gratuitement ici permet de faire tourner des *.exe sur un Mac
Je crois que cette app existe également sous Linux (PlayOnLinux)
J'ai déjà rencontré quelques problèmes avec cette application avec des jeux mais avec le SDK ça marche très bien


"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Dark storm En ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 30/07/2018 11:17 | #


Pour le coup je déconseille vraiment, c'est une porte ouverte à toutes les merdes qui trainent sous Windows.
Au moins si la VM est vérolée, t'as juste à la réinstaller.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Programhater Hors ligne Membre Points: 54 Défis: 0 Message

Citer : Posté le 31/08/2018 22:47 | #


Petite erreur (enfin si je ne me trompe pas moi-même ) il faut inclure MonochromeLib.c et non pas MonochromeLib.h. Par contre, il faut bel et bien dé-commenter les fonctions dans le MonochromeLib.h

En chaque homme ou femme se trouve une créature sans sentiments, avides de pouvoir et d'argent.
Moi
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 31/08/2018 22:52 | #


Ha non, on n'inclut jamais un .c !

Techniquement inclure le .c fonctionne car le .c inclut lui même le .h, mais au lieu d'inclure uniquement les prototypes, tu inclus toutes les fonctions. Je crois que ça va te poser problème si tu fais ça dans plusieurs fichiers.
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 31/08/2018 22:58 | #


Zezombye a écrit :
Ha non, on n'inclut jamais un .c !

Aha ! Comme quoi même toi tu finis par retenir...

Techniquement inclure le .c fonctionne car le .c inclut lui même le .h [...]

Pour être techniquement correct, merci beaucoup, inclure le .c fonctionne car le fichier source fournit les définitions et toute définition contient une déclaration implicite. Peu importe si l'en-tête est inclus indirectement ou pas.

Je crois que ça va te poser problème si tu fais ça dans plusieurs fichiers.

En effet, soit le fichier source contient des définitions non statiques et le compilateur va gueuler parce que tu les créeras en double, donc tu auras des conflits sur les noms des symboles ; soit il n'en a pas et tu vas dupliquer tout le code et toutes les données, et chaque fichier incluant le .c incriminé tournera sur une instance différentes des variables statiques et globales. Vraiment pas une bonne idée, donc...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Programhater Hors ligne Membre Points: 54 Défis: 0 Message

Citer : Posté le 28/09/2018 19:53 | #


Mmh... Bon je me débrouille pas mal en C mais je comprends pas : si on inclut que le "fonction.h"(imaginons) comment le main.c piochera les fonctions du "fonction.c" ? Parceque inclure les prototypes c'est bien beau mais ça sert à rien si on a pas les fonctions en elle mêmes. Au pire du pire on peut inclure le .h et mettre les fonctions entières en bas du main.c mais si je voulais les fonctions dans un fichiers séparés je serais obligé d'inclure le .c non ? Vu que ce dernier ne sera pas inclut... Moi j'ai toujours inclus les ".c" Si quelqu'un voulait bien m'expliquer...
EDIT : désolé pour la re-réponse 1 mois après

En chaque homme ou femme se trouve une créature sans sentiments, avides de pouvoir et d'argent.
Moi
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 28/09/2018 20:13 | #


Oh et bien voilà : je viens de publier le 7ème Tutoriel Du Mercredi, qui parle précisément de ça. La réponse est dedans, et en bien détaillé

https://www.planet-casio.com/Fr/forums/lecture_sujet.php?id=15378
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Programhater Hors ligne Membre Points: 54 Défis: 0 Message

Citer : Posté le 28/09/2018 20:14 | #


"Eh bien, c'est le programmeur qui donne au compilateur les informations sur la fonction. Il lui indique son nom, ses arguments, le type de sa valeur de retour... c'est-à-dire son prototype (aussi appelé « signature »). Quant à savoir où elle est, le compilateur s'en moque ! Il indique juste dans le code assembleur « ici il faut appeler map_generate() » et ensuite c'est le linker, dans la dernière phase de compilation, qui recolle les morceaux et vérifie que toutes les fonctions sont là." Donc si j'inclus que les prototypes le compilateur trouvera automatiquement la fonction c'est ça ?
En chaque homme ou femme se trouve une créature sans sentiments, avides de pouvoir et d'argent.
Moi
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 28/09/2018 20:16 | #


(Si tu n'as pas la patience de lire, la réponse est « en fait, tu n'as pas besoin d'avoir le code de la fonction dans le fichier pour l'appeler, il faut juste qu'elle soit dans un des fichiers du projet. Le prototype sert de remplacement pour dire que la fonction existe, mais est ailleurs ».)

Ajouté le 28/09/2018 à 20:17 :
En fait même si tu n'inclus pas le prototype, il peut la trouver. C'est le linker, une fois tous les fichiers compilés, qui fait ce boulot. Le prototype sert au compilateur pour savoir comment appeler la fonction. Si tu ne le donnes pas le linker trouvera quand même la fonction mais le code assembleur généré pour l'appel risquera fortement d'être faux.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Programhater Hors ligne Membre Points: 54 Défis: 0 Message

Citer : Posté le 28/09/2018 20:17 | #


Ah d'acc'. Merci !
En chaque homme ou femme se trouve une créature sans sentiments, avides de pouvoir et d'argent.
Moi
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 24/11/2018 17:17 | #


Bonjour, en programmant je rencontre l'erreur "Nonexisting memory by data write access at FFFFFFE8" quand je vais dans "E-Act" après l’exécution du Add-in. J'ai remarqué que l'erreur ne se faisait pas quand je mettais un GetKey(&a); qui ne sert strictement à rien dans le programme. Pour info je suis parti du main.c par défaut du SDK, donc l'erreur ne viendrait pas de mon propre code. Si quelqu'un aurait un moyen d'éviter le bug sans utiliser GetKey()...
Du coup une deuxième question, j'ai réussi à me débarrasser du bug mais quand je quitte l'Add-in je suis obligé de repasser par une application de la Casio avant de pouvoir exécuter une seconde fois le programme comme pour cet Add-in donc si qqn a la solution ou au moins une explication...
Merci d'avance
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 24/11/2018 17:22 | #


Il y a une règle que j'ai découverte en tentant de diagnostiquer ce bug... si le premier programme lancé au démarrage se termine sans appeler GetKey(), la calculatrice plante lorsque la seconde application est lancée.

C'est un peu chiant, mais tu peux en fait injecter une touche puis appeler GetKey() (ce qui lui fait répondre instantanément la touche que tu as injectée), ou peut-être (je n'ai jamais essayé) GetKeyWait() avec des paramètres instantanés aussi.

Le deuxième problème est lié. Normalement tu ne dois pas quitter ton add-in en terminant le code, tu dois appeler GetKey(), ce qui permet à l'utilisateur de retourner au menu en appuyant sur la touche MENU. S'il re-sélectionne ton application, il revient à l'endroit du GetKey(). Ce qui se passe actuellement c'est que ton programme reprend... à la fin de la fonction principale. Donc il re-termine tout de suite.

Tu peux modifier ça pour pouvoir le relancer, mais je te conseille sérieusement d'envisager d'utiliser GetKey() à un moment (dans ton menu principal ?), surtout que IsKeyDown() et consorts sont mauvais pour la batterie et quelques autres trucs.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 24/11/2018 17:55 | #


Merci pour la rapidité de la réponse
Injecter une touche ? Il y a une fonction pour ça ou alors c'est avec les vraies touches ?
Sinon merci pour les précisions sur le second bug mais dans mon cas je suis dans une boucle infinie (c'est le conway's game of life) et je ne vois pas trop comment sortir de la boucle sans utiliser IsKeyDown() malheureusement... Peut être que je dois limiter le nombre de fois où IsKeyDown() est appelée à tous les 10 passages de boucle si tu vois ce que je veux dire.
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 24/11/2018 17:57 | #


Il y a une fonction pour ça. Est-ce que tu sais utiliser de syscalls ?

Tu as plusieurs choix, pour le second problème. Le premier est d'utiliser GetKeyWait() avec un délai limite pour s'arrêter automatiquement après un certain temps. La seconde, plus propre encore mais plus subtile, est d'utiliser un timer pour régulièrement calculer une génération suivante.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 24/11/2018 18:20 | #


J'ai vu à peu près ce que sont les syscalls grâce au tuto mais je sais rien faire avec, je vais me renseigner. Merci pour l'aide en tout cas
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 24/11/2018 19:09 | #


Bon courage !
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 24/11/2018 19:18 | #


Bon bah comme alternative à IsKeyDown() j'ai fait :
------------
int t = 0;
unsigned int key;
while(1) {
t = (t+1)%100;
//code
if(!t) GetKeyWait(KEYWAIT_HALTON_TIMERON, 0, 0, &key);
}
-------------
Comme GetKeyWait() ajoute un petit lag (même avec 0 pour le temps) je l'appelle tous les 100 tours de boucle et ça me permet de retourner dans le menu tranquillement.
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Lephenixnoir En ligne Administrateur Points: 24219 Défis: 170 Message

Citer : Posté le 24/11/2018 19:35 | #


Est-ce que tu as essayé KEYWAIT_HALTOFF_TIMEROFF ? Ça termine toujours instantanément.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 24/11/2018 19:37 | #


Ouai j'ai essayé et ça ne fait rien... mais là je viens de penser à une solution avec... je reviens

EDIT : j'ai pas réussi j'ai tenté ça :
GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF, 0, 0, &key);
if(key ==  KEY_CTRL_MENU) GetKey(&key);

et ça
if(GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF, 0, 1, &key) == KEY_CTRL_MENU) GetKey(&key);


sachant qu'en mettant 1 en troisième argument c'est censé retourner la valeur de MENU si j'ai bien lu.
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 24/11/2018 19:45 | #


Le GetKeyWait() il buggait pas ?
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Ityt Hors ligne Membre Points: 216 Défis: 0 Message

Citer : Posté le 24/11/2018 19:56 | #


ok je viens de penser à un truc tout con :
if(GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF, 0, 1, &key)) GetKey(&key);

Le problème est réglé.
salut je m'appelle sacha et je viens du bourg-palette et voici mon meilleur ami pikachu
Précédente 1, 2, 3, 4, 5, 6, 7, 8 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 56 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd