Самый простой алгоритм для изменения направления при столкновении - PullRequest
0 голосов
/ 12 февраля 2012

Я преподаю Компьютерное программирование.Для студентов первого курса я ищу наиболее простой алгоритм изменения направления при столкновении (с оконной рамой).Это мой настоящий код:

import sys, pygame
pygame.init()
speed_x = 1
speed_y = 1

black = (0, 0, 0)
width, height = 320, 240
size = ( width, height )

screen = pygame.display.set_mode(size)
display_surface = pygame.display.get_surface()
display_rectangle = display_surface.get_rect()

ball_img = pygame.image.load("data/ball.gif")
ball = ball_img.convert_alpha()
ballrect = ball.get_rect()

while 1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()

        if not display_rectangle.contains( ballrect.move([speed_x, 0]) ):
            speed_x *= -1
        else:
            ballrect = ballrect.move([speed_x, 0])

        if not display_rectangle.contains( ballrect.move([0, speed_y]) ):
            speed_y *= -1
        else:
            ballrect = ballrect.move([0, speed_y])  

        screen.fill(black)
        screen.blit(ball, ballrect)
        pygame.display.flip()
        pygame.time.delay(30)

Этот код работает нормально, у меня вопрос, если кто-то знает о простом алгоритме или ясном алгоритме для изменения направления с использованием contains или любой другой collide пигмеtest.

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

Все предложения приветствуются

Некоторые предложения?Спасибо!

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Ваш код, вероятно, работает нормально (я не пробовал, но, кажется, хорошо), но у меня смешанные чувства по этому поводу. Вы проверяете x-движение, а затем y-движение, что нормально, но Rect.contains () проверяет и x, и y, поэтому мне это кажется немного избыточным.

И, в зависимости от вашего образования, оно как бы скрывает то, что вы делаете.

Думаю, я бы хотел проверить все вручную:

if display_rectangle.left<=ballrect.left+speed_x or display_rectangle.right<=ballrect.right+speed_x
    speed_x*=-1
if display_rectangle.top<=ballrect.top+speed_y or display_rectangle.bottom<=ballrect.bottom+speed_y
    speed_y*=-1

ballrect.move([speed_x, speed_y])

КСТАТИ: почему он прямолинейный, а не шариковый?

1 голос
/ 12 февраля 2012

Я думаю, что ваш подход в порядке. Ваш код моделирует скорость мяча, используя 2-вектор [speed_x, speed_y]. Отражение от (горизонтальной или вертикальной) стены включает отрицание соответствующего компонента вектора.

До тех пор, пока у ваших учеников есть опыт начального уровня физики (скорость, импульс, столкновения), ваш код должен быть понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...