Problème de jeux

Fermé
AlpacinoNogeek Messages postés 12 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 2 mars 2020 - Modifié le 16 avril 2018 à 16:54
 critou - 17 avril 2018 à 19:42
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 ! :'(

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

A voir également:

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.

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.
0
AlpacinoNogeek Messages postés 12 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 2 mars 2020
17 avril 2018 à 14:40
Merci beaucoup, pour la tempo je pense savoir faire comment, mais je comprend pas "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
0
critou > AlpacinoNogeek Messages postés 12 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 2 mars 2020
17 avril 2018 à 19:42
Bonsoir.

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.
0