Page 1 of 2

Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 19 Nov 2023, 18:17
by critor
L'année dernière, Casio a fait appel à tes communautés de passionnés de calculatrices TI-Planet et Planète Casio, dans le cadre de la Paris Games Week 2022, pour développer un jeu vidéo Python compatible avec ses calculatrices graphiques, et présenter des éléments de sa conception lors d'un atelier en ligne.

La principale difficulté est que malgré des spécifications matérielles très honorables, l'application Python des calculatrices Casio n'intègre pas de fonction permettant de détecter les appuis sur les touches clavier.

Pour gérer les entrées de tes jeux, une possibilité à la place est de faire appel à la fonction de saisie input() pour demander au joueur ses actions. Sauf que c'est bien souvent exclu dans le cadre de jeux utilisant une interface graphique, car rebasculant alors sur la console texte Python et effaçant donc l'affichage graphique.

Il existe toutefois une autre alternative particulièrement pertinente pour les jeux à interface graphique, intercepter l'exception KeyboardInterrupt qui est déclanchée à chaque fois que tu appuies sur la touche
AC/ON
, permettant d'éviter les basculements entre interface graphique et interface texte à chaque nouvelle entrée du joueur. L'inconvénient par contre est qu'il faut concevoir des jeux se jouant avec une seule touche, la touche
AC/ON
, particulièrement bien nommée puisque c'est également une forme d'écriture abrégée de "ACTION".

Une contrainte certes, mais qui n'empêche absolument pas de réussir d'excellents jeux Python sur ces calculatrices. Et peut-être même davantage un avantage qu'un inconvénient, si cela incite à inventer plutôt qu'à adapter de l'existant, les jeux se jouant à une seule touche n'étant pas légion de nos jours.

18350Nous avions commencé l'année dernière par te concevoir une adaptation en Python du jeu Flappy Bird, compatible à la fois avec la calculatrice couleur Graph 90+E mais également avec la calculatrice monochrome Graph 35+E II. Le jeu se jouait effectivement avec la seule touche, permettant ici de battre des ailes.
Image

Pour la deuxième année consécutive, Casio fait de nouveau appel à nous, cette fois-ci dans le cadre de la Journée mondiale du jeu vidéo ce samedi 18 novembre 2023.

Nous t'avons conçu cette année dans le même esprit non pas un mais deux nouveaux jeux Python, pour calculatrice couleur Graph 90+E !

1835118356Commençons par te présenter le jeu que j'ai conçu au nom de TI-Planet, Etiord, qui est cette fois-ci une création originale pour Casio.

La métropole d'Etiord, se trouvant sur un axe de circulation majeur emprunté chaque année par les vacanciers, souffre régulièrement d'embouteillages empoisonnant la vie des habitants. Et cette année au volant de ta voiture rouge, comme tant d'autres à la fois, tu te dois de la traverser.

Sauf que le nouveau maire fraîchement élu a décidé de prendre le problème à bras-le-corps. Afin de fluidifier le trafic en période estivale, il a décidé d'une nouvelle règle innovante s'appliquant sur l'ensemble du territoire métropolitain : interdiction de tourner à gauche, c'est-à-dire de couper toute voie de circulation contraire, et également interdiction de faire marche arrière.

Sauras-tu trouver l'itinéraire te permettant de traverser avec succès chacun des 6 quartiers de la ville et rejoindre enfin le lieu idyllique de tes vacances ?...

Le jeu te présente chaque quartier en vue de dessus et se joue à une seule touche,
AC/ON
, qui te permet d'effectuer donc la seule manœuvre autorisée, tourner dans la prochaine rue à droite. Ta voiture est partiellement autonome : elle avance toute seule et tournera automatiquement à droite en fin de rue sans que tu aies à lui préciser. Mais attention toutefois à ne pas t'engager dans une impasse...
Image

18352Précisons que Etiord est non seulement compatible avec l'application Python officielle, mais également avec l'application additionnelle PythonExtra, avec la particularité d'étendre la zone graphique affichable de 384×192 à 396×224 pixels (pleine définition de l'écran). PythonExtra t'offrira ainsi ici une vue un peu plus étendue de chaque quartier, et également une légère amélioration des performances.
Par contre, précisons qu'Etiord n'est pas compatible avec les applications additionnelles KhiCAS et Micropy, le problème étant que l'exception KeyboardInterrupt n'est pas gérée de la même façon que dans l'application Python officielle.


