IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Déplacement d'un sprite & réaffichage complet d'un Canvas après modification de variables


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut Déplacement d'un sprite & réaffichage complet d'un Canvas après modification de variables
    Bonjour,
    je pose donc 2 questions qui pour moi sont liées. Merci de ne pas taper s'il faut faire autrement.

    Pour apprentissage de langage évolué je cherche à réaliser l'exemple bateau d'un labyrinthe.
    Pour l'instant cela s'affiche normalement avec le code suivant :

    Le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Affiche un labyrinthe avec énnemis et trésors
    # Affiche l'avatar du joueur et le déplace
     
    from tkinter import *
    import M_Lab_03
     
    if __name__ == "__main__" :
        fenetre = Tk()     # a faire avant d'affecter une image (ici pour perso)
        fenetre.title("Labyrinthe graphique avec le héro qui se déplace") 
     
        perso = {                           # ensemble des données du personnage
            "sprite" : PhotoImage(file = "sprites/tux.png"),   # son avatar
            "pieces" : 0,                   # nombre de pièces d'or
            "vie" : 25,                     # nombre de points de vie restant
            "niveau" : 1,                   # numéro du niveau actuel
            "colonne" : 1,
            "ligne" : 1}                    # colonne + ligne = position du joueur
        niveau_max : 3
     
        lab_actuel = M_Lab_03.charge_lab("level_1")
        (toile, perso, sprites) = M_Lab_03.aff_lab(lab_actuel, fenetre, perso)
        M_Lab_03.config_touches(lab_actuel, toile, fenetre, perso)
        fenetre.mainloop()
    Le module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    from tkinter import *
    
    def charge_lab(nom):
        """
            Charge le labyrinthe depuis le fichier nom.txt
    
            nom : nom du fichier sans l'extension .txt
    
            retour
                liste contenant le labyrinthe
        """
        try :
            fichier = open(nom + ".txt" , "r")
            datas = fichier.readlines()
            fichier.close()
        except IOError :
            print("Impossible de lire le fichier {}.txt".format(nom))
            exit(1)
            
        for i in range(len(datas)):
            datas[i] = datas[i].strip() # retire les caracteres inutiles
        return  datas                   # au debut et a la fin de la ligne 
    
    def aff_lab(lab, fenetre, perso):
        """
            Affichage d'un labyrinthe
            
            lab : liste contenant le labyrinthe
    
            retour : tuple contenant la toile et les sprites
        """
        # Rq : la taille des sprites pourrait être un paramètre
        toile = Canvas(fenetre, width = 600, height = 600)
        coin    = PhotoImage(file = "sprites/angle.png")
        mur_h   = PhotoImage(file = "sprites/mur_h.png")
        mur_v   = PhotoImage(file = "sprites/mur_v.png")
        sol     = PhotoImage(file = "sprites/sol.png")
        sortie  = PhotoImage(file = "sprites/sortie.png")
        ennemi  = PhotoImage(file = "sprites/ennemi.png")
        tresor  = PhotoImage(file = "sprites/coffre_ferme.png")
    
        n_ligne = 0
        for ligne in lab :
            n_col = 0
            for car in ligne :
                if car == "+" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = coin)
                if car == "-" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = mur_h)
                if car == "|" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = mur_v)
                if car == " " and (n_col != perso["colonne"] or n_ligne != perso["ligne"]) :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = sol)
                if car == " " and (n_col == perso["colonne"] and n_ligne == perso["ligne"]) :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = perso["sprite"]) 
                if (car == "1" or car == "2" or car == "3") and (n_col != perso["colonne"] or n_ligne != perso["ligne"]) :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = tresor)
                if (car == "1" or car == "2" or car == "3") and (n_col == perso["colonne"] and n_ligne == perso["ligne"]) :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = perso["sprite"])
                if car == "$" and (n_col != perso["colonne"] or n_ligne != perso["ligne"]) :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = ennemi)
                if car == "$" and (n_col == perso["colonne"] and n_ligne == perso["ligne"]) :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = perso["sprite"])
                if car == "S" :
                    toile.create_image(n_col*30, n_ligne*30, anchor = NW, image = sortie)
                n_col += 1
            n_ligne += 1
        toile.pack()
        return (toile, perso, {
            "coin" : coin,
            "mur_h" : mur_h,
            "mur_v" : mur_v,
            "sol" : sol,
            "sortie" : sortie,
            "ennemi" : ennemi,
            "tresor" : tresor})
    
    def deplacement(event,fenetre,toile,dep,lab,perso):
        n_cols = len(lab[0])    # nombre de colonnes = nombre de caractères de la première ligne
        n_lignes = len(lab)     # nombre de lignes = nombre d'éléments de la liste lab
        colonne = perso["colonne"]
        ligne = perso["ligne"]
        if dep == "droite" :
            colonne = colonne + 1
        if dep == "gauche" :
            colonne = colonne - 1
        if dep == "haut" :
            ligne = ligne - 1
        if dep == "bas" :
            ligne = ligne + 1
        # Vérification
        if ligne < 0 or ligne > n_lignes - 1 or colonne < 0 or colonne > n_cols - 1 :
            return None
        if lab[ligne][colonne] == " " :
            perso["colonne"]=colonne
            perso["ligne"]=ligne
        toile.coords(perso["sprite"], colonne * 30, ligne * 30)
        toile.create_image(colonne*30, ligne*30, anchor = NW, image =perso["sprite"]) 
    
    def quitter(event,fenetre):
        fenetre.destroy()
    
    def config_touches(lab_actuel, toile, fenetre, perso):
        fenetre.bind("<Right>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"droite",l,p))
        fenetre.bind("<Left>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"gauche",l,p))                 
        fenetre.bind("<Up>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"haut",l,p))
        fenetre.bind("<Down>", lambda event, f = fenetre, t = toile, l = lab_actuel, p = perso : deplacement(event,f,t,"bas",l,p))
        fenetre.bind("<q>", lambda event, f = fenetre : quitter(event,f))
        fenetre.bind("<Q>", lambda event, f = fenetre : quitter(event,f))
    En rouge le déplacement du sprite du joueur avec la première ligne recopiée d'un magasine qui ne fonctionne pas et la deuxième ligne ma "correction"

    Pourquoi la ligne modifiant les coordonnées ne fonctionne pas. La deuxième ligne semble montrer que les paramètres sont bien passés.

    Même si j'arrive (grâce à vous ) à faire fonctionner le changement de coordonnées, je pense que cela ne va pas m'aider pour plus tard. En effet je voudrais pouvoir modifier le labyrinthe (la liste de strings) pour modifier le coffre s'il est ouvert par exemple. J'aimerais bien pouvoir rafraichir l'ensemble de l'affichage après un mouvement (pas forcément tous). De toute façon il faudra bien afficher entièrement un nouveau niveau.

    Merci d'avance et désolé pour la longueur du message.
    Sylvain.
    level_1.txt level_2.txt level_3.txt

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par SPC89 Voir le message
    Pourquoi la ligne modifiant les coordonnées ne fonctionne pas.
    La vraie question serait plutôt pourquoi voulez vous qu'elle fonctionne...
    Lorsque vous demandez à Python d'exécuter l'instruction toile.coords(perso["sprite"], colonne * 30, ligne * 30) êtes vous sûr que le premier argument doive être une instance de PhotoImage?
    Pour comprendre comment fonctionne un Canvas (ou n'importe quoi d'autre), çà serait mieux de commencer par écrire des codes d'exemples plutôt que de partir bille en tête dans l'écriture de votre programme:
    • créer un Canvas,
    • afficher une image,
    • créer un Button qui la déplace de 10 dans une direction,

    Si vous avez besoin d'aide, çà fera moins de code à poster...
    Et moins de code à ré-écrire car une fois compris comment çà fonctionne, vous n'allez sans doute pas coder les choses de la même façon...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Pour comprendre comment fonctionne un Canvas (ou n'importe quoi d'autre), çà serait mieux de commencer par écrire des codes d'exemples plutôt que de partir bille en tête dans l'écriture de votre programme:
    - W
    Le soucis c'est que c'est un exemple et que je l'ai trouvé plusieurs fois sur internet et c'est ce qui est écrit dans le gnu/linux magasine.
    Mon code à moi y marche.

    Bon je vais essayer de chercher encore mais pas vraiment de résultat sur la recherche canvas.coords().
    De plus cela ne va toujours pas résoudre mon problème de rafraichissement.

    Sylvain.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par SPC89 Voir le message
    Bon je vais essayer de chercher encore mais pas vraiment de résultat sur la recherche canvas.coords().
    Vous n'avez pas besoin de chercher, juste ouvrir votre documentation tkinter préférée au chapitre Canvas et coder de petits exemples qui s'approchent de ce que vous voulez faire dans votre programme.

    Citation Envoyé par SPC89 Voir le message
    De plus cela ne va toujours pas résoudre mon problème de rafraichissement.
    Il faut commencer par (comprendre comment) réaliser:
    • créer une liste de figures (un carré rouge, un cercle vert),
    • les détruire
    • créer une autre liste de figures.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Déplacement d'un sprite
    Par Jyhem dans le forum Débuter
    Réponses: 9
    Dernier message: 19/06/2009, 19h54
  2. Réponses: 21
    Dernier message: 01/03/2009, 23h41
  3. déplacement d'un sprite
    Par Mindiell dans le forum Développement 2D, 3D et Jeux
    Réponses: 13
    Dernier message: 23/09/2007, 13h58
  4. Réponses: 10
    Dernier message: 03/03/2007, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo