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 :

Collisions avec un objet en mouvement


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Par défaut Collisions avec un objet en mouvement
    Bonjour à tous, je débute sur python et voici un essai de ce que j'ai fais, le problème c'est que je voudrais que la balle noire réagisse quand elle touche les barres du milieu pour passer d'un coté ou de l'autre de l'écran, comme quand elle touche l'une des limites du caneva

    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
    from tkinter import *
    import tkinter as Tk
    from math import sin, cos
     
    def move():
     
        global x, y, flag, dx, dy, vx, ms
     
        if x > 1275 or x < 30 :
     
            dx = -dx
            vx = -vx
        x += dx
        x += vx
     
        if y > 580 or y < 30:
            dy = -dy
        y += dy
     
        can.coords(ball, x-10, y-10, x+10, y+10)
        if flag > 0:
            fen.after(ms, move)
     
     
    def start():
        global flag, ms
     
        flag += 1
     
        if flag == 1:
            ms = 6
            move()
     
     
    def Mouvement_curseur(event):
        X = event.x # détecte la position de la souris en x 
        Y = event.y # détecte la position de la souris en x 
     
        title = "Dispatch Ball, Positions du curseur de la souris X = %d  Y = %d" % (X, Y)
        fen.title(title)
     
     
    # limite des carrées dans la zone de jeu
        if Y<60: # l'ordonnée de la barre ne peut aller à moins de 60 
            Y=60 # lorsque y de la souris atteint moins de 60 alors l'ordonnée de la barre stagne à 60
        if Y>540: # l'ordonnée de la barre ne peut aller à plus de 540
            Y=540 # lorsque y de la souris atteint plus de 640 alors l'ordonnée de la barre stagne à 540
     
     
     
     
    # mise à jour de la position de l'objet
        can.coords(carre_noir_bas,640,Y+50,660,590)
        can.coords(carre_noir_haut,640,11,660,Y-50)
     
    flag = 0
    x, y = 500, 300
    dx, dy = 2, 2
    vx=cos(45)
     
    # carré bas du milieu #
     
    xnoir_bas_gauche = 640
    ynoir_bas_gauche = 408
    xnoir_bas_droite = 660
    ynoir_bas_droite = 590
     
    # carré haut du milieu #
     
    xnoir_haut_gauche = 640
    ynoir_haut_gauche = 11
    xnoir_haut_droite = 660
    ynoir_haut_droite = 272
     
    #titre fenêtre
     
    fen = Tk.Tk()
    fen.title(" Dispatch Ball ")
     
    Largeur = 1300
    Hauteur = 600
    can = Tk.Canvas(fen, bg= "white", width= Largeur, height= Hauteur)
    can.grid(row= 3, column= 0)
     
    ball = can.create_oval(x-10, y-10, x+10, y+10, outline= "black", fill= "black")
     
    carre_noir_bas = can.create_rectangle(640, 408, 660, 590, outline= "maroon", width = 2, fill= 'gray')
    carre_noir_haut = can.create_rectangle(640, 10, 660, 272, outline= "maroon", width = 2, fill= 'gray')
     
    #Liaison entre événement et fonction
    can.bind('<Motion>', Mouvement_curseur) # Motion correspond à la detection instantané de la position de la souris
     
    # Création du bouton "Débuter la Partie":
    bouton=Button(fen, text= "Débuter la Partie", command= start).grid(row= 0, column= 0)
     
     
    fen.mainloop()
    si le code n'est pas très clair dites le moi c'est vrai que je n'ai pas mis beaucoup d'information dessus

    je pense que le problème viens du fait que j'ai définit les positions y des barres par des valeurs et que je l'ai définit aussi par : la position de la souris +/- 50

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Vous ne contrôlez pas les mouvements déclenches par l'utilisateur.
    Par contre, vous contrôlez ceux de la balle.
    Pourquoi ne pas essayer de détecter la collision dans le "move" de la balle?

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

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Par défaut
    Oui c'est vrai mais j'y ais déjà pensé voilà ce que ça donne (désolé pour la longueur de la ligne de code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if x > 1275 or x < 30 or (ynoir_haut_gauche<y-10<ynoir_haut_droite and xnoir_haut_gauche<x-10<xnoir_haut_droite) or (ynoir_haut_gauche<y+10<ynoir_haut_droite and xnoir_haut_gauche<x+10<xnoir_haut_droite) or (ynoir_bas_gauche<y-10<ynoir_bas_droite and xnoir_bas_gauche<x-10<xnoir_bas_droite) or (ynoir_bas_gauche<y+10<ynoir_bas_droite and xnoir_bas_gauche<x+10<xnoir_bas_droite):
    en fait on annonce les "endroits" où la balle ne doit pas aller sauf que ynoir_haut_droite et ynoir_bas_gauche change en fonction des mouvements de la souris donc comment je peux dire ça parce que si je change les 2 valeurs cités plus haut par Y+50 et Y-50, python m'affiche ce message d'erreur "unsupported operand type(s) for -: 'str' and 'int' "

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Bonne question!
    Mais si vous ne montrez pas le code complet, on pourrait "conjecturer" sur tout et n'importe quoi sans mettre le doigt sur le piège dans lequel vous vous êtes fourré.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 10
    Par défaut
    Bonjour,
    Voici le code complet

    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
    from tkinter import *
    import tkinter as Tk
     
    from math import sin, cos
     
    def move():
     
        global x, y, flag, dx, dy, vx, ms
     
        if x > 1275 or x < 30 or (ynoir_haut_gauche<y-10<ynoir_haut_droite and xnoir_haut_gauche<x-10<xnoir_haut_droite) or (ynoir_haut_gauche<y+10<ynoir_haut_droite and xnoir_haut_gauche<x+10<xnoir_haut_droite) or (ynoir_bas_gauche<y-10<ynoir_bas_droite and xnoir_bas_gauche<x-10<xnoir_bas_droite) or (ynoir_bas_gauche<y+10<ynoir_bas_droite and xnoir_bas_gauche<x+10<xnoir_bas_droite):
     
     
            dx = -dx
            vx = -vx
        x += dx
        x += vx
     
        if y > 580 or y < 30:
            dy = -dy
        y += dy
     
        can.coords(ball, x-10, y-10, x+10, y+10)
        if flag > 0:
            fen.after(ms, move)
     
     
    def start():
        global flag, ms
     
        flag += 1
     
        if flag == 1:
            ms = 6
            move()
     
     
    def Mouvement_curseur(event):
        X = event.x # détecte la position de la souris en x 
        Y = event.y # détecte la position de la souris en x 
     
        title = "Dispatch Ball, Positions du curseur de la souris X = %d  Y = %d" % (X, Y)
        fen.title(title)
     
     
    # limite des carrées dans la zone de jeu
        if Y<60: # l'ordonnée de la barre ne peut aller à moins de 60 
            Y=60 # lorsque y de la souris atteint moins de 60 alors l'ordonnée de la barre stagne à 60
        if Y>540: # l'ordonnée de la barre ne peut aller à plus de 540
            Y=540 # lorsque y de la souris atteint plus de 640 alors l'ordonnée de la barre stagne à 540
     
     
     
     
    # mise à jour de la position de l'objet
        can.coords(carre_noir_bas,640,Y+50,660,590)
        can.coords(carre_noir_haut,640,11,660,Y-50)
     
    flag = 0
    x, y = 500, 300
    dx, dy = 2, 2
    vx=cos(45)
     
    # carré bas du milieu #
     
    xnoir_bas_gauche = 640
    ynoir_bas_gauche = 408
    xnoir_bas_droite = 660
    ynoir_bas_droite = 590
     
    # carré haut du milieu #
     
    xnoir_haut_gauche = 640
    ynoir_haut_gauche = 11
    xnoir_haut_droite = 660
    ynoir_haut_droite = 272
     
    #titre fenêtre
     
    fen = Tk.Tk()
    fen.title(" Dispatch Ball ")
     
    Largeur = 1300
    Hauteur = 600
    can = Tk.Canvas(fen, bg= "white", width= Largeur, height= Hauteur)
    can.grid(row= 3, column= 0)
     
    ball = can.create_oval(x-10, y-10, x+10, y+10, outline= "black", fill= "black")
     
    carre_noir_bas = can.create_rectangle(640, 408, 660, 590, outline= "maroon", width = 2, fill= 'gray')
    carre_noir_haut = can.create_rectangle(640, 10, 660, 272, outline= "maroon", width = 2, fill= 'gray')
     
    #Liaison entre événement et fonction
    can.bind('<Motion>', Mouvement_curseur) # Motion correspond à la detection instantané de la position de la souris
     
    # Création du bouton "Débuter la Partie":
    bouton=Button(fen, text= "Débuter la Partie", command= start).grid(row= 0, column= 0)
     
     
    fen.mainloop()
    mais ici la balle réagit avec les coordonnées suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # carré bas du milieu #
     
    xnoir_bas_gauche = 640
    ynoir_bas_gauche = 408 # élément du rectangle du bas en mouvement (= Y+50)
    xnoir_bas_droite = 660
    ynoir_bas_droite = 590
     
    # carré haut du milieu #
     
    xnoir_haut_gauche = 640
    ynoir_haut_gauche = 11
    xnoir_haut_droite = 660  
    ynoir_haut_droite = 272 # élément du rectangle du haut en mouvement (= Y-50)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    Le code que vous avez posté "fonctionne": si je lance le truc, je ne tombe pas dans l'erreur que vous avez mentionné tantôt.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [FLASH MX] Problème avec l'objet Date
    Par n_tony dans le forum Flash
    Réponses: 13
    Dernier message: 22/03/2005, 13h44
  2. Réponses: 4
    Dernier message: 25/09/2004, 09h58
  3. inclinaison d'un texte avec l'objet ID3DXFont v2
    Par tibyann dans le forum DirectX
    Réponses: 3
    Dernier message: 30/06/2004, 14h27
  4. inclinaison d'un texte avec l'objet ID3DXFont
    Par tibyann dans le forum DirectX
    Réponses: 8
    Dernier message: 21/06/2004, 16h00
  5. Animations avec différents objet
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 09/06/2004, 14h18

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