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 :

Flappy Pong, demande de conseils, jugement du code [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut Flappy Pong, demande de conseils, jugement du code
    Bonjour,

    Bonne année 2019, ce n'est pas encore l'année du serpent mais j'ai quand même concocté en python un flappy pong vaguement inspiré de flappy bird.

    Le joueur contrôle une boule, auquel est rattachée une flèche qui indique l'angle de lancement, et une barre sur le coté qui permet de gérer la puissance du tir. La flèche est contrôlée via les flèches haut et bas du clavier, la barre de puissance via la barre d'espace. Le but est d'éviter les barres qui avancent sans dépasser les bords du terrain. J'ai atteint un score de 12.

    Le but était de faire des widgets perso (ici la barre de puissance et la flèche) comme Swinnen faisait lui même (J'ai lu/travaillé le livre jusqu'à SQLite) et de faire un peu de POO

    Je n'ai pas séparé ici la visualisation du reste, cela me paraissait plus simple pour ce cas la.
    Structure : Classe Appli gère Score, help, binder, frame et canvas du jeu et instancie une boule et un terrain. La boule instancie une flèche et une jauge (barre de puissance)

    Si vous avez des commentaires (POO, façon plus pythonique de faire...), des axes d'amélioration à prendre en compte pour mes futurs programmes, des idées pour progresser ...

    PS1: Pour la détection entre la boule et les barres, j'utilise find_overlapping de tkinter. Il faudrait que je donne des coordonnées un peu plus petite que celle du carré contenant le cercle, histoire d'éviter les faux positifs
    PS2: Dans certains cas, comme je me sers des coordonnées de la dernière barre pour trouver la coordonnée en x de la nouvelle, sans vérifier que la nouvelle apparaitra bien en dehors du canvas, il se peut qu'elle pop up dans le canvas. Mais j'ai trouvé cela amusant et j'ai laissé ainsi
    PS3: Tout est publique, c'est la fete, je vais passer en privé ce qui peut l'être
    PS4: Par rapport à vos précédents conseils suite à mon pacman : c'est normalement moins le bordel qu'avant au niveau des classes, et détail, j'ai mis de l'unpacking quand cela ne rendait pas la ligne trop longue

    Merci

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
     
    from tkinter import Frame, Canvas, Label, IntVar, N
    from math import sin, cos, pi
    from random import choice, randint 
     
    class Global:
        """Variables pour paraméter le jeu"""
        motions = {
        'Up':   (0, -1),
        'Down': (0, 1)}
     
        bar_speed = -.5         # Base: -.5
        taille_boule = 15       # Base: 15
        canvas_width = 600      # Base: 600
        canvas_height = 300     # Base: 300
        angle_init_fleche = 70  # Base: 70
        gravity = 9.81          # Base: 9.81
        ball_standby_speed = -.4    # Base: -.4
        bar_init_nb = 5         # Base: 5. Doit etre >1
        longueur_fleche = 40    # Base: 40
        boule_pas_temps = 70    # Base: 70 
        coeff_boule_pas_temps_after = 9 # Base 9
     
    class Appli(Frame):
        """Score, boule, help, terrain, binder"""
        def __init__(self):
            """Lancement des objets pour faire tourner le jeu + binder """
            Frame.__init__(self, bg='grey')    
            self.grid(row=0, column=0)
            self.can = Canvas(self, 
                              width=Global.canvas_width, 
                              height=Global.canvas_height, 
                              bg='ivory')        
            self.can.grid()   
            self.can.focus_set()     
            self.run = True       # indique si game over ou pas 
     
            self.init_score()
            self.objet_boule = Boule(self) 
            self.help_start() # Placé ici pour que texte crée soit le 3ème objet crée dans le canvas et ait l'identifiant 3 
            self.terrain = Terrain(self)
     
            self.can.bind('<KeyPress-space>', 
                          self.objet_boule.jauge.press_spacebar) 
            self.can.bind('<KeyRelease-space>', 
                          self.objet_boule.jauge.release_spacebar)  
     
            for key in Global.motions:   
                self.can.bind('<%s>' % key, self.objet_boule.fleche.on_arrow)
     
        def init_score(self):
            """GUI du score"""
            self.score = 0
            Label(self,text='Score :', 
                  bg='grey', 
                  fg='white').grid(row=0, column=1) 
            self.score_label_content = IntVar()
            self.score_label_content.set(self.score)
            self.score_label = Label(self,
                                     textvariable=self.score_label_content, 
                                     bg='grey', 
                                     fg='white')  
            self.score_label.grid(row=0, column=2)   
     
        def anim_score(self):
            """+1 apparait lorsque bar quitte l'écran"""
            self.score_text = self.can.create_text(100,100,         
                                 fill="darkblue",
                                 font="Times 20 italic bold",
                                 text="+1")        
     
        def fin_anim_score(self):
            """le +1 disparait"""
            try:
                self.can.delete(self.score_text)
            except:
                pass 
     
        def set_score(self):
            """Incremente le score de 1"""
            self.score += 1
            self.score_label_content.set(self.get_score())
     
        def get_score(self):
            return self.score 
     
        def help_start(self):
            """Aide du jeu dans canvas"""
            self.help_status = True
            texte = "Sans sortir à gauche ou à droite, Evite les bars \n" \
                    "Ca fait des points quand elles quittent l'écran\n" \
                    "Bar d'espace pour la puissance, fleches pour orienter\n" \
                    "Clic sur la boule pour activer les commandes"
     
            self.help_start = self.can.create_text(50,70,         
                                 fill="darkblue",
                                 font="Times 10",
                                 anchor='w',
                                 text=texte) 
     
        def delete_help_start(self):
            """Disparition de l'aide du jeu"""
            self.help_status = False
            self.can.delete(self.help_start)
     
        def get_help_status(self):
            return self.help_status 
     
        def set_help_status(self,status):
            self.help_status = status    
     
        def failure(self):
            """Game over"""
            self.run = False
            self.can.delete('all')
            self.can.after(400) 
            self.can.create_text(150, 150,              
                                 fill="red",
                                 font="Times 15 italic bold",
                                 text="Game Over")    
     
    class Boule():
        """Gestion de la boule, avancer et trajectoire, mode stand by, instanciation de jauge et de fleche, 2 composantes de la boule"""
        def __init__(self, boss):         
            self.boss = boss        #self.Application
            self.can = self.boss.can
            self.anim = False       # Indicateur boule en mvt ou pas 
            self.xMax = int(self.can.cget('width'))
            self.yMax = int(self.can.cget('height')) 
            self.init_boule()
            self.jauge = Jauge(self)
            self.fleche = Fleche(self, Global.angle_init_fleche)
     
        def init_boule(self): 
            self.rayon = Global.taille_boule    
            self.x1, self.y1 = 2, self.yMax-2*self.rayon
            self.x2, self.y2 = 2*self.rayon+2, self.yMax
            self.boule = self.can.create_oval(self.x1, self.y1, self.x2, self.y2, 
                                              fill='red', outline="") 
     
        def launch_boule(self,value_jauge):
            """preparation des elts utiles au lancement de la boule, commme v en x et v en y, à partir de puissance de jauge, angle""" 
            if not(self.anim):  # On ne peut lancer que si boule non en mvt
                self.anim = True 
                self.fleche.off_fleche()  
     
                angle = self.fleche.angle
                v0 = value_jauge*2  # m/s    
     
                self.g = Global.gravity   # On est sur Terre
                self.vx = v0 * cos(angle)
                self.vy = v0 * sin(angle)
                self.t = 0  #Permet ensuite de ne pas afficher chaque pas 
                self.anim_boule() 
     
        def anim_boule(self):
            """Gestion de l'animation de la boule"""
            if self.boss.run and self.anim and self.test_obstacle_terrain():
                pas_temps = Global.boule_pas_temps         # ms. On veut suffisement de changement entre 2 pas. Plus cest élevé, plus la boule se déplacera vite. En contre partie, penser à le diviser davantage dans le after  
                dx = self.vx * pas_temps/1000
                dy = (-self.g* self.t + self.vy)* pas_temps/1000 
     
                self.can.move(self.boule, dx, -dy)   
                self.t += pas_temps/1000                   
                self.can.after(int(pas_temps/Global.coeff_boule_pas_temps_after), self.anim_boule)   # On divise pour accélérer l'animation. 
     
        def anim_stand_by(self):
            """LA bouel recule lorsqu'elle est au sol"""
            if not(self.anim) and self.boss.run :
                self.fleche.on_fleche()
                dx = Global.ball_standby_speed        # La boule recule  
                dy = 0       
                self.test_obstacle_terrain()
                self.can.move(self.boule, dx, dy)
                self.can.after(10, self.anim_stand_by)
     
        def test_obstacle_terrain(self):
            """On regarde si la boule atteint les bords ou retombe sur le sol"""
            boule_coord = self.can.coords(self.boule)
            if boule_coord[3]>self.yMax and self.boss.run:  #La boule retombre sur le sol
                self.anim = False
                self.reinit_boule() 
                self.fleche.on_fleche()  # On remet la fleche
                self.anim_stand_by()    # On passe en stand by
                return False
            elif boule_coord[2]>self.xMax or boule_coord[0]<0:  # La boule atteint le cadre gauche ou le cadre droit 
                self.boss.failure()
                return False        # Echec
            else: 
                return True     # La boule est en mouvement
     
        def reinit_boule(self):
            """Replace la boule proprement lorsqu'elle retombe sur le sol"""
            self.x1, self.y1 = self.get_boule_coord()[0], self.yMax-2*self.rayon
            self.x2, self.y2 = self.get_boule_coord()[2], self.yMax
            self.can.coords(self.boule, self.x1, self.y1, self.x2, self.y2)
     
        def get_boule_coord(self):
            return (self.can.coords(self.boule))
     
    class Jauge:
        """Bar qui se remplit en fonction du temps passé appuyé sur la bar d'espace"""
        def __init__(self, boss):
            self.boule = boss 
            self.jauge_longueur = 50 # Considéré comme la valeur max de jauge 
            self.jauge_largeur = 10 
     
            self.can_jauge = Canvas(self.boule.boss, 
                                    width=self.jauge_largeur, 
                                    height=self.jauge_longueur, 
                                    bg='ivory', 
                                    bd=1, 
                                    highlightbackground='black')
            self.can_jauge.grid(row=0, column=1, sticky=N, padx=[5,2], pady =[5,0])
            self.jauge_value = 0
            self.jauge = self.can_jauge.create_rectangle(0, 
                                                         self.jauge_longueur, 
                                                         self.jauge_largeur*2, 
                                                         self.jauge_longueur+0.1, 
                                                         fill='green')
     
        def fill_jauge(self):
            """Remplissage de la jauge, on passe en rouge à partir d'un seuil"""
            if self.jauge_value > self.jauge_longueur*0.6:
                self.can_jauge.itemconfig(self.jauge, fill="red")   
            x1, y1 = 0, self.jauge_longueur-self.jauge_value
            x2, y2 = self.jauge_largeur*2, self.jauge_longueur+0.1  
            self.can_jauge.coords(self.jauge, x1, y1, x2, y2)
     
        def press_spacebar(self,event):
            """Appui sur la bar d'espace, ne fonctionne que si on n'a pas dépassé valeur max"""
            if self.jauge_value < self.jauge_longueur:  
                self.fill_jauge()
                self.jauge_value += 2 # 2 car sinon trop lent 
     
        def release_spacebar(self,event):
            """Relachement de la bar d'espace et réinitialisation de la jauge"""
            self.can_jauge.itemconfig(self.jauge, fill="green")
            self.jauge_value_temp = self.jauge_value
            self.jauge_value = 0
            self.fill_jauge()
            self.boule.launch_boule(self.jauge_value_temp)
     
    class Fleche:
        """fleche partant du centre de la boule pour indiquer la direction du lancer"""
        def __init__(self, boss, angle_init):
            self.boss = boss   # self.boule     
            self.init_fleche(angle_init)         
     
        def init_fleche(self, angle_init):       
            self.angle = angle_init/180*pi
            self.longueur_fleche = Global.longueur_fleche
            self.rayon_b = self.boss.rayon
     
            self.x1 = self.boss.x1+self.rayon_b
            self.y1 = self.boss.y1+self.rayon_b
            self.x2 = self.longueur_fleche*cos(self.angle)+self.x1
            self.y2 = -self.longueur_fleche*sin(self.angle)+self.y1       
     
            self.fleche = self.boss.can.create_line(self.x1, self.y1, 
                                                    self.x2, self.y2, width=3)       
     
        def on_arrow(self, event):    
            """Quand on appui sur la fleche du haut ou du bas, pour changer l'angle"""        
            if Global.motions[event.keysym][1] == -1 and self.angle<1.48:
                self.angle = (self.angle + (5/180*pi))
                self.bouge_fleche()
            elif Global.motions[event.keysym][1] == 1 and self.angle>0.2:
                self.angle = (self.angle - (5/180*pi))
                self.bouge_fleche()        
     
        def bouge_fleche(self): 
            """Fait bouger la fleche en fonction de l'angle"""           
            self.x2 = self.longueur_fleche*cos(self.angle)+self.x1
            self.y2 = -self.longueur_fleche*sin(self.angle)+self.y1
     
            self.boss.can.coords(self.fleche, 
                                 self.x1, self.y1, self.x2, self.y2)         
     
        def off_fleche(self):     
            """La fleche disparait en vol"""
            self.boss.can.itemconfig(self.fleche, state='hidden')   
     
        def on_fleche(self):
            """La fleche apparait lorsque la balle est au sol"""
            self.x1 = self.boss.get_boule_coord()[0]+self.rayon_b
            self.y1 = self.boss.get_boule_coord()[1]+self.rayon_b 
            self.bouge_fleche()
            self.boss.can.itemconfig(self.fleche, state='normal')
     
    class Terrain():
        """Gestion des bars sur le terrain, la boule doit les passer pour survivre"""
        def __init__(self, boss):
            self.boss = boss 
            self.xMax = int(self.boss.can.cget('width'))
            self.yMax = int(self.boss.can.cget('height'))  
            self.time_score = 0            
            self.barreaux_init()
            self.avancer()
     
        def barreaux_init(self):
            """On initialise les premiers barreaux qui partiront tjs du bas"""
            self.bar = []
            x = self.xMax-self.xMax/5
            for i in range(Global.bar_init_nb):
                y = randint(int(self.yMax/5),int(self.yMax/3))
                self.bar.append(self.boss.can.create_rectangle(x, self.yMax-y, 
                                                               x+5, self.yMax, 
                                                               fill='black'))  
                x += randint(200,400)
     
        def avancer(self):
            """Avancer des barreaux, affichage de l'aide, affichage du score, incrémentation difficulté"""
            self.difficulty_management()    # On regarde si on augmente vitesse des bars ou pas 
            self.time_score += 10           # Utilisé pour les affichage du score et de l'aide. 
     
            if self.time_score == 10000:    # Aide affichée pendant 10s
                self.boss.delete_help_start()
                self.boss.set_help_status(False)
     
            if self.time_score % 400 == 0: # Changement score affiché pendant 0.4s
                self.boss.fin_anim_score()
     
            if self.boss.run:
                loop_list = list(range(len(self.bar)))
                loop_list = loop_list[::-1] # Reverse comme on supprime des élts de la liste parcouru
                for index in loop_list:         # On parcourt chaque bar de la liste pour la faire avancer 
                    elt = self.bar[index]
                    self.boss.can.move(elt, self.bar_speed,0)
                    self.bar_evaluate(index)    # On regarde si elle quitte le terrain ou pas 
     
                if self.test_obstacle_bar():    # On teste si la boule n'a rencontré aucune bar 
                    self.boss.can.after(10, self.avancer) 
     
        def difficulty_management(self):
            """Augmentation de la vitesse des bars tous les 5 bars"""
            if self.boss.get_score() == 0:
                self.bar_speed = Global.bar_speed 
                self.old_score = self.boss.get_score() 
            elif self.boss.get_score() % 5 == 0 and self.old_score % 5 != 0:
                self.old_score = self.boss.get_score()  # old_score pour éviter d'incrémenter tout le temps que l'on est divisible par 5
                self.bar_speed -= 0.2
            else:
                self.old_score = self.boss.get_score() 
     
        def bar_evaluate(self,index): 
            """On teste si la boule n'a rencontré la bar considérée, à partir de son index"""
            coord = self.boss.can.coords(self.bar[index])
            lastbar_xcoord = self.boss.can.coords(self.bar[-1])[0]
            if coord[0]<0:  
                self.boss.can.delete( self.bar[index])  
                self.bar.pop(index) 
                self.boss.set_score()
                self.boss.anim_score()
     
                if len(self.bar)<5:
                    self.create_bar(lastbar_xcoord)                         
     
        def test_obstacle_bar(self):
            """On teste si la boule n'a rencontré aucune barre"""
            coord_boule = self.boss.objet_boule.get_boule_coord()
            xb1, yb1 = coord_boule[0], coord_boule[1]
            xb2, yb2 = coord_boule[2], coord_boule[3]  
            overlap = self.boss.can.find_overlapping(xb1, yb1, xb2, yb2)        
            for elt in overlap:     # Rectangle donc il y a une partie qui fera des faux positifs. 
                if self.boss.get_help_status() and elt>3: # Il faudrait réduire la taille du rectangle pour compenser 
                    self.boss.failure() 
                    return False
                elif not(self.boss.get_help_status()) and elt>2:
                    self.boss.failure()
                    return False
            return True
     
        def create_bar(self,lastbar_xcoord):
            """Creation d'une barre à partir des coordonnées de la dernière barre, la barre peut venir du haut, du bas, et plus rarement des deux"""
            x = lastbar_xcoord+randint(200,450)     # Rq: il vaudrait mieux rajouter conditions pour voir si barre apparaitra bien en dehors du terrain. Sinon elle peut pop up dans certains cas   
            choice_list = list(range(11)) 
            bar_nombre = choice(choice_list)
     
            if bar_nombre % 2 == 0: # bas
                y = randint(int(self.yMax/4.5),int(self.yMax/1.4))      
                self.bar.append(self.boss.can.create_rectangle(x, self.yMax-y, 
                                                               x+5, self.yMax, 
                                                               fill='black')) 
            elif bar_nombre % 7 == 0:   # bas et haut
                y1 = randint(int(self.yMax/4.5),int(self.yMax/2.1))
                if y1 > 95:
                    y2 = randint(int(self.yMax/3.3),int(self.yMax/3))
                else: 
                    y2 =  randint(int(self.yMax/4.5),int(self.yMax/2.1))
     
                self.bar.append(self.boss.can.create_rectangle(x, self.yMax-y1, 
                                                               x+5, self.yMax, 
                                                               fill='black'))            
                self.bar.append(self.boss.can.create_rectangle(x+0.1, y2, 
                                                               x+5.1, -1000,  
                                                               fill='black'))     
            else: # haut
                y = randint(int(self.yMax/1.6),int(self.yMax/1.2))
                self.bar.append(self.boss.can.create_rectangle(x, y, 
                                                               x+5, -1000, 
                                                               fill='black')) 
     
    if __name__ =='__main__':
        Appli().mainloop()

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Quelque chose fait que ça ne fonctionne pas chez moi, tout ce que fait l'appui de la touche espace est de faire reculer la boule en arrière, pas de jauge se remplissant, pas de boule sautant par dessus les obstacles, et j'ai pas trop envie de déterminer pas à pas ce qui fait boguer le programme.

    Et il y a toujours des problèmes de conceptions, exemple le plus flagrant, la jauge, cet objet ne devrait pas à avoir à communiquer avec la boule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.can.bind('<KeyPress-x>',  self.objet_boule.jauge.press_spacebar) 
    self.can.bind('<KeyRelease-x>',  self.objet_boule.jauge.release_spacebar)
    Le bind ne devrait pas être lié à la jauge, mais plus à ton objet boule, ou encore un objet Player (dont la boule fait partie).

    Ce qui est flagrant, puisque cela t'oblige à faire dans Jauge.release_spacebar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.boule.launch_boule(self.jauge_value_temp)
    La jauge ne devrait pas à avoir à manipuler la boule (ni même connaitre son existence), mais le contraire, la boule (plutôt un objet player) agissant sur la jauge, mais rien n'empêcherait de fournir une fonction de rappel à la jauge pour lui indiquer d'appeler telle fonction lorqu'elle est pleine, ce qui serait un peu plus propre.

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Ok merci pour ton feedback.

    Pour le problème de jeu, peut etre, la boule est collée à la gauche de l'écran, du coup, si tu appuies très rapidement sur la barre, elle saute un tout petit peu mais quasiment pas visible et par en arrière et game over. Il aurait fallu que je la place 100 pixel plus loin du bord pour que l'on comprenne. En sachant cela, j’appuie suffisamment et elle part bien mais cela ne devrait pas porter à confusion comme c'est le cas.

    Pour les binders, si je t'ai bien compris, je fais un objet player, le binder jauge rentre logiquement dedans, et la méthode à laquelle c'est liée y serait aussi (genre appui et release de la barre). Ces deux méthodes iraient ensuite modifier une méthode de jauge et on aurait en return la puissance. Jauge serait alors bien indépendant. Je vois bien que ma solution actuelle est un problème si je l'instancie avec un autre objet, il faudrait que je change self.boule.launch_boule(self.jauge_value_temp). Par contre cela ferait plus beaucoup de méthodes à mettre dans jauge et flèche et j'aurai une grosse classe player contenant les éléments de ma classe appli et de boule plus les méthodes rattachées au binder. Est ce un problème ?

    Au début, je trouvais plutôt bien qu'une action sur la barre aille dans jauge car cela me semblait faire partie intégrante d'une jauge. Je trouvais ca aussi sympa d'avoir un objet boule qui est quand bien délimité par une classe.

    Bonne soirée

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kazvert Voir le message
    Ok merci pour ton feedback.
    Je t'en prie.

    Citation Envoyé par Kazvert Voir le message
    Pour le problème de jeu, peut etre, la boule est collée à la gauche de l'écran, du coup, si tu appuies très rapidement sur la barre, elle saute un tout petit peu mais quasiment pas visible et par en arrière et game over. Il aurait fallu que je la place 100 pixel plus loin du bord pour que l'on comprenne. En sachant cela, j’appuie suffisamment et elle part bien mais cela ne devrait pas porter à confusion comme c'est le cas.
    En fait, cela fonctionne correctement, désolé, j'ai encore (une fois de plus, et c'est pas faute d'avoir été confonté à multiples reprises à ce problème avec tkinter...) oublié que sur mon système le fait de rester appuyé sur une touche provoque un release auto chaque fois. j'ai changé les binds en mettant deux keypress sur 2 touches différentes pour tester.

    Citation Envoyé par Kazvert Voir le message
    Pour les binders, si je t'ai bien compris, je fais un objet player, le binder jauge rentre logiquement dedans, et la méthode à laquelle c'est liée y serait aussi (genre appui et release de la barre). Ces deux méthodes iraient ensuite modifier une méthode de jauge et on aurait en return la puissance. Jauge serait alors bien indépendant. Je vois bien que ma solution actuelle est un problème si je l'instancie avec un autre objet, il faudrait que je change self.boule.launch_boule(self.jauge_value_temp). Par contre cela ferait plus beaucoup de méthodes à mettre dans jauge et flèche et j'aurai une grosse classe player contenant les éléments de ma classe appli et de boule plus les méthodes rattachées au binder. Est ce un problème ?

    Au début, je trouvais plutôt bien qu'une action sur la barre aille dans jauge car cela me semblait faire partie intégrante d'une jauge. Je trouvais ca aussi sympa d'avoir un objet boule qui est quand bien délimité par une classe.
    Bah je me trompe peut-être, je ne suis sûrement pas la science infuse en modélisation objet, j'en suis loin, mais en reliant les événements à une classe player, ça ne changerait pas grand chose au final niveau code.
    Ce que j'aurais fait est d'instancier dans la class Appli, la jauge, puis l'objet Boule en lui fournissant en paramètre la jauge, qui sait si plus tard un autre objet puisse avoir besoin d'avoir accès à la jauge, le fait de l'instancier dans la classe de plus haut niveau permettra de pouvoir la passer à d'autres objets si besoin, puis dans la class Boule les méthodes reliées aux keypress/keyrelease agissant comme méthodes proxy des méthodes de la jauge en y ajoutant si besoin au passage des choses à effectuer.

    Citation Envoyé par Kazvert Voir le message
    Bonne soirée
    De même

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Ok, maintenant je vais faire un peu de Numpy et de Matplotlib avant de refaire un jeu tkinter en tenant compte de tes remarques.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation de code - demande de conseils
    Par ploukinet dans le forum MATLAB
    Réponses: 11
    Dernier message: 14/06/2007, 12h58
  2. [Struts_Tiles VS CSS] Demande de Conseils
    Par sylvain_neus dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/04/2004, 10h12
  3. [sqlbaseserver]demande de conseils/aides pour requêtes
    Par GéniuS77 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2004, 17h27
  4. demande de conseil
    Par stephane eyskens dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 25/09/2003, 14h18
  5. Réponses: 7
    Dernier message: 18/04/2003, 10h02

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