2012-01-11 2 views
1

Моя цель заключается в том, чтобы моя программа могла обнаруживать столкновение, когда спрайт шара попадает в любой из спрайтов «g_ball». Код случайно обнаруживает столкновение, и у меня есть инструкция «print», чтобы проверить его ... но это ПОСТОЯННО печатает «прогресс», хотя ни один из спрайтов не трогает. Вот код:Программа обнаружения столкновения, даже если спрайты не буквально сталкиваются «pygame.sprite.collide_rect»

while 1: 
    screen.blit(background, (0,0)) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 


     if event.type == KEYDOWN: 
      if event.key == K_a: 
       m_x = -4 
       s+=1 
      elif event.key == K_d: 
       m_x = +4 
       s2+=1 
     if event.type == KEYUP: 
      if event.key == K_a: 
       m_x = 0 
      elif event.key == K_d: 
       m_x = 0 

    x+= m_x 
    y+= m_y  

    ball = pygame.sprite.Sprite() 
    ball.image = pygame.image.load('red_ball.png').convert() 
    ball.rect = ball.image.get_rect() 
    ball.image.set_colorkey((white)) 
    screen.blit(ball.image,(x,y)) 
    if x > 640: 
     x = 0 
    if x < 0: 
     x = 640 


    g_ball = pygame.sprite.Sprite() 
    g_ball.image = pygame.image.load('green_ball.png').convert() 
    g_ball.rect = g_ball.image.get_rect() 
    g_ball.image.set_colorkey(white) 
    screen.blit(g_ball.image,(50,t)) 
    t+=5 
    if t > 521: 
     t = 0 
    collision = pygame.sprite.collide_rect(ball, g_ball) 
    if collision == True: 
     print ('PROGRESS!!!') 

ответ

0

Это потому, что у вас нет смещения установить для столкновения, вы прошли только смещение screen.blit.

Ваш фиксированный код будет таким:

... 
ball.rect = ball.image.get_rect() 
ball.rect.topleft = (x, y) 
... 
g_ball.rect = g_ball.image.get_rect() 
g_ball.rect.topleft = (50, t) 
... 
0

nightcracker прав. Вы понимаете, что вы делаете в этом цикле (который должен работать как можно быстрее)? вы создаете 2 новых шара, вы загружаете изображение с hd, вы помещаете их в (0,0), а затем вы печатаете их вручную на экране в заданной позиции. Эта последняя часть означает, что вы показываете их где-то, но не там, где они есть на самом деле (вы установили свою реальную позицию с ball.rect = ball.image.get_rect()). Они действительно находятся в (0,0) и постоянно сталкиваются.

Способ, которым вы блистете их на экран, не очень хорошо, вы должны использовать средство визуализации. В любом случае, вы должны сначала попробовать некоторые уроки, узнать, что такое поверхность и что такое Sprite. Будьте осторожны с тем, что вы помещаете в основной цикл (почему вы создаете новые шары все время? Они могут быть созданы один раз при запуске), ваш код будет красивее, а ваш FPS увеличится

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