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

GUI Python Discussion :

pygame ballon qui rebondit


Sujet :

GUI Python

  1. #1
    Invité
    Invité(e)
    Par défaut pygame ballon qui rebondit
    bonjour,

    J'ai le programme suivant avec un disque rouge qui est supposé rebondir sur les bords de la fenetre. Le problème, c'est que ce disque reste collé au premier bord qu'il rencontre au lieu de rebondir. Je mets ci-après les valeurs de y,vx et vy (composantes des vitesses du disque):
    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
     
    100.0 [10, 8]
    108.0 [10, 8]
    116.0 [10, 8]
    124.0 [10, 8]
    132.0 [10, 8]
    140.0 [10, 8]
    148.0 [10, 8]
    156.0 [10, 8]
    164.0 [10, 8]
    172.0 [10, 8]
    180.0 [10, 8]
    188.0 [10, 8]
    196.0 [10, 8]
    204.0 [10, 8]
    212.0 [10, 8]
    220.0 [10, 8]
    228.0 [10, 8]
    236.0 [10, 8]
    244.0 [10, 8]
    252.0 [10, 8]
    260.0 [10, 8]
    268.0 [10, 8]
    276.0 [10, 8]
    284.0 [10, 8]
    292.0 [10, 8]
    300.0 [10, 8]
    308.0 [10, 8]
    316.0 [10, 8]
    324.0 [10, 8]
    332.0 [10, 8]
    340.0 [10, 8]
    348.0 [10, 8]
    356.0 [10, 8]
    364.0 [10, 8]
    372.0 [10, 8]
    380.0 [10, 8]
    388.0 [10, 8]
    396.0 [10, 8]
    404.0 [10, 8]
    412.0 [10, 8]
    420.0 [10, 8]
    428.0 [10, 8]
    436.0 [10, 8]
    444.0 [10, 8]
    452.0 [10, 8]
    460.0 [10, 8]
    468.0 [10, 8]
    476.0 [10, 8]
    484.0 [10, 8]
    492.0 [10, 8]
    500.0 [10, 8]
    508.0 [10, 8]
    516.0 [10, 8]
    524.0 [10, 8]
    532.0 [10, 8]
    540.0 [10, 8]
    548.0 [10, 8]
    556.0 [10, 8]
    564.0 [10, 8]
    572.0 [10, 8]
    580.0 [10, 8]
    588.0 [10, 8]
    596.0 [-9.9000000000000004, 8]
    604.0 [9.8010000000000002, 8]
    612.0 [-9.7029899999999998, 8]
    620.0 [9.605960099999999, 8]
    628.0 [-9.5099004989999987, 8]
    636.0 [9.414801494009998, 8]
    644.0 [-9.3206534790698985, 8]
    652.0 [9.2274469442791993, 8]
    Voici le 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
     
    import sys, pygame
    import matplotlib as m
    import pylab as p
    import math
    pygame.init()
     
    size = width, height = 700, 700
    speed1 = [10,8]
    black = 0, 0, 0
    x=[];y=[];vx=[];vy=[];ec=[]
    rouge=(255,0,0)
     
    screen = pygame.display.set_mode(size)
     
    z=pygame.Surface((100,100))
    z.set_colorkey(black, 0)
    a=pygame.draw.circle(z,rouge,(50,50),50,0)
    zrect=z.get_rect()
     
    tt=[];vx=[];vy=[]
    t=0
     
    while 1:
       zgauche=float(zrect.left); zdroite=float(zrect.right); zhaut=float(zrect.top); zbas=float(zrect.bottom)
       zcx=float(zrect.center[0]);  zcy=float(zrect.center[1]) 
     
       if t==70:
    	break
       t=t+1
       tt.append(t)
       print zbas,speed1
       for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()
     
       c=0.01
     
       if zgauche < 0 or zdroite > width:
           speed1[0] = -(speed1[0]-c*speed1[0])
     
       if zhaut < 0 or zbas > height:
           speed1[1] = -(speed1[1]-c*speed1[1])
     
       zrect = zrect.move(speed1)
     
     
       screen.fill(black)
       screen.blit(z,zrect)
     
       pygame.display.flip()
    Alors, qu'en dites-vous?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    possible que le disque dépasse de trop les bords, avec les arrondis itou ...
    genre, la position est (-1.95,4), après rebond c'est (-0.2,4.2) ; tu vois ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Points : 94
    Points
    94
    Par défaut
    Salut !

    Lorsque le cercle arrive en dehors des bords de l'écran il se retrouve dans une position ou une partie de l'objet est inclue dans l'écran et une autre en dehors. Dans ton cas, lorsque la limite droite du carré dans laquelle est inscrit ton cercle (zdroite) dépasse la valeur maximum de l'écran tu inverses la vitesse pour faire rebondir le tout.

    Le soucis, c'est que suivant les situations, si ton cercle dépasse de l'écran de plus que le vecteur de vitesse, lorsque on passe à l'itération suivante de la boucle la limite droite du cercle est TOUJOURS en dehors de l'écran. Du coup, ton algorithme inverse à nouveau la vitesse : le cercle se dirige donc cette fois vers l'extérieur de l'écran et ainsi de suite. Au final, on voit le cercle glisser sur le bord.

    Pour éviter cela, quand tu détectes la sortie du cercle de l'écran, il faut le repositionner correctement (c'est-à-dire collé contre le bord de l'écran). De cette façon, lors du prochain déplacement ton cercle reste dans l'espace de l'écran. Sinon, plus simple, tu peux toujours annuler le dernier déplacement en faisant le chemin inverse. Le seul bémol avec cette méthode c'est que l'affichage de la collision ne sera pas parfait, contrairement à la première solution (pas tout à fait parfaite non plus, mais très raisonnable visuellement ).

    Je me relis... et j'espère être assez clair ^^Un schéma en dirait bien plus long, mais j'ai la flemme

Discussions similaires

  1. une page HTML qui comprenne Pygame ?
    Par pierrot54700 dans le forum Général Python
    Réponses: 0
    Dernier message: 07/10/2013, 02h52
  2. [CS3] une balle qui rebondit de tout les cotés du document
    Par carasmel dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 08/07/2011, 13h00
  3. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

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