2012-02-11 1 views
0

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

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 Pygame.

Несколько раз я считаю, что подход для студентов является самым легким, и появляется новый четкий подход.

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

Некоторые предложения? Благодаря!

+0

Я не пробовал ваш код, но похоже, что он, вероятно, сработает. Каков твой вопрос? –

+0

@GregHewgill, спасибо за ваш комментарий, да, это работает, я редактировал вопрос. – danihp

ответ

1

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

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

1

Ваш код, вероятно, работает нормально (я не пробовал, но это кажется прекрасным), но у меня смешанные чувства по этому поводу. Вы проверяете 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]) 

КСТАТИ: почему это ballrect и не ball_rect?

+0

Спасибо за ball_rect, я исправлю это. Если я проверю оба, x и y, за один раз, мяч возвращается с того же самого пути, что и он, и это не то, что мы хотим (если мяч идет вверх и сталкивается с полом, тогда только компонент Y должен быть изменен) – danihp

+0

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

Смежные вопросы