Как мне изменить направление движения моих прямоугольников? - PullRequest
1 голос
/ 25 апреля 2009

Я очень новичок в программировании, так как он был только введен в мою школу как предмет, и мне нужна помощь. Мне было дано задание создать анимацию из трех шаров (прямоугольных изображений), прыгающих вокруг экрана и друг от друга. У меня есть три шара и отскакивание стен, но я не знаю, как заставить их отскакивать друг от друга. Любая помощь будет принята с благодарностью, мой текущий код выглядит следующим образом:

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

Ответы [ 3 ]

3 голосов
/ 25 апреля 2009

Когда два объекта «сталкиваются», они в основном существуют в одном физическом пространстве, и поэтому вы должны проверить это. В 2d это приятно и просто, особенно для прямоугольных форм. По сути, напишите функцию с именем «overlap», которая возвращает истинное значение, если два шарика сталкиваются. Например:

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

Я оставляю функцию перекрытия на ваше усмотрение, но вам следует зайти в Google "Обнаружение столкновений прямоугольника" и вы узнаете, как это сделать Вы поймете, что это на самом деле не так уж страшно и даст вам веру в то, что вы можете исследовать и изучать концепции программирования.

N.B. Конкретно не дал код на питоне. Так как это домашняя работа, ваша работа - написать ответ. Извините, просто политика ТАК. Надеюсь это поможет. :)

1 голос
/ 07 апреля 2010

Как добавил мой лектор к моей конкретной оценке по этому вопросу,

Как только второй шар подпрыгивает по рамке, добавьте код, чтобы изменить направления шариков, если они сталкиваются. PyGame предоставляет функцию, которая позволяет обнаруживать столкновение между двумя объектами Rect. Функция называется colliderect и вызывается следующим образом. Если два объекта Rect названы ball_boundary_1 и ball_boundary_2, вы можете проверить наличие столкновения с:

if ball_boundary_1.colliderect(ball_boundary_2):

    # alter the direction of the balls with the usual method

так, это будет использоваться для проверки «столкновения», возврата True и запуска некоторого кода для изменения скорости. удачи,: D Я действительно сделал это немного сам, я просто собираюсь попробовать

1 голос
/ 25 апреля 2009

Ну, у вас есть некоторые подсказки в коде, который вы предоставляете. То, как вы определяете, отскакивает ли мяч от стены, состоит в том, чтобы проверить, не превышает ли верхняя граница шара меньше 0, что означает, что он коснулся верхней границы и должен отскочить, чтобы вы изменили направление.

Итак, код:

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

в основном меняется на вертикальное движение мяча, если он подпрыгивает на полу или потолке.

Итак, чтобы изменить это, вам нужно спросить себя, что это значит, если два шара подпрыгивают друг на друга ... и это будет означать, что их границы перекрываются любым из множества способов. Так, например, вы можете проверить, находится ли левый или правый шарик 1 внутри горизонтальных размеров шарика 2, а верх или низ шарика 1 находится внутри вертикальных размеров шарика 2, тогда два шарика соприкасаются, поэтому измените скорость обоих шары.

...