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 :

Aide pour un déplacement aléatoire d'une balle dans un canevas.


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut Aide pour un déplacement aléatoire d'une balle dans un canevas.
    Bonjour, après de nombreuses tentatives infructueuses je m'en remets à vous.

    J'arrive à déplacer la balle sur les "parois" mais pas de manière aléatoire enfin j'y arrives mais la vitesse de la balle change aussi et ça me plaît pas

    Voici mon code:
    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
    from tkinter import *
     
    def move():
        global x, y, flag, dx, dy
     
        if x > 280 or x < 20:
            dx = -dx
        x += dx
     
        if y > 280 or y < 20:
            dy = - dy
        y += dy
     
        can.coords(ball, x-10, y-10, x+10, y+10)
     
        if flag > 0:
            fen.after(50, move)
     
    def start():
        global flag
     
        flag += 1
     
        if flag == 1:
            move()
     
    def stop():
        global flag
     
        flag = 0
     
    # Création des variables:
    x, y = 150, 280
    flag = 0
    dx, dy = 5, 5
     
    # Création de la fenêtre:
    fen = Tk()
    fen.title("Petit jeu avec Tkinter")
     
    # Création du canevas:
    can = Canvas(fen, bg= "light grey", width= 300, height= 300)
    can.grid(row= 2, column= 0)
     
    # Création de la balle:
    ball = can.create_oval(x-10, y-10, x+10, y+10, outline= "black", fill= "light blue")
     
    # Création du lien entre le souris et le canevas:
    can.bind("<Button-1>")
     
    # Création du label "Score":
    labScore = Label(fen, text= "Nombre de Points: 0")
    labScore.grid(row= 3, column= 0)
     
    # Création des boutons:
     
    # Création du bouton "Débuter la Partie":
    Button(fen, text= "Débuter la Partie", command= start).grid(row= 0, column= 0)
     
    # Création du bouton "Arrêter la Partie":
    Button(fen, text= "Arrêter la Partie", command= stop).grid(row= 1, column= 0)
     
    # Création du bouton "Quitter":
    Button(fen, text= "Quitter", command= fen.quit).grid(row= 4, column= 0)
     
    fen.mainloop()
    fen.destroy()
    J'ai essayé randrange, de trifouiller dx et dy mais je n'arrive jamais à ce que je veux à savoir que la trajectoire de la balle reste "fluide" et se modifie sans que cela influe sur la vitesse.

    Je remercie par avance la personne qui prendra le temps de me répondre parce que j'ai beau cherché je n'arrive à rien.

  2. #2
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    Si comme tu le dis, tu veux que la trajectoire de la balle reste fluide, alors dx et dy doivent rester nuls. Autrement dit la vitesse de ta balle ne doit pas changer. Tout ce qu il faut changer c est la direction de ta balle.
    Alors en supposant que la vitesse soit de 1 pixel par unite de temps. Une methode serait d imaginer un angle et de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     vx = cos(angle)
    vy = sin(angle)
    Et puis appliquer le deplacement ensuite.

    ++

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bonsoir, tout d'abord merci pour votre réponse qui est sans doute une très bonne solution malheureusement je suis un très gros débutant et malgré mon acharnement je n'ai pas réussi à faire ce que vous m'avez suggéré.

    En effet sois ma balle ne bouges plus ou alors elle "sautille" sur elle même ou bien elle se déplace de plus en plus vite

    Je vais encore essayer mais franchement tout ce que je fais s'avère être un échec.

    Si vous ou quelqu'un d'autre (je ne veux pas abuser de votre patience) pouvez m'apporter quelques indications supplémentaires cela m'aiderait énormément .

    Merci beaucoup.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bon, excepté le déplacement de la balle qui me plaît pas, une méthode d'augmentation de la vitesse à mon humble avis peu conventionnelle et un bug du bouton débuter la partie lorsqu'on clique sur celui ci pendant la partie ça marche

    Alors on sait jamais si quelqu'un à un peu de temps à perdre pour m'aider à corriger mes erreurs ou m'apporter des solutions alternatives je l'en remercie d'avance parce que j'ai le sentiment d'avoir bâclé cet exercice...

    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
    from tkinter import *
    from math import sin, cos
     
    def move():
        global x, y, flag, dx, dy, vx, ms
     
        if x > 280 or x < 20:
            dx = -dx
            vx = -vx
        x += dx
        x += vx
     
        if y > 280 or y < 20:
            dy = -dy
        y += dy
     
        can.coords(ball, x-10, y-10, x+10, y+10)
     
        if flag > 0:
            fen.after(ms, move)
     
    def clicBall(event):
        global x, y, score, flag, ms
     
        if flag == 1:
     
            if event.x >= x-10 and event.x <= x+10 and event.y >= y-10 and event.y <= y+10:
                score += 1
                ms -= 1
                labScore.configure(text= "Nombre de Points: "+str(score))
                gameOver()
     
    def gameOver():
        global score, flag
     
        if score == 5:
            labScore.configure(text= "Bravo! Score Final: "+str(score))
            stop()
     
    def start():
        global flag, ms
     
        flag += 1
     
        if flag == 1:
            labScore.configure(text= "Nombre de Points: "+str(score))
            ms = 6
            move()
     
    def stop():
        global flag, score
     
        flag = 0
        score = 0
     
    # Création des variables:
    x, y = 150, 280
    flag = 0
    dx, dy = 1, 1
    vx = cos(1)
    score = 0
    ms = 6
     
    # Création de la fenêtre:
    fen = Tk()
    fen.title("Petit jeu avec Tkinter")
     
    # Création du canevas:
    can = Canvas(fen, bg= "white", width= 300, height= 300)
    can.grid(row= 2, column= 0)
     
    # Création de la balle:
    ball = can.create_oval(x-10, y-10, x+10, y+10, outline= "black", fill= "light blue")
     
    # Création du lien entre le souris et le canevas:
    can.bind("<Button-1>", clicBall)
     
    # Création du label "Score":
    labScore = Label(fen, text= "Nombre de Points: 0")
    labScore.grid(row= 3, column= 0)
     
    # Création des boutons:
     
    # Création du bouton "Débuter la Partie":
    Button(fen, text= "Débuter la Partie", command= start).grid(row= 0, column= 0)
     
    # Création du bouton "Arrêter la Partie":
    Button(fen, text= "Arrêter la Partie", command= stop).grid(row= 1, column= 0)
     
    # Création du bouton "Quitter":
    Button(fen, text= "Quitter", command= fen.quit).grid(row= 4, column= 0)
     
    fen.mainloop()
    fen.destroy()

  5. #5
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    excuse moi pour le temps mis.
    Et fait l idee c est.
    A chaque lancement de la balle (en debut de partie ou apres une balle perdue) tu imagine un angle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import random
    angle = random.randrange(45,135)
    Et puis tu continue te sers tu cosinus de l angle:
    vx = cos(angle) * k
    vy = sin(angle) * k

    A plus.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Ok merci beaucoup pour votre réponse ça marche comme je veux bon tout n'est pas parfait mais Rome ne s'est pas faîte en un jour.

Discussions similaires

  1. Aide pour insérer des champs d'une requete dans une table
    Par salluste dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/06/2014, 02h48
  2. aide pour un exercice "deplacement d'une balle"
    Par darkness87 dans le forum Tkinter
    Réponses: 4
    Dernier message: 05/12/2010, 12h43
  3. Réponses: 7
    Dernier message: 12/06/2007, 14h59
  4. Erreur pour l'affichage aléatoire d'une image
    Par bellebiquette dans le forum Langage
    Réponses: 3
    Dernier message: 21/04/2006, 22h45
  5. Réponses: 2
    Dernier message: 20/09/2005, 15h10

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