2009-04-25 8 views
1

Je suis très novice en programmation car elle vient tout juste d'être introduite dans mon école et j'ai besoin d'aide. On m'a confié la tâche d'avoir une animation de trois balles (images rectangle) qui rebondissent autour de l'écran et se décollent mutuellement. J'ai les trois balles et le rebondissement des murs, mais je ne sais pas comment les faire rebondir. Toute aide serait grandement appréciée, mon code actuel est la suivante:Comment inverser la direction de déplacement de mes rectangles?

import pygame 
import random 
import sys 

if __name__ =='__main__': 

    ball_image1 = 'beachball1.jpg' 
    ball_image2 = 'beachball2.jpg' 
    ball_image3 = 'beachball3.jpg' 
    bounce_sound = 'thump.wav' 
    width = 800 
    top = 600 
    x = 0 
    y = 0 
    background_colour = 0,0,0 
    caption= 'Bouncing Ball animation' 
    velocity1 = [-1,-1] 
    velocity2 = [-1,1] 
    velocity3 = [1,-1] 
    pygame.init() 
    frame = pygame.display.set_mode ((width, top)) 
    pygame.display.set_caption (caption) 
    ball1= pygame.image.load (ball_image1). convert() 
    ball2= pygame.image.load (ball_image2). convert() 
    ball3= pygame.image.load (ball_image3). convert() 
    ball_boundary_1 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550))) 
    ball_boundary_2 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550))) 
    ball_boundary_3 = ball2.get_rect (center=(random.randint(50, 750),random.randint(50, 550))) 
    sound = pygame.mixer.Sound (bounce_sound) 
    while True: 
     for event in pygame.event.get(): 
      print event 
      if event.type == pygame.QUIT: sys.exit(0) 
     if ball_boundary_1.left < 0 or ball_boundary_1.right > width: 
      sound.play() 
      velocity1[0] = -velocity1[0] 
     if ball_boundary_1.top < 0 or ball_boundary_1.bottom > top: 
      sound.play() 
      velocity1[1] = -velocity1[1] 
     if ball_boundary_2.left < 0 or ball_boundary_2.right > width: 
      sound.play() 
      velocity2[0] = -velocity2[0] 
     if ball_boundary_2.top < 0 or ball_boundary_2.bottom > top: 
      sound.play() 
      velocity2[1] = -velocity2[1] 
     if ball_boundary_3.left < 0 or ball_boundary_3.right > width: 
      sound.play() 
      velocity3[0] = -velocity3[0] 
     if ball_boundary_3.top < 0 or ball_boundary_3.bottom > top: 
      sound.play() 
      velocity3[1] = -velocity3[1] 

     ball_boundary_1 = ball_boundary_1.move (velocity1) 
     ball_boundary_2 = ball_boundary_2.move (velocity2) 
     ball_boundary_3 = ball_boundary_3.move (velocity3) 
     frame.fill (background_colour) 
     frame.blit (ball1, ball_boundary_1) 
     frame.blit (ball2, ball_boundary_2) 
     frame.blit (ball3, ball_boundary_3) 
     pygame.display.flip() 

Répondre

3

Lorsque deux objets de la Collide 'ils existent essentiellement dans le même espace physique et donc vous devez vérifier cela. En 2d c'est agréable et facile, surtout pour les formes rectangulaires. Fondamentalement, écrivez une fonction appelée 'overlap' qui renvoie une valeur vraie si deux des billes entrent en collision. Par exemple:

for (i = 0; i < numberOfBalls; i++) { 
    for (j = i+1; j < numberOfBalls; j++) { 
     if (overlap (ball_rect[i], ball_rect[j])) { 
      // you will need to write this reverse velocity code differently 
      // to comply with the code above but I recommend that the balls 
      // go in an array with three elements so that you can index 
      // them. (Useful in for loops as seen above) 
      ball_xvelocity[i] *= -1; 
      ball_xvelocity[j] *= -1; 
      ball_yvelocity[i] *= -1; 
      ball_yvelocity[j] *= -1; 
     } 
    } 
} 

je quitterai la fonction de recouvrement à vous, mais vous devez google « détection de collision rectangluar » et vous découvrirez comment. Vous verrez que ce n'est vraiment pas si effrayant et vous donnera la foi que vous pouvez rechercher et apprendre des concepts de programmation.

N.B. Plus précisément n'a pas donné de code python. Comme c'est le devoir, il est de votre devoir d'écrire la réponse. Désolé, juste une politique SO. J'espère que cela t'aides. :)

1

Eh bien, vous avez effectivement quelques indices dans le code que vous fournissez. La façon dont vous êtes en train de détecter si la balle rebondit sur le mur est de vérifier si la limite supérieure de la balle est inférieure à 0, signifiant qu'elle a touché la limite supérieure et doit rebondir pour changer de direction.

Ainsi, le code:

if ball_boundary_1.top < 0 or ball_boundary_1.bottom > top: 
     sound.play() 
     velocity1[1] = -velocity1[1] 

change fondamentalement au mouvement vertical de la balle si elle rebondit sur le plancher ou le plafond. Donc, pour modifier cela, vous devez vous demander ce que cela signifie si deux balles rebondissent l'une sur l'autre ... et cela signifierait que leurs limites se chevauchent de plusieurs façons. Ainsi, par exemple, vous pouvez vérifier si la gauche ou la droite de la balle 1 est à l'intérieur des dimensions horizontales de la balle 2 ET si la balle 1 est à l'intérieur des dimensions verticales de la balle 2, alors changez la vitesse des deux. des balles.

1

Comme mon professeur a ajouté à mon évaluation particulière sur ce point,

Une fois une seconde balle rebondit autour du cadre, ajouter un peu de code pour changer les directions des boules si elles entrent en collision. PyGame fournit une fonction qui vous permet de détecter si une collision s'est produite entre deux objets Rect. La fonction s'appelle colliderect et est appelée de la manière suivante. Si deux objets Rect sont nommés ball_boundary_1 et ball_boundary_2, vous pouvez vérifier une collision avec:

if ball_boundary_1.colliderect(ball_boundary_2): 

    # alter the direction of the balls with the usual method 

, onpeut être utilisé pour vérifier « si » une collision, le retour est vrai, et exécuter un code à vitesse inverse. bonne chance,: D Je n'ai pas encore fait ce bit moi-même, je suis sur le point de l'essayer