Problème de jeux
AlpacinoNogeek
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
critou -
critou -
Bonjour,
Pour mon projet d'ISN je fait un jeux qui est le space invaders (modifié); le problème c'est qu'il me crée seulement un petit truc qui ressemble à un tir mais qu'il ne l'est pas, c'est définitivement mon seul problème (du moin que j'ai pas réglé) SVP HELP ! :'(
Pour mon projet d'ISN je fait un jeux qui est le space invaders (modifié); le problème c'est qu'il me crée seulement un petit truc qui ressemble à un tir mais qu'il ne l'est pas, c'est définitivement mon seul problème (du moin que j'ai pas réglé) SVP HELP ! :'(
from tkinter import * from random import * from tkinter.messagebox import* import time import sys from random import shuffle ytir=450 dyobus=10 tir=0 fenetre=Tk() fenetre.title('Licorne Invaders') fenetre.geometry("640x480") Fond=Canvas(fenetre,width=800,height=600,bg='black') Fond.place(x=0,y=0) fichier=PhotoImage(file="images/SPACE.gif") Fond.create_image(307,155,image=fichier) #Creation de la plateforme def creation_plateforme(): global plateforme,xplateforme1,yplateforme1 plateforme=[] xplateforme1=307 yplateforme1=450 plateforme.append(Fond.create_rectangle(xplateforme1,yplateforme1,xplateforme1+59,yplateforme1+17,fill='green')) # Fonction de deplacement de la plateforme def move_plateforme(dx): global xplateforme1,yplateforme1,drapeau,plateforme xplateforme1=xplateforme1+dx #Bordure gauche if xplateforme1<=35: xplateforme1=35 Fond.coords(plateforme[0],xplateforme1,yplateforme1,xplateforme1+60,yplateforme1+20) #Bordure droite elif xplateforme1>=550: xplateforme1=550 Fond.coords(plateforme[0],xplateforme1,yplateforme1,xplateforme1+60,yplateforme1+20) else: Fond.coords(plateforme[0],xplateforme1,yplateforme1,xplateforme1+60,yplateforme1+20) # Fonction de tir de laser def creation_tir(self): global xplateforme1,yplateforme1,tir,ytir,Tir,xtir if tir!=1 : tir=1 xtir=xplateforme1+30 ytir=yplateforme1 Tir=[(Fond.create_oval(xtir,ytir,xtir,ytir-35,fill='yellow',outline ='yellow'))] time.sleep(0.09) mouvement_tir() def mouvement_tir(): global Tir,tir,dyobus,ytir if len(Tir)==1: if tir==1: ytir=ytir-dyobus if ytir<=20: tir=0 Tir.destroy() #Assignement des touches pour le déplacement et le tir def right(event): move_plateforme(10) def left(event): move_plateforme(-10) fenetre.bind("<Key-Left>",left) fenetre.bind("<Key-Right>",right) fenetre.bind("<Key-space>",creation_tir) creation_plateforme() fenetre.mainloop() try: fenetre.destroy() except TclError: pass
1 réponse
Bonsoir.
Pour déplacer un item sur un canvas tkinter, tu as besoin d'utiliser la méthode move de canvas ainsi que de la méthode after de tkinter, il ne faut jamais utiliser de time.sleep dans les interfaces graphiques.
Un rapide exemple.
Il te faudra sans doute ajouter une temporisation, car si on reste appuyé sur la touche espace, l'écran sera rempli de tir.
Il faudrait aussi revoir ton code, éviter les import *, mais laisser les modules importés dans leurs espaces de noms, revoir ta compréhension du global, car tu l'utilises dans tes fonctions, alors que ce n'est pas nécessaire.
Pour déplacer un item sur un canvas tkinter, tu as besoin d'utiliser la méthode move de canvas ainsi que de la méthode after de tkinter, il ne faut jamais utiliser de time.sleep dans les interfaces graphiques.
Un rapide exemple.
import tkinter as tk import random fenetre = tk.Tk() fenetre.title('Licorne Invaders') space = tk.Canvas(fenetre, width=800, height=600, bg='black') space.pack() tirs = [] def creer_tir(event): x = random.randint(10, 790) tir = space.create_oval(x-5, 590, x+5, 600, fill='yellow', outline ='yellow') tirs.append(tir) def deplacer_tirs(): for tir in tirs: x, y, x2, y2 = space.coords(tir) if y2 > 0: space.move(tir, 0, -1) else: space.delete(tir) tirs.remove(tir) space.after(3, deplacer_tirs) space.after(3, deplacer_tirs) fenetre.bind('<Key-space>', creer_tir) fenetre.mainloop()
Il te faudra sans doute ajouter une temporisation, car si on reste appuyé sur la touche espace, l'écran sera rempli de tir.
Il faudrait aussi revoir ton code, éviter les import *, mais laisser les modules importés dans leurs espaces de noms, revoir ta compréhension du global, car tu l'utilises dans tes fonctions, alors que ce n'est pas nécessaire.
Ensuite j'ai essayé de le faire apparaître sur le x (en coordonné du joueur) mais il ne comprend pas
Merci encore
Lorsque je t'ai indiqué d'éviter d'utiliser les import * sur les modules importés, les raisons sont multiples, les principales étant qu'en faisant des import * :
- Tu pollues l'espace global de ton script.
- Si plusieurs modules ont une fonction, classe ou variable portant un même nom ou que tu déclares ta propre fonction avec un nom d'une fonction de modules importés, il y aura écrasement et forcément les problèmes qui en découleront.
- Garder les modules dans leurs propres espaces permet d'améliorer la lisibilité, cela est plus lisible et compréhensible d'écrire moduleTruc.fonctionTartuffe() que d'écrire fonctionTartuffe(), dans le 1er cas, on sait directement d'où vient cette fonction, alors que dans le 2nd cas, on ne sait pas d'où elle provient, fonction d'un module ? Lequel ? fonction personnelle ?
Mais tout ça, beaucoup de sites et didacticiels concernant python le relate bien mieux que moi.
En ce qui concerne ton utilisation de "global" dans tes fonctions, ce que je voulais dire c'est que la nécessité de mettre global sur toutes les variables externes à ta fonction n'est pas nécessaire et rend également difficilement lisible ton code.
Tu devrais relire un tutoriel sur la portée des variables en python, et en programmation.