Ошибка обнаружения столкновений Pygame

#python-3.x #pygame

#python-3.x #pygame

Вопрос:

Создание быстрой программы, в которой пользователь стреляет в движущуюся цель на противоположной стороне экрана. Пользователь может пропустить цель 3 раза, а затем игра окончена. Я обнаруживаю промахи и соответственно добавляю их к общему количеству, но когда происходит столкновение между целью и пулей (попадание!) Я вычитаю из общей суммы, по сути, сбрасывая ее. Теперь я ожидаю, что он только вычтет «1», но по какой-то причине он вычитает кучу и все испортит. Есть идеи относительно того, почему это происходит, и есть ли лучший способ сделать это? Цель — pygame.Прямоугольник, маркеры — это спрайты, а корабль — это изображение.

 def update_bullets(ai_settings, screen, stats, ship, bullets, target):
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.left >= ai_settings.screen_width:
            bullets.remove(bullet)
            stats.number_of_misses  = 1
    check_bullet_target_collisions(ai_settings, screen, stats, ship, bullets, target)
    if stats.number_of_misses >= stats.max_number_of_misses:
        stats.number_of_misses = 0
        stats.game_active = False
        bullets.empty()
        pygame.mouse.set_visible(True)      

def check_bullet_target_collisions(ai_settings, screen, stats, ship, bullets, target):      
    bullet_hit = pygame.sprite.spritecollideany(target, bullets)
    if bullet_hit:
        print("how many times")
        stats.number_of_misses -= 1
  

Ответ №1:

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

Решением этой проблемы было бы уничтожить цель после ее столкновения в первом кадре столкновения или уничтожить пулю при первом столкновении.

Превращение целей в простые спрайты и замена bullet_hit = pygame.sprite.spritecollideany(target, bullets)

с bullet_hit = pygame.sprite.spritecollide(target, bullets, True)

Следует «уничтожить» маркер, удалив его из группы спрайтов. Это может быть неприменимо к вашей программе, но, надеюсь, это должно дать представление о том, что вызывает проблему (множественные столкновения с одной и той же пулей на одной и той же цели).

Комментарии:

1. Хороший материал, вы абсолютно правы. Я попробовал ваше предложение, но не смог заставить его работать, поэтому я выбрал грязный / ленивый выход и вычел «.10» из «stats.number_of_misses», а затем преобразовал его в «int» для учета кадров. Я поиграю с другими альтернативами. Основная проблема заключается в том, что я работаю в предположении, что каждый раз будет 10 кадров. Не уверен, как найти точную сумму, но, похоже, пока это работает. Большое спасибо за вашу помощь!