#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 кадров. Не уверен, как найти точную сумму, но, похоже, пока это работает. Большое спасибо за вашу помощь!