π
<-

Projet Python Grand oral

TI's micropython + modules

Projet Python Grand oral

Unread postby Altaear » 03 Jun 2024, 22:16

Hey, je fais un énième topic sur du python pour un jeu haha mais là c'est un petit projet qui éveille ma curiosité et que je pourrais utiliser comme exemple pour mon grand oral de maths.
Comme dans mes autres petits projets abandonnés j'essaie de faire un petit "game engine" (un peu prétentieux car c'est très simple et rudimentaire).
Dans un premier fichier pour tester un personnage en pixel art j'ai afficher les lignes une à une voir pixel par pixel. J'ai essayer de faire les choses proprement en définissant les couleurs au début, x et y sont centrer sur le personnage et 2 fonctions d'affichages.
Code: Select all
from ti_system import *
from ti_draw import *
from time import *
from sys import exit

red = (255,58,58)
yellow = (255,255,0)
belge = (255,222,140)
blue = (91,200,242)
dark = (0,0,0)

x,y = 150,110

def draw_background():
  use_buffer()
  set_color(red)
  fill_rect(0,0,318,220)

def draw_player():
  use_buffer()
  set_color(dark)
#
  draw_line(x-4,y-10,x+4,y-10)
  draw_line(x-5,y-9,x-5,y-9)
  draw_line(x+5,y-9,x+5,y-9)
  draw_line(x-7,y-8,x-6,y-8)
  draw_line(x+6,y-8,x+6,y-7)
  draw_line(x-7,y-7,x-7,y-7)
  draw_line(x+7,y-6,x+7,y-2)
  draw_line(x-8,y-6,x-8,y-2)
  draw_line(x-10,y-2,x-10,y-2)
  draw_line(x-9,y-1,x-9,y)
  draw_line(x-8,y+1,x-8,y+1)
  draw_line(x-7,y+2,x-7,y+3)
  draw_line(x-6,y+4,x-6,y+4)
  draw_line(x+9,y-2,x+9,y-2)
  draw_line(x+8,y-1,x+8,y)
  draw_line(x+7,y,x+7,y+1)
  draw_line(x+6,y+2,x+6,y+3)
  draw_line(x+5,y+4,x+5,y+4)
  draw_line(x+6,y+5,x+6,y+5)
  draw_line(x+7,y+6,x+7,y+6)
  draw_line(x+8,y+6,x+8,y+9)
  draw_line(x+7,y+9,x+7,y+9)
  draw_line(x+6,y+8,x+6,y+8)
  draw_line(x+5,y+7,x+4,y+7)
  draw_line(x+5,y+7,x+5,y+8)
  draw_line(x+6,y+8,x+6,y+10)
 
draw_background()
draw_player()


Comme je "draw" toutes les lignes et pixels un par un je me demandais si il était possible de passer par une matrice (12 lignes et 20 colonnes au hasard). Dans chaque indices indiquer la couleur du pixel à "draw" ex : [0, red, yellow, blue...., 0, 0]. Car sinon je doit changer de couleur pour chaque nouvelles lignes ou pixels.

J'ai ensuite créé une deuxième page pour tester la possibilité des déplacement avec un personnage simple. Un début de game_loop, pipeline_draw... Parce qu'avant de faire le graphisme le moteur doit être fonctionnel.
J'avais mis dans la game loop tout le bout de code de la fonction get_input et j'ai créer cette fonction pour que ça soit plus claire. Mais une fois dans cette fonction j'ai l'erreur suivante :

File "C:\Users\arihe\AppData\Roaming\Texas Instruments\TI-Nspire CX CAS Student Software\python\doc2\characte_test.py", line 43, in <module>
File "C:\Users\arihe\AppData\Roaming\Texas Instruments\TI-Nspire CX CAS Student Software\python\doc2\characte_test.py", line 17, in get_inputNameError: local variable referenced before assignment

