Программа, обнаруживающая столкновение, хотя спрайты не сталкиваются буквально - PullRequest
1 голос
/ 11 января 2012

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

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!!!')

Ответы [ 2 ]

0 голосов
/ 12 января 2012

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

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

0 голосов
/ 11 января 2012

Это потому, что у вас нет смещения, установленного для столкновения, вы только передали смещение 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)
...
...