Page 1 of 1

Test débutant jeu python

Unread postPosted: 10 Oct 2023, 19:08
by Altaear
Bonsoir à tous,
J'ai commencé à tâtonner avec python sur TI-Nspire pendant les cours pour essayer de créer un petit jeu.
Pour l''instant je fais des tests pour voir ce que je peux afficher à l'écran. Voila la bout de code que j'ai pondu :
Code: Select all
from ti_draw import *
from ti_system import *
from time import *

def draw_background():
  set_color(255,0,0)
  fill_rect(0,0,355,355)

x=0
y=0

key = ''
cur_dir = "none"
draw_background()

while get_key() != "esc":
  key = get_key()
  if key == '':
    cur_dir=cur_dir
  if key == '8':
    cur_dir = "up"
  if key == '2':
    cur_dir = "down"
  if key == '4':
    cur_dir = "left"
  if key == '6':
    cur_dir = "right"
 
  draw_background()
 
  if cur_dir == "up":
    y=y-1
  if cur_dir == "down":
    y=y+1
  if cur_dir == "right":
    x=x+1
  if cur_dir == "left":
    x=x-1
  set_color(0,255,255)
  fill_rect(x,y,40,40)


(Je ne sais pas si le balisage est en python).

Evidemment ce n'est pas du tout optimiser. Pour l'instant pour que la direction change je dois spam les touches car l'input n'est pas toujours detecté. Comment est ce que je pourrais écrire le code pour que la direction suis pris en compte avec une seule pression ?
Et comment je pourrais implémenter un système de collision avec les bords de l'écran ou d'autres bloc que j'aurais créé. J'aimerais aussi savoir comment utiliser les buffer et si il serait utile dans mon cas.

Re: Test débutant jeu python

Unread postPosted: 10 Oct 2023, 21:56
by critor
Bonsoir. Joli début. :)

Le buffer permet des affichages plus propres :
  • tes tracés sont effectués hors écran
  • c'est toi qui décides quand tu as terminé tes modifications et que tes derniers tracés peuvent être montrés
Cela évite les affichages intermédiaires ou clignotements.
C'est très simple :
  • un appel use_buffer() pour dire que tu souhaites utiliser le buffer hors écran
  • et un appel paint_buffer() à chaque fois que tu veux afficher les derniers changements

Voici ton code modifié pour l'utilisation du buffer :
Code: Select all
from ti_draw import *
from ti_system import *
from time import *

use_buffer()

def draw_background():
  set_color(255,0,0)
  fill_rect(0,0,355,355)

x=0
y=0

key = ''
cur_dir = "none"
draw_background()

while get_key() != "esc":
  key = get_key()
  if key == '':
    cur_dir=cur_dir
  if key == '8':
    cur_dir = "up"
  if key == '2':
    cur_dir = "down"
  if key == '4':
    cur_dir = "left"
  if key == '6':
    cur_dir = "right"

  draw_background()

  if cur_dir == "up":
    y=y-1
  if cur_dir == "down":
    y=y+1
  if cur_dir == "right":
    x=x+1
  if cur_dir == "left":
    x=x-1
  set_color(0,255,255)
  fill_rect(x,y,40,40)
  paint_buffer()


ti_draw t'offre la fonction get_screen_dim() qui te retourne les dimensions de la zone graphique de l'écran :
Image
Sur TI-Nspire CX II, c'est donc 318×212 pixels.
Plus qu'à tester lorsque ton rectangle atteint les bords de l'écran et dans ce cas stopper ou changer la direction.

Re: Test débutant jeu python

Unread postPosted: 10 Oct 2023, 22:07
by Bisam
Pour factoriser ton code, tu peux utiliser un dictionnaire.

Code: Select all
direction = {"8": "up", "2": "down", "4": "left", "6": "right"}
if key in direction:
  cur_dir = direction[key]


Pour qu'une seule pression suffise, tu peux rajouter une temporisation en faisant faire un certain nombre de boucles en espérant que getkey() renvoie quelque chose.

Re: Test débutant jeu python

Unread postPosted: 11 Oct 2023, 20:39
by Altaear
D'accord donc pour le buffer il faut utiliser la fonction use_buffer une première fois et ensuite chaque changement des éléments à l'écran est stocké dans la mémoire et il faut utiliser paint_buffer pour l'afficher si j'ai bien compris ? Et comment je fais si je veux le désactiver ? Quand j'avais fait un test avec le buffer j'avais utilisé use_buffer et une fonction draw après mais ça me l'avais affiché à l'écran sans que j'ai eu à utilisé le paint_buffer.
Ensuite merci pour les dictionnaires je me doute qu'un embranchement de if n'est pas très opti, mais je ne connais pas encore bien cette notion je verrais plus tard pour l'utiliser. Une dernière chose j'avais déjà utilisé la boucle while key == '' puis key = get key dedans juste après la première boucle mais cela me créait une boucle infini et aucun input n'étais jamais détecté (j'utilisais un print(key) pour voir ce que ça détectait).

Re: Test débutant jeu python

Unread postPosted: 11 Oct 2023, 21:01
by critor
Altaear wrote:D'accord donc pour le buffer il faut utiliser la fonction use_buffer une première fois et ensuite chaque changement des éléments à l'écran est stocké dans la mémoire et il faut utiliser paint_buffer pour l'afficher si j'ai bien compris ?

C'est ça. :)

Altaear wrote:Et comment je fais si je veux le désactiver ?

Pas sûr que le buffer puisse être désactivé en cours d'exécution. Une fois que use_buffer() a été appelé, à ma connaissance le nouveau mode de fonctionnement persiste jusqu'à la fin du script.

Re: Test débutant jeu python

Unread postPosted: 11 Oct 2023, 21:40
by Altaear
Parfait :) tout marche bien avec le dictionnaire j'ai juste du rajouter :
Code: Select all
else :
cur_dir = cur_dir


Je n'ai en effet plus de clignotement avec le buffer, mais peut être un problème de framerate (je ne sais pas si c'est lié ou pas). J'imagine que c'est lié au portage de python sur Nspire ou à la puissance de la calculatrice ?
Mais sinon je n'ai pas de solution pour la détection de key sans avoir à spam :/. La boucle while était infini et si mon programme boucle sur cette détection la position du cube ne sera pas actualisée...