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 :

Création d'un jeu type « Geometry Dash »


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Création d'un jeu type « Geometry Dash »
    Bonjour, je suis depuis quelques mois sur la création d'un petit jeu du style "geometry dash" et je me sens coincé sur mon programme. Peut être par manque de connaissances je ne sais pas, quoi qu'il en soit je suis un peu désespérer. Voici le code de mon programme actuellement

    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
    from threading import Thread as thread
    from tkinter import *
    import time
    from random import *
    #thread 1
    def saut(event):
        canv.update()
        if y2!=190:
            return
        else:
            for n in range(0,40):
                if n<=19:
                    time.sleep(0.05)
                    canv.move('obstacle',0,-1)
                    canv.update()
                else:
                    time.sleep(0.05)
                    canv.move('obstacle',0,1)
                    canv.update()
     
     
    #thread2
    def go(n):
        for n in range(0,900):
            time.sleep(0.05)
            canv.move('sol',-1,0)
            canv.update()
     
    def bind(i):
        while 1:
            fen_jeu.bind("<space>",saut)
     
    #fenetre de jeu
    fen_jeu=Tk()
    fen_jeu.title("interface")
    fen_jeu.geometry('600x400+400+200')
    liste=['grey','red','grey','grey','grey','grey','grey','grey','grey','grey','grey','blue']
    canv=Canvas(fen_jeu,width=200,height=200)
    canv.pack()
    y1=190
    y2=y1+10
    for i in range (0,900):
        x1=i*10
        x2=x1+10
        f3=canv.create_rectangle((x1,y1,x2,y2),fill=liste[randint(0,10)],tag="sol")
     
     
     
    x1=20
    x2=x1+8
    y1=182
    y2=y1+8
    f2=canv.create_rectangle((x1,y1,x2,y2),fill=liste[11],tag="obstacle")
     
    for i in range(1):
        t=thread(target=bind,args=(i,)) 
        u=thread(target=go,args=(i,))
        u.start()
        t.start()
     
     
     
     
    fen_jeu.mainloop()
    Pour vous expliquez un peu mes problèmes et donc la ou je suis bloqué :
    1 - je dois créer un parcours d obstacle si possible aléatoire mais coherent qui se comporte comme le "sol"
    2 - je dois ajouter la gravité au personnage pour qu'il redescende sur "l'obstacle" ou le "sol"
    3 - je dois ajouter un "game over" quand le personnage touche le "sol rouge" ou quand il touche le coté d un "obstacle"

    J'avoue que cela fait pas mal de temps que je suis bloqué a ce moment je me sens un peu désespéré j'ai fait beaucoup de recherche mais je n'ai jamais réussi. Désolé si cela vous parait simple ou que mon code vous parait mauvais mais je ne suis qu'un débutant de terminale.
    Merci par avance pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Mélanger les threads avec tkinter n'est pas une bonne idée.
    Vous manquez probablement de technique. Maîtriser la POO vous aiderait surement à y voir plus clair.
    Je peux vous proposer la même chose avec quelques astuces.

    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
    import tkinter as tk
    import random
     
    def sol_move(delay=300):
        canvas.move('sol', -10, 0)
        iid = sol_items.pop(0)
        canvas.coords(iid, 190, 190, 200, 200)
        color = random.choice(COLORS)
        canvas.itemconfigure(iid, fill=color)
        sol_items.append(iid)
        root.after(delay, sol_move)
     
    inprogress = False
    def sauter(e=None):
     
        global inprogress
        if inprogress:
            return
        inprogress = True
     
        def gen_move():
            for n in range(20):
                if n <= 9:
                    yield -1
                else:
                    yield 1
     
        g_move = gen_move()
     
        def _saut(delay=200):
            global inprogress
     
            try:
                direction = next(g_move)
                canvas.move('obstacle', 0, direction * 2)
                root.after(delay, _saut)
            except StopIteration:
                inprogress = False
     
        _saut()    
     
     
     
    root = tk.Tk()
    root.geometry('600x400+400+200')
    canvas = tk.Canvas(root, width=200, height=200, bg='grey90')
    canvas.pack()
    COLORS=['grey','red','grey','grey','grey','grey','grey','grey','grey','grey','grey']
    sol_items = []
    y0 = 190
    y1 = y0 +10
    for i in range(20):
        x0 = i*10
        x1 = x0 + 10
        color = random.choice(COLORS)
        iid = canvas.create_rectangle(x0, y0, x1, y1, fill=color, tag='sol')
        sol_items.append(iid)
     
    sol_move()
     
    x1=20
    x2=x1+8
    y1=182
    y2=y1+8
    f2=canvas.create_rectangle(x1,y1,x2,y2,fill='blue',tag="obstacle")
    root.bind("<space>",sauter)  
    tk.mainloop()
    Le "sol" est une (petite) liste d'items (sol_items) qui se déplacent sur la gauche. Plutôt que de créer pleins de rectangle, à chaque déplacement à gauche, on déplace le premier élément de la liste à la fin.
    Pour le déplacement d’obstacle vers le haut puis vers le bas, se contraindre à utiliser de callbacks impose la sauvegarde de l'état courant quelque part, histoire de savoir ou on en est au coup suivant. La magie est dans le generator gen_move.

    Bonne lecture.

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

Discussions similaires

  1. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38
  2. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  3. [Kylix] besoin d'aide pour installer kylix3
    Par Sph@x dans le forum EDI
    Réponses: 3
    Dernier message: 11/02/2004, 13h53
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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