J'ai essayer de me renseigner sur cette erreur mais je pensais avoir déclarer la variable avant de la lire dans mon programme.

Code: Select all
from time import *
from ti_system import *
from ti_draw import *
from sys import exit

x=159
y=110
game_loop= True
key = "test"
def draw_background():
  set_color(255,60,150)
  fill_rect(0,0,318,220)

def get_input():
  key=get_key()
  if key=="6":
    x=x+15
  if key=="4":
    x=x-15
  if key=="7":
    exit()
  if key=="9":
    game_loop=False

def draw_character():
  use_buffer()
  set_color(150,130,160)
  fill_rect(x,y,16,16)
  set_color(45,240,100)
  fill_rect(x-4,y+16,23,30)
  set_color(60,60,240)
  fill_rect(x-4,y+46,10,20)
  fill_rect(x+9,y+46,10,20)
  paint_buffer()

def draw_pipeline():
  draw_background()
  draw_character()

draw_pipeline()

while game_loop==True :
  get_input()
  if get_key()=="8":
    game_loop=False
  draw_pipeline()


Est ce que quelqu'un pourrait m'éclaircir sur le sujet ?

Une fois les déplacement du personnage fait je souhaiterais ajouter des sprites d'objet et des widgets.
Est ce que la POO serait utile ici ? Utiliser des class sur les différents type d'éléments à afficher ?Comment me renseigner pour l'utiliser proprement ?
Comme il y a pas mal de partie différentes dans mon programme est ce qu'il serait utile de "fractionner" le fichier ? Un avec les dessins des sprites, les widgets... Et si oui comment gérer ces fichiers dans la calculatrice ?

Ce projet de code sert à illustrer le problème du collectionneur de vignettes (somme d'espérances de variables aléatoires suivant une loi géométrique). Une question que je me suis réellement poser pour résoudre une interrogation sur des probas d'un jeu vidéo et ça me permettra de gagner quelques minutes en abordant du python.

Je ne finirai peut être pas ce projet s'il est trop ambitieux même si il me semble faisable.
J'imagine qu'il y a beaucoup de questions et que mon post est excessivement long j'en suis désolé.

Mais merci si quelqu'un à le temps de répondre à quelques unes de mes interrogations :).
User avatar
Altaear
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 55.5%
 
Posts: 17
Joined: 08 Sep 2019, 19:04
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Term

Re: Projet Python Grand oral

Unread postby critor » 04 Jun 2024, 07:45

Bonjour.

Merci pour ton remarquable exposé.

J'ai eu pour ma part une erreur assez claire :
Code: Select all
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Users\andre\AppData\Roaming\Texas Instruments\TI-Nspire CX CAS Premium Teacher Software\python\doc27\test.py", line 43, in <module>
  File "C:\Users\andre\AppData\Roaming\Texas Instruments\TI-Nspire CX CAS Premium Teacher Software\python\doc27\test.py", line 17, in get_input


Dans la fonction get_input(), tu tentes de modifier la valeur de la variable x avec x=x+15 ou x=x-15.
Par défaut, les seules variables auxquels tu as accès dans une fonction, sont des variables locales à la fonction en question.
Or aucune variable x n'est affectée avant cela dans la fonction en question, donc elle n'existe pas.

Ce que tu veux probablement faire, c'est modifier la valeur de la variable globale x, que tu as affectée en dehors du code de la fonction.
C'est parfaitement possible, mais il faut alors le préciser :
Code: Select all
def get_input():
  global x
  key=get_key()
  if key=="6":
    x=x+15
  if key=="4":
    x=x-15
  if key=="7":
    exit()
  if key=="9":
    game_loop=False


Et maintenant, ça marche :
Image
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 46.2%
 
Posts: 41896
Images: 15440
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Projet Python Grand oral

Unread postby Altaear » 04 Jun 2024, 10:40

Ahh très bien, oui j'ai déjà utiliser les variables globales dans une fonction mais je pensais que le problème venait de key et non x.
Merci beaucoup !
Et est ce qu'il y a un moyen de passer par les matrices pour draw les sprites ou je dois tout faire à la main pour les changements de couleur et le draw des pixels ou lignes ?
User avatar
Altaear
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 55.5%
 
Posts: 17
Joined: 08 Sep 2019, 19:04
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Term

Re: Projet Python Grand oral

Unread postby Larwive » 04 Jun 2024, 10:44

Altaear wrote:Une fois les déplacement du personnage fait je souhaiterais ajouter des sprites d'objet et des widgets.
Est ce que la POO serait utile ici ? Utiliser des class sur les différents type d'éléments à afficher ?Comment me renseigner pour l'utiliser proprement ?


Je pense que la POO ne serait pas très utile pour ton projet. Mais si tu veux essayer, tu peux au moins factoriser l'appel des méthodes avec un unique nom comme suit. La classe drawable est la classe parent et les classes character et obj1 sont aussi de type drawable par héritage (indiqué par la parenthèse (drawable)).

J'imagine que tu veux aussi pouvoir effacer pour déplacer tes personnages/objets donc j'ai mis une méthode erase. Il faudra que tu penses à remplacer les pass par ce qui te convient, sauf ceux de la classe drawable qui n'est là que pour donner un nom commun aux classes filles.

Code: Select all
class drawable():
    def __init__(self):
        # De quoi se souvenir de la position pour effacer ensuite ?
        pass

    def draw(self):
        pass

    def erase(self):
        # Si besoin
        pass


class character(drawable):
    def __init__(self):
        super().__init__()

    def draw(self):
        # ton draw_character
        pass

    def erase(self):
        # si besoin
        pass


class obj1(drawable):
    def __init__(self):
        super().__init__()

    def draw(self):
        # ton draw_obj1
        pass

    def erase(self):
        # si besoin
        pass

# Pour une utilisation comme ça
charac = character()
charac.draw()
charac.erase()

# Ou pour tout faire d'un coup
drawings = [character(), obj1()]

for obj in drawings:
    obj.draw()


Si t'as des questions sur la POO, on est là. Surtout sur les paramètres des __init__. :)

Altaear wrote:Comme il y a pas mal de partie différentes dans mon programme est ce qu'il serait utile de "fractionner" le fichier ? Un avec les dessins des sprites, les widgets... Et si oui comment gérer ces fichiers dans la calculatrice ?

Bonne question. Je n'ai jamais essayé sur calculatrice. Ça te permettrait de naviguer plus rapidement entre tes lignes de code mais il faut bien gérer les imports.


Altaear wrote:Je ne finirai peut être pas ce projet s'il est trop ambitieux même si il me semble faisable.
J'imagine qu'il y a beaucoup de questions et que mon post est excessivement long j'en suis désolé.


T'inquiète.
Je dis que je ne dis rien, à part que mes programmes sont disponibles ici. Image

En mettant à profit mes pouvoirs de devin, sachant que j'ai écrit ma signature bien avant ta venue, ton pseudo est ClaudeBot [spider].:whistle:
User avatar
LarwiveProgrammeur
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 89.6%
 
Posts: 283
Images: 20
Joined: 25 Oct 2018, 17:41
Location: Chez moi
Gender: Male
Calculator(s):
MyCalcs profile
Class: Classe comme jamais.
GitHub: Larwive

Re: Projet Python Grand oral

Unread postby critor » 04 Jun 2024, 14:12

Altaear wrote:Et est ce qu'il y a un moyen de passer par les matrices pour draw les sprites ou je dois tout faire à la main pour les changements de couleur et le draw des pixels ou lignes ?

C'est-à-dire ? Faire une boucle pour allumer un par un tous les pixels avec la couleur inscrite dans la matrice ?

Parce que pour le genre de sprite que tu affiches, c'est plus optimal d'appeler juste quelques fill_rect() comme tu fais déjà.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 46.2%
 
Posts: 41896
Images: 15440
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Projet Python Grand oral

Unread postby Altaear » 04 Jun 2024, 17:09

Oui pour la POO il faudrait que je m'y mette sérieusement pour pouvoir l'implémenter dans mon code parce qu'il me parait très impropre. J'en ai fait il y a longtemps ou alors ce n'étais que du bricolage avec des bouts de code. Même sans la POO je pense qu'il pourrait pas mal être factorisé. Ensuite pour le déplacement/suppression le réaffiche complètement une nouvelle image par dessus l'arrière puis le character. Bon j'ai un peu avancer mais c'est superficiel, j'ai juste rajouté des collisions contre les murs et géré le framerate pour qu'il affiche une nouvelle image uniquement quand un input est rentré pour qu'il ne la recalcul pas à chaque fin de boucle.

Code: Select all
from time import *
from ti_system import *
from ti_draw import *
from sys import exit

new_frame = True
x=159
y=110
game_loop= True
key = ""

def draw_background():
  set_color(255,60,150)
  fill_rect(0,0,318,220)

def get_input():
  global key,x,y,game_loop,new_frame
  key=get_key()
  if key=="6":
    x=x+15
    new_frame=True
  if key=="4":
    x=x-15
    new_frame=True
  if key =="8":
    y=y-20
    new_frame=True
  if key=="2":
    y=y+20
    new_frame=True
  if key=="7":
    exit()
  if key=="9":
    game_loop=False
  if key=="":
    new_frame=False

def collision_check():
  global x,y
  if x<3:
    x=3
  elif x>300:
    x=300
  if y>150:
    y=150
  elif y<0:
    y=0

def draw_character():
  use_buffer()
  set_color(150,130,160)
  fill_rect(x,y,16,16)
  set_color(45,240,100)
  fill_rect(x-4,y+16,23,30)
  set_color(60,60,240)
  fill_rect(x-4,y+46,10,20)
  fill_rect(x+9,y+46,10,20)
  paint_buffer()

def draw_pipeline():
  global new_frame
  if new_frame==True:
    draw_background()
    draw_character()

draw_pipeline()

while game_loop==True :
  get_input()
  collision_check()
  draw_pipeline()


J'ai commencé l'affichage d'un inventaire avec carré de sélection dans un autre fichier même si je ne n'ai pas encore eu le temps d'aller très loin.
Ensuite pour l'utilisation de la matrice c'est parce que je me demandais si ce n'était pas plus pratique de faire une matrice pour placer et coloré les pixel en fonction de leur indices; plutôt que de choisir les coordonnées de x,y des lignes et changer la couleur à chaque fois. C'est très long de le faire à la main après je ne sais pas si c'est mieux optimisé. Surtout si je veux afficher d'autres sprites un système avec des matrices serait plus pratique pour en créer plus sans le faire à la main. Mais comme dit j'avance des choses que je ne maitrise pas bien.
User avatar
Altaear
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 55.5%
 
Posts: 17
Joined: 08 Sep 2019, 19:04
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Term

Re: Projet Python Grand oral

Unread postby Altaear » 04 Jun 2024, 17:11

Ah et je précise que je fais tout directement sur la calculatrice mdr.
User avatar
Altaear
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 55.5%
 
Posts: 17
Joined: 08 Sep 2019, 19:04
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Term


Return to Python

Who is online

Users browsing this forum: ClaudeBot [spider] and 1 guest

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Reprise de ton ancienne fx-92 Collège ou Graph 25/35/90 à 3€ peu importe son état. Même non fonctionnelle et donc invendable, même ancienne Graph 35 non conforme aux programmes (pas de Python), même ancienne Graph 25/35 inutilisable aux examens (pas de mode examen) et donc invendable. Etiquette de retour fournie, pas de frais de port à payer.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
12345
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1014 utilisateurs:
>987 invités
>17 membres
>10 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)