Téléchargement : https://www.casio-education.fr/contenus ... raphiques/

18355Rendez-vous sur Planète Casio pour découvrir le deuxième jeu, GravityGuy, ici conçu par Lephe.
Image

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 20 Nov 2023, 10:51
by SlyVTT
Well Done.

Jolies contributions de TIP et de PC.
C'est sympa de voir qu'une forme de partenariat se met en place avec Casio Education autours de la journée du Jeu Video.

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 20 Nov 2023, 12:45
by parisse
Quelle est l'incompatibilité de gestion de l'interruption par AC/ON entre l'implémentation Casio et celle de MicroPython ?

Le code utilisé par Micropy est le suivant: on teste l'appui sur une touche tous les 128 appels (pour éviter de trop ralentir l'interpréteur en testant le clavier trop souvent), si la touche AC/ON est appuyée on renvoie une exception micropython (kbd_exception)
Code: Select all
#define MICROPY_VM_HOOK_LOOP micropython_port_vm_hook_loop();
...
void mp_keyboard_interrupt(void) {
  printf("Keyboard Intr\n");
  MP_STATE_VM(mp_pending_exception) = MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
}
...
int micropython_port_vm_hook_loop() {
  /* This function is called very frequently by the MicroPython engine. We grab
   * this opportunity to interrupt execution and/or refresh the display on
   * platforms that need it. */

  /* Doing too many things here slows down Python execution quite a lot. So we
   * only do things once in a while and return as soon as possible otherwise. */
  static int count=0;
  ++count;
  if ( (count & 0x7f) != 0x7f )
    return 1;
  short unsigned int key = PRGM_GetKey_();
  if (key == intr_key){
    if (!ctrl_c_py)
      printf("ACON pressed\n");
    ctrl_c_py += 1;
  }
  if (ctrl_c_py % 2)
    mp_keyboard_interrupt();
  else
    ctrl_c_py +=2;
  return 1;
}

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 20 Nov 2023, 13:57
by critor
parisse wrote:Quelle est l'incompatibilité de gestion de l'interruption par AC/ON entre l'implémentation Casio et celle de MicroPython ?

Je crois que lorsque l'on tape
AC/ON
, KhiCAS+Micropy génèrent non pas 1 exception mais une série d'exceptions.

Dans le cas d'Etiord, si je le lance sous KhiCAS/Micropy :
  • j'ai bien l'écran de présentation (juste avec quelques différences graphiques, détails que je n'ai pas encore gérés vu le problème plus embêtant qui va suivre)
    Image
  • je tape alors
    AC/ON
    pour continuer comme demandé
  • j'ai alors la boîte de saisie input() prévue pour le nombre de voitures à faire rentrer dans le prochain quartier
  • j'entre un nombre et valide avec
    EXE
  • et à ce moment-là le script s'interrompt alors que je n'ai pas retapé
    AC/ON
    , avec la boîte "Interrupted F1/F6: ok", et un KeyboardInterrupt dans la console

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 20 Nov 2023, 14:11
by critor
SlyVTT wrote:Well Done.

Jolies contributions de TIP et de PC.

Merci :)
SlyVTT wrote:C'est sympa de voir qu'une forme de partenariat se met en place avec Casio Education autours de la journée du Jeu Video.

En même temps, de façon générale, c'est bien triste mais qui fait des jeux vidéo Python pour calculatrices TI/Casio mis à part nous 1 à 2 fois par an ?
C'est bien dommage que nos jeunes ne s'y mettent pas sur TI/Casio, alors que les possibilités sont absolument remarquables, hautement supérieures à celles du langage interprété Casio/TI-Basic historique pour lequel des jeux sortent toujours.
Donc nous tentons de montrer les formidables possibilités, et surtout comment la chose est abordable et simple.

Graphiquement, Etiord, c'est :
  • un fond vert
  • des tuiles d'immeubles de différentes tailles compressées en RLE via le convertisseur en ligne img2calc.php qui de plus fournit la fonction d'affichage qui va avec
  • un sprite de voiture, juste affiché avec une palette variable de couleurs pour donner l'impression d'avoir des voitures différentes
  • des fill_rect() de gris (rectangles pleins) pour le bitume des rues
  • et des lignes blanches (fill_rect de faible épaisseur) pour le marquage au sol

