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

Python Discussion :

Problème de coordonnés en Tkinter


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Par défaut Problème de coordonnés en Tkinter
    Bonjour,
    Je suis en train de créer un jeu de tir avec des tanks.
    Voilà plusieurs heures que je bloque sur un problème avec les coordonnées de ma balle dans les fonctions tirJ1, animTirJ1 et tirJ2 et animTirJ2, lignes 28 à 43 et 47 à 64, j'aimerai que la canon ne tire que si on appuie sur le bouton feu, cela marche pour le premier tir, mais tous les tirs suivants, le bouton "feu" ne fait rien, et le canon tire lorsque je change la puissance du tir (scale powerA ou powerB).
    Je ne trouve vraiment pas de solution à ce problème.

    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
     
    from tkinter import *
    from math import pi, sin, cos
     
    #----------------------------------------------
    #--             Classes                      --
    #----------------------------------------------
    class Tank:
    	def __init__(self, oudessiner, x, y, sens):
    		self.canev = oudessiner
    		self.direc = sens
    		self.x1 = x #x1 pour calculer la formule du tir
    		self.y1 = y #y1 pour calculer la formule du tir
    		self.Lcanon = 25 * self.direc #longueur du canon pour formule du tir
    		self.x2 = x + self.Lcanon #x2 pour calculer la formule du tir
    		self.y2 = y  #y2 pour calculer la formule du tir
    		self.balle = self.canev.create_oval(self.x2, self.y2, self.x2, self.y2, fill = "green", width = 2)
    		self.maxX = int(self.canev.cget('width'))
    		self.maxY = int(self.canev.cget('height'))
    		self.canon = self.canev.create_line(self.x1, self.y1, self.x2 , self.y2, fill = "black", width = 5)
    		self.tour = self.canev.create_oval(self.x1-10, self.y1-10, self.x1 + 10, self.y1 + 10, fill = "red")
    		self.corps = self.canev.create_rectangle(self.x1 - 20, self.y1, self.x1 + 20, self.y1 + 15, fill = "grey")
    		self.roue1 = self.canev.create_oval(self.x1 - 17.5, self.y1 + 12.5, self.x1 - 10, self.y1 + 20, fill = "black")
    		self.roue2 = self.canev.create_oval(self.x1 + 10, self.y1 + 12.5, self.x1 + 17.5, self.y1 + 20, fill = "black")
     
    #----------Joueur 1 (gauche)--------------------
     
    	def angleJ1(self, angleA): #angle du canon	
    		self.angle1 = float(angleA)*2*pi/360
    		self.x2 = self.x1 + self.Lcanon*cos(self.angle1)
    		self.y2 = self.y1 - self.Lcanon*sin(self.angle1)
    		self.canev.coords(self.canon, self.x1, self.y1, self.x2, self.y2) #change les coord du canon
     
    	def tirJ1(self, powerA): #ordre de tir
    		self.power1 = float(powerA) / 4 #vitesse de la balle
    		self.canev.coords(self.balle, self.x2 - 2.5, self.y2 -2.5, self.x2 + 2.5, self.y2 + 2.5) #change les coord de la balle
    		self.powerX1 = self.power1 * cos(self.angle1)
    		self.powerY1 = -self.power1 * sin(self.angle1) # - en Y = tir vers la droite	
     
    	def animTirJ1(self): #animation de la balle
    		self.canev.move(self.balle, self.powerX1, self.powerY1) 
    		self.powerY1 += 0.5
    		self.canev.after(30, self.animTirJ1)
     
    #----------Joueur 2 (droite)--------------------
     
    	def angleJ2(self, angleB): #angle du canon	
    		self.angle2 = (float(angleB)*2*pi/360) * -1
    		self.x2 = self.x1 + self.Lcanon*cos(self.angle2)
    		self.y2 = self.y1 - self.Lcanon*sin(self.angle2)
    		self.canev.coords(self.canon, self.x1, self.y1, self.x2, self.y2) #change les coord du canon
     
     
     
    	def tirJ2(self, powerB): #ordre de tir
    		self.power2 = float(powerB) / 4 #vitesse de la balle	
    		self.canev.coords(self.balle, self.x2 - 2.5, self.y2 -2.5, self.x2 + 2.5, self.y2 + 2.5) #change les coord de la balle
    		self.powerX2 = -self.power2 * cos(self.angle2) # - en X = tir vers la gauche
    		self.powerY2 = self.power2 * sin(self.angle2)
     
    	def animTirJ2(self): #animation de la balle
    		self.canev.move(self.balle, self.powerX2, self.powerY2)
    		self.powerY2 += 0.5
    		self.canev.after(30, self.animTirJ2)
     
     
    #---------------Fenetre----------------------------------
     
    fen = Tk()
    fen.title("Bomb it")
     
    can = Canvas(fen, width = 1000, height = 600)
    can.pack()
     
    aireJeu = can.create_rectangle(5, 500, 995 , 5, fill = "white")
     
    #--------------Joueur à gauche---------------------------
     
    jou1 = Tank(can, 200, 400, 1)
     
    angleA = Scale(fen, label = "Angle de tir", from_ = 180, to = 0, command = jou1.angleJ1)
    angleA.pack(side = LEFT)
     
    powerA = Scale(fen, label = "Puissance du tir", from_= 0, to= 100, orient=HORIZONTAL, command = jou1.tirJ1)
    powerA.pack(side = LEFT)
     
    buttA = Button(fen, text = "Feu", command = jou1.animTirJ1)
    buttA.pack(side = LEFT)
     
    #--------------Joueur à droite---------------------------
     
    jou2 = Tank(can, 800, 400, -1)
     
    angleB = Scale(fen, label = "Angle de tir", from_ = 180, to = 0, command = jou2.angleJ2)
    angleB.pack(side = RIGHT)
     
    powerB = Scale(fen, label = "Puissance du tir", from_= 0, to= 100, orient=HORIZONTAL, command = jou2.tirJ2)
    powerB.pack(side = RIGHT)
     
    buttB = Button(fen, text = "Feu", command = jou2.animTirJ2)
    buttB.pack(side = RIGHT)
     
     
    fen.mainloop()

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 168
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    ce qui est sûr, c'est que tes animations... Une fois qu'elles sont parties, elles ne s'arrêtent jamais !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Par défaut
    Citation Envoyé par f-leb Voir le message
    ce qui est sûr, c'est que tes animations... Une fois qu'elles sont parties, elles ne s'arrêtent jamais !
    Oui je suis au courant de cela, est-ce qu'il y aurait un rapport avec mon problème?
    Car a chaque fois que l'on relance une balle, celle d'avant se "supprime", les nouvelles coordonnés écrasent les anciennes.

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

    Citation Envoyé par Bud Master Voir le message
    Car a chaque fois que l'on relance une balle, celle d'avant se "supprime", les nouvelles coordonnés écrasent les anciennes.
    Et vous faites cela où dans le code que vous avez posté?
    note: je parle de la fin d'un tir. i.e. la fin des appels à self.canev.after(30,...)

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et vous faites cela où dans le code que vous avez posté?
    C'est la même variable qui est utilisée, la balle est donc "supprimée" non?
    Les nouvelles coordonnés écrasent les anciennes, en gros la balle est repositionnée à la bouche du canon (ligne 36 & 57), et c'est je pense cette ligne qui me pose problème, quand je touche a l'échelle de la puissance, le tir est fait automatiquement, ce que je ne comprend pas.
    Ou du moins c'est ce que je pense, je peux être complètement à côté de la plaque, ce n'est pas impossible

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

    Citation Envoyé par Bud Master Voir le message
    Les nouvelles coordonnés écrasent les anciennes, en gros la balle est repositionnée à la bouche du canon (ligne 36 & 57), et c'est je pense cette ligne qui me pose problème, quand je touche a l'échelle de la puissance, le tir est fait automatiquement, ce que je ne comprend pas.
    La balle est effectivement repositionnée mais le timer qui la déplace n'a pas été arrêté.
    Donc elle revient à sa position de départ et repart sans devoir appuyer sur "feu".

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

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    le timer qui la déplace n'a pas été arrêté.
    Déjà merci pour cette info, ça m'aide déja pas mal, mais qu'est-ce que le timer?
    Il y a un rapport avec la méthode after?

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

    Citation Envoyé par Bud Master Voir le message
    Déjà merci pour cette info, ça m'aide déja pas mal, mais qu'est-ce que le timer?
    Il y a un rapport avec la méthode after?
    Essayez de comprendre ce qu'il se passe dans votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	def animTirJ1(self): #animation de la balle
    		self.canev.move(self.balle, self.powerX1, self.powerY1) 
    		self.powerY1 += 0.5
    		self.canev.after(30, self.animTirJ1)
    S'il vous est difficile de visualiser, ajoutez des "print".

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

Discussions similaires

  1. problème de coordonnées
    Par franfr57 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 26/03/2007, 13h58
  2. problème de coordonnées ou autre problème ?
    Par superC dans le forum DirectX
    Réponses: 8
    Dernier message: 19/02/2007, 21h20
  3. Problème de coordonnées dans des balises
    Par Zebulon777 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 06/02/2007, 07h26
  4. Réponses: 2
    Dernier message: 16/10/2005, 19h19
  5. problème de coordonnées
    Par Yennick dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 11/03/2005, 17h32

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