Page 1 of 1

Tutoriel NumWorks: Exploiter à son plein potentiel keydown()

Unread postPosted: 18 Feb 2020, 16:29
by Dogm
Bonjour, :)

Hier la team Omega a sortie la mise à jour 1.19 tant attendue basé sur la beta d'Epsilon.:) Avec celle-ci une nouvelle fonction fort utile a été ajoutée : une fonction keydown() comparable au getkey() du Ti-basic.
Cette dernière étant fort utile pour créer de petits jeux-vidéo ou programmes interactifs. :#top#:

Ainsi, voici un petit tutoriel pour te permettre d'exploiter à son plein potentiel getkey() :).

Le tutoriel se découpera en 3 parties :

Sommaire :Go to top



Présentation :
Go to top


Tout d'abord, avant d'utiliser cette instruction il est nécessaire d'importer le nouveau module ion au début du programme dédié exclusivement à cette fonction : from ion import *

Cette fonction retourne True si la touche k est enfoncée à un instant T, il faudra donc inclure keydown() dans une boucle while de préférence pour bien capter touts les input de l'utilisateur.

Le code en pratique :

Code: Select all
from kandinsky import fill_rect
from ion import keydown

while 1:
  if keydown(KEY_SHIFT):
    fill_rect(0, 0, 320, 240, (255, 0 ,0))
  elif keydown(KEY_BACK):
    break


Explications : la boucle while se répète jusqu'à que la touche back (retour) soit enfoncée, de plus, si la touche shift est pressée un rectangle bleu occupant la totalité de l'écran apparait.