Le moteur physique derrière, c'est juste un tableau (liste de listes) pour le plan d'un quartier, et des coordonnées non entières dedans pour les positions des voitures.

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 20 Nov 2023, 15:21
by SlyVTT
C'est vrai que c'est vraiment pas le langage le plus employé sur calculatrice.

Il constitue pourtant une jolie alternative aux divers BASIC qui sont simples mais globalement lents (sur Casio mais aussi sur TI).
Et évite de tomber dans la complexité du code natif (C ou Asm).

C'est bizarre qu'il ne prenne pas une meilleure place que cela.

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 20 Nov 2023, 15:31
by parisse
Alors, en effet, j'ai oublié de réinitialiser la variable ctrl_c_py dans la fonction qui génère l'exception. Mais une fois ça corrigé (j'ai mis micropy.g3a à jour sur ma page), j'ai une exception KeyboardInterrupt: générée par la ligne 346 dans draw_infos. Apparamment l'appel de
Code: Select all
MP_STATE_VM(mp_pending_exception) = MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));

ne semble pas produire une exception capturable par la ligne 347 except KeyboardInterrupt: pass malgré l'affichage qui correspond pourtant bien. Peut-être que Lephe pourrait me dire ce qu'il utilise pour que ça marche chez PythonExtra?

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 21 Nov 2023, 19:02
by parisse
j'ai remis à plat le gestionnaire d'interruption par ON en supprimant les syscalls (en utilisant du code qui scanne le clavier du wiki du prizm sdk). Ca ne résoud malheureusement pas le problème de etiord, on sort du programme après 2 ON, et je ne comprends pas pourquoi.

Mais ce n'est pas du temps perdu, car l'interpréteur MicroPython de micropy ou khicas est maintenant significativement plus rapide, sur une boucle faisant la somme des entiers de 1 à N, pour N=200000, c'est quasiment 3 fois plus rapide qu'avant (5 secondes environ avec le processeur en vitesse normale, avec le processeur accéléré, 3 secondes environ), à peu près 2 fois plus rapide que le Python de Casio.

Code: Select all
void mp_hal_set_interrupt_char(int c){ intr_key=c;}

const unsigned short* keyboard_register = (unsigned short*)0xA44B0000;
unsigned short lastkey[8];
unsigned short holdkey[8];

void keyupdate(void) {
  memcpy(holdkey, lastkey, sizeof(unsigned short)*8);
  memcpy(lastkey, keyboard_register, sizeof(unsigned short)*8);
}
int keydownlast(int basic_keycode) {
  int row, col, word, bit;
  row = basic_keycode%10;
  col = basic_keycode/10-1;
  word = row>>1;
  bit = col + 8*(row&1);
  return (0 != (lastkey[word] & 1<<bit));
}
int keydownhold(int basic_keycode) {
  int row, col, word, bit;
  row = basic_keycode%10;
  col = basic_keycode/10-1;
  word = row>>1;
  bit = col + 8*(row&1);
  return (0 != (holdkey[word] & 1<<bit));
}

// __attribute__((noinline))
int micropython_port_vm_hook_loop() {
  /* This function is called very frequently by the MicroPython engine. We grab
   * this opportunity to interrupt execution and/or refresh the display on
   * platforms that need it. */

  /* Doing too many things here slows down Python execution quite a lot. So we
   * only do things once in a while and return as soon as possible otherwise. */
  static int count=0;
  ++count;
  keyupdate();
  if ( (count & 0x7f) != 0x7f )
    return 1;
  if (keydownlast(intr_key)){
    mp_keyboard_interrupt();
    int key; GetKey(&key);
  }
  return 1;
}

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 22 Nov 2023, 09:18
by parisse
J'ai encore un peu modifié la gestion de l'exception, et maintenant on arrive à entrer le nombre de voitures, mais ça quitte après. Il semble que c'est la gestion du clavier par les syscalls dans le input() qui pose problème avec la gestion de l'exception clavier. Il faudrait que je me débarrasse complètement des syscalls pour la gestion du clavier...

Re: Jeux Python Etiord + GravityGuy pour Graph 90+E

Unread postPosted: 22 Nov 2023, 13:07
by parisse
En fait non, j'étais juste trop pressé...
J'ai modifié l'affichage, ça a l'air de marcher à peu près, j'ai mis à jour micropy et khicas.