2009-04-25 7 views
1

Ich bin sehr neu im Programmieren, da es erst als Thema in meine Schule eingeführt wurde und ich Hilfe brauche. Mir wurde die Aufgabe gestellt, eine Animation von drei Bällen (Rechteckbildern) zu haben, die um den Bildschirm und voneinander abprallen. Ich habe die drei Bälle und das Aufprallen der Wände alle gut, aber ich weiß nicht, wie sie sich gegenseitig abprallen lassen. Jede Hilfe wäre sehr dankbar, mein aktueller Code ist wie folgt:Wie ändere ich die Richtung, in der sich meine Rechtecke bewegen?

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() 

Antwort

3

Wenn zwei Objekte ‚Collide‘ sie existieren im Grunde in dem gleichen physischen Raum und deshalb müssen Sie dies überprüfen. In 2d ist dies besonders für rechteckige Formen schön und einfach. Im Grunde schreiben Sie eine Funktion namens "Überlappung", die einen wahren Wert zurückgibt, wenn zwei der Kugeln kollidieren. Zum Beispiel:

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; 
     } 
    } 
} 

Ich werde die Überdeckungsfunktion Ihnen überlassen, aber Sie sollten ‚rectangluar Kollisionserkennung‘ Google und Sie werden herausfinden, wie. Sie werden sehen, dass es wirklich nicht so beängstigend ist und Ihnen Glauben geben wird, dass Sie Programmierkonzepte erforschen und lernen können.

N.B. Speziell gab Python-Code nicht. Da es Hausaufgaben sind, ist es deine Aufgabe, die Antwort zu schreiben. Entschuldigung, nur eine SO-Richtlinie. Hoffe das hilft. :)

1

Nun, Sie haben tatsächlich einige Hinweise in dem Code, den Sie bereitstellen. Die Art und Weise, wie Sie feststellen, ob der Ball an der Wand springt, besteht darin, zu überprüfen, ob die obere Grenze des Balls kleiner als 0 ist, dh, dass er die obere Grenze berührt hat und zurückspringen muss.

So ist der Code:

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

ändert sich im Grunde auf eine vertikale Bewegung des Balles, wenn er auf dem Boden oder an der Decke springt.

Um dies zu ändern, müssen Sie sich selbst fragen, was es bedeutet, wenn zwei Bälle aufeinander prallen ... und es würde bedeuten, dass sich ihre Grenzen in vielerlei Hinsicht überschneiden. So können Sie zum Beispiel prüfen, ob sich links oder rechts von Ball 1 innerhalb der horizontalen Abmessungen von Ball 2 befindet UND ob oben oder unten Ball 1 innerhalb der vertikalen Abmessungen von Ball 2 liegt. Dann berühren sich die beiden Bälle und ändern die Geschwindigkeit von beiden Bälle.

1

Als mein Dozent an meine besondere Beurteilung dieser hinzugefügt,

Sobald eine zweite Kugel um den Rahmen hüpft, fügen Sie einige Code, um die Richtungen der Kugeln zu ändern, wenn sie kollidieren. PyGame bietet eine Funktion, mit der Sie erkennen können, ob eine Kollision zwischen zwei Rect-Objekten aufgetreten ist. Die Funktion heißt colliderect und wird folgendermaßen aufgerufen. Wenn zwei Rect Objekte ball_boundary_1 und ball_boundary_2 benannt sind, könnten Sie für eine Kollision überprüfen:

if ball_boundary_1.colliderect(ball_boundary_2): 

    # alter the direction of the balls with the usual method 

so würde dies zu überprüfen verwendet werden, ‚wenn‘ eine Kollision auftritt, True zurück und einige Code ausführen, um umgekehrte Geschwindigkeit. Viel Glück,: D Ich habe dieses Bit noch nicht selbst gemacht, ich bin gerade dabei es auszuprobieren

Verwandte Themen