Attention ! Il faut toujours penser à inclure une touche pour quitter ton programme sinon l'utilisateur sera contraint de reset sa calculatrice, perdant ainsi tous ses scripts. :'(


Voici ci-dessous une liste des touches et de leurs correspondances dans le module ion :

Show/Hide spoilerAfficher/Masquer le spoiler













































Flèche gaucheKEY_LEFT
Flèche hautKEY_UP
Flèche basKEY_DOWN
Flèche droiteKEY_RIGHT
Touche OKKEY_OK
Touche maisonKEY_HOME
Touche retourKEY_BACK
Touche On/OffKEY_ONOFF
Touche shiftKEY_SHIFT
Touche alphaKEY_ALPHA
Touche x,n,tKEY_XNT
Touche varKEY_VAR
Touche boite à outilsKEY_TOOLBOX
Touche effacerKEY_BACKSPACE
Touche exponentielleKEY_EXP
Touche logarithme neperienKEY_LN
Touche logarithme decimalKEY_LOG
Touche i imaginaireKEY_IMAGINARY
Touche virguleKEY_COMMA
Touche puissanceKEY_POWER
Touche sinusKEY_SINE
Touche cosinusKEY_COSINUS
Touche tangenteKEY_TANGENT
Touche piKEY_PI
Touche racine carréKEY_SQRT
Touche carréKEY_SQUARE
Touche 7KEY_SEVEN
Touche 8KEY_EIGHT
Touche 9KEY_NINE
Touche parenthèse gaucheKEY_LEFTPARENTHESIS
Touche parenthèse droiteKEY_RIGHTPARENTHESIS
Touche 4KEY_FOUR
Touche 5KEY_FIVE
Touche 6KEY_SIX
Touche multiplicationKEY_MULTIPLICATION
Touche divisionKEY_DIVISION
Touche 1KEY_ONE
Touche 2KEY_TWO
Touche 3KEY_THREE
Touche plusKEY_PLUS
Touche moinsKEY_MINUS
Touche 0KEY_ZERO
Touche pointKEY_DOT
Touche 10 puissance de xKEY_EE
Touche ansKEY_ANS
Touche EXEKEY_EXE


Variations :
Go to top

Une petite variation :

Code: Select all
from kandinsky import fill_rect
from ion import keydown 

while True :
  if not keydown(KEY_SHIFT):
    fill_rect(0, 0, 320, 240,(255, 0, 0))
  elif keydown(KEY_BACK):
    break
  else:
    fill_rect(0, 0, 320, 240, (0, 0, 255)


Ici c'est l'inverse du programme précédant ; tant que la touche shift n'est pas pressée le programme affiche un rectangle rouge. En revanche, quand la touche shift est enfoncée le rectangle se colore en bleu.

Pour acquérir un nombre limité de touches dans un temps donné, on peut coupler une fonction keydown() à la fonction sleep() du module time.
Ce qui nous donne :

Code: Select all
from kandinsky import fill_rect
from time import slee
from ion import keydown

x = 100
y = 100

while 1:
  if keydown(KEY_LEFT):
    x-=10
  elif keydown(KEY_RIGHT):
    x+=10
  elif keydown(KEY_UP):
    y-=10
  elif keydown(KEY_DOWN):
    y+=10
  elif keydown(KEY_BACK):
    break

  fill_rect(x, y, 20, 20, (255, 0, 0,)
  sleep(0.1)


Ce script donne la possibilité de déplacer un carré rouge sur l'écran. :p
L'instruction sleep() en fin de boucle permet de mettre en pause le programme pendant 0.1 seconde ce qui est très utile pour limiter le nombre de touches acquises et ainsi ralentir ou fluidifier le déplacement de ton objet.


Optimisation :
Go to top


Pour gagner quelques octets, la NumWorks manquant cruellement de stockage, il peut être salutaire de ne pas écrire ==True pour chaque argument.
En effet, l'interpréteur python comprendra et exécutera sans erreur ton programme. :#top#:
De la même manière, il est possible d'écrire if keydown(k): ou if not keydown(k): à la place de ==False
Une autre technique d'optimisation simple mais très efficace consiste à écrire sur la même ligne les instructions qui suivent une condition.

Ainsi le code
Code: Select all
def Test():
  x=0
  return x

devient:
Code: Select all
def Test(): x=0; return x


Avec toutes ces optimisations le programme précédant ressemble à ceci :

Code: Select all
from kandinsky import *
from time import sleep
from ion import keydown

x = 100
y = 100


while 1:
  if keydown(KEY_LEFT): x-=10
  elif keydown(KEY_RIGHT): x+=10
  elif keydown(KEY_UP): y-=10
  elif keydown(KEY_DOWN): y+=10
  elif keydown(KEY_BACK): break
  fill_rect(x, y, 20, 20,(255, 0, 0))
  sleep(0.1)


Un trop grand nombre de conditions (if, elif et else) avec keydown() comme arguments peut alourdir ton programme et le rendre plus lent.

De manière générale, évites d'afficher un grand nombre d'éléments à l'écran, le frame buffer (fréquence de rafraichissement) de la NumWorks étant très lent. :#non#:


Voilà, désormais tu as toutes les clefs en main pour intégrer cette fonction dans tes programmes :#top#:, n'hésite pas à demander de l'aide ou des explications supplémentaires ou même partager tes programmes tirant parti de cette fonctionnalités ici. :)

Merci à A2drien, redgl0w et M4x1m3 de m'avoir relu et aidé à améliorer grandement ce tutoriel ! :)




-Tutoriel d'installation Omega
-Article sur la beta d'Epsilon 13 et les nouveautés d'Omega 1.19

Re: [Tutoriel] Exploiter à son plein potentielle keydown()

Unread postPosted: 18 Feb 2020, 18:57
by telpe51
Super tuto et bien utile pour faire des programmes interactifs !
Merci ! :D

Re: Tutoriel NumWorks: Exploiter à son plein potentiel keydo

Unread postPosted: 18 Feb 2020, 20:31
by Dogm
Merci, c'est un plaisir :)

Voici une adaptation pour Numworks du célèbre télécran réalisé avec getkey() faite par mes soins :D

Re: Tutoriel NumWorks: Exploiter à son plein potentiel keydo

Unread postPosted: 04 Apr 2020, 12:17
by telpe51
Encore merci @Dogm pour ton tuto. J'ai eu enfin (!) le temps de le tester ça marche super. :bj:
Je propose une variante de ton code qui bouge un carré rouge afin qu'il ne laisse plus de trace (façon "télécran") et qu'il se déplace vraiment.

Code: Select all
from ion import *
from kandinsky import *
from time import *

def depl_car(a=10):
  x,y=100,100
  x0,y0=x,y
  while 1:
    if keydown(KEY_LEFT):
      x0=x
      y0=y
      x-=10     
    elif keydown(KEY_RIGHT):
      x0=x
      y0=y
      x+=10
    elif keydown(KEY_UP):
      x0=x
      y0=y
      y-=10
    elif keydown(KEY_DOWN):
      x0=x
      y0=y
      y+=10
    elif keydown(KEY_BACK):
      break
    fill_rect(x0,y0,a,a,(255,255,255))
    fill_rect(x,y,a,a,(255,0,0))
    sleep(0.1)

Il faut appeler depl_car() ou depl_car(a) où a est la taille du carré (10 par défaut).
Je précise qu'il faut appuyer deux fois sur la touche "retour" pour sortir du programme (une fois pour interrompre le programme et une fois pour retourner à la console).
On pourrait encore l'améliorer en passant la couleur en paramètre par exemple ...
Et bien sûr on pourrait le condenser davantage, mais je trouve que ça serait moins lisible.

Re: Tutoriel NumWorks: Exploiter à son plein potentiel keydo

Unread postPosted: 04 Apr 2020, 15:37
by Dogm
Merci, c'est un plaisir. :)

T'as version est plus propre en effet, merci. :#top#:

Re: Tutoriel NumWorks: Exploiter à son plein potentiel keydo

Unread postPosted: 05 Apr 2020, 14:20
by Bisam
On peut quand même condenser ainsi, non ?
Code: Select all
    from ion import *
    from kandinsky import *
    from time import *

    def depl_car(a=10):
      x,y = 100,100
      while 1:
        x0,y0 = x,y
        if keydown(KEY_LEFT):  x -= 10     
        elif keydown(KEY_RIGHT):  x += 10
        elif keydown(KEY_UP):  y -= 10
        elif keydown(KEY_DOWN):  y += 10
        elif keydown(KEY_BACK):
          break
        fill_rect(x0,y0,a,a,(255,255,255))
        fill_rect(x,y,a,a,(255,0,0))
        sleep(0.1)

Re: Tutoriel NumWorks: Exploiter à son plein potentiel keydo

Unread postPosted: 07 Nov 2020, 11:44
by Fime
Merci pour ce tuto, qui est utile pour des debutants. J'avais vu l'utilisation de nombre à la place des variable de ion du type KEY_UP, du genre :
Code: Select all
if keydown(1):
   fonct()
au lieu de:
Code: Select all
if keydown(KEY_UP):
   fonct()