Pygame Bullet Movement

Итак, я пытался закодировать игру с космическими захватчиками, и я застрял, пытаясь понять, как стрелять пулями, чтобы они выглядели как анимация, а не телепортировались в конечную позицию, где они сталкиваются (вверху экрана), и я не знаю как это сделать, я много пытался понять, но ничего не помогало, просто продолжала телепортироваться. Примечание: player - это экземпляр класса Player, поэтому я использовал «player». Я просто пытаюсь практиковать классы

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        while player.bullet_rect.y > 0:
            player.bullet_rect.y -= bullet_velocity

person Irkl1_    schedule 07.02.2021    source источник
comment
Этот вопрос повторяется. Его спрашивали 100 раз, и ответ все тот же.   -  person Rabbid76    schedule 07.02.2021


Ответы (1)


Вы должны реализовать перемещение маркера в цикле приложения, а не в дополнительном цикле внутри цикла событий. Добавьте переменную fired, которая указывает, выстрелило ли нажатие SPACE. Переместите маркер, когда установлен fired status. Сбросьте fired, когда пуля достигнет верхней части экрана:

fired = False

while run:
    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                fired = True

    if fired:
        player.bullet_rect.y -= bullet_velocity
        if player.bullet_rect.y < 0:
            fired = False

Общий подход к стрельбе пулями состоит в том, чтобы сохранить позиции пуль в списке (bullet_list). Когда пуля выстрелит, добавьте копию прямоугольника маркера в список. Исходная позиция - это позиция игрока. Используйте цикл for для перебора всех маркеров в списке. Переместите положение каждой отдельной пули в петле. Удалите маркер из списка, который покидает экран (bullet_list.remove(bullet_pos)). По этой причине необходимо выполнить копию списка (bullet_list[:]) (см. Как удалить элементы из списка во время итерации?). Используйте еще один for-цикл, чтобы blit оставшиеся маркеры на экране:

bullet_list = []

while run:
    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                
                # create bullet rectangle with the position of the player
                bullet_rect = 
                
                bullet_list.append(bullet_rect)

    for bullet_rect in bullet_list[:]:
        bullet_rect.y += bullet_velocity
        if bullet_rect.y < 0:
            bullet_list.remove(bullet_rect)

    # [...]

    for bullet_rect in bullet_list[:]
        # draw bullet at bullet_rect 
        # [...]
person Rabbid76    schedule 07.02.2021