Ошибка имени функции не определена, когда я пытаюсь использовать рекурсию - PullRequest
1 голос
/ 10 января 2020

Я хочу сделать игрока, который может стрелять пулями. Для этого я попытался определить функцию shoot, которая вызывается при нажатии клавиши пробела. Функция выглядит следующим образом (p - объект игрока, кстати):

class bullet:
    def __init__(self):
        self.x = None
        self.y = None
        self.radius = 10
        self.shooting = False
        self.speed = 5

    def shoot(self):
        self.shooting = True
        if  self.shooting == True:
            self.x = (p.x + 60)
            self.y = (p.y + 25)
            self.x += self.speed
            self.y += self.speed
            pygame.draw.circle(d, (0, 0, 0), (self.x, self.y), self.radius)

        shoot()

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

    shoot()
NameError: name 'shoot' is not defined

Как я вызвал функцию:

while True:
    d.fill((98, 98, 98))
    p.draw()

    for event in pygame.event.get():
        pass

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            b.shoot()

Что-то, что я заметил, это то, что если я удалю рекурсию shoot() в конце функции shoot(), она запускается, но пуля остается в том же месте, пока пространство удерживается (как и ожидалось, поскольку рекурсия была удалена). Как я могу решить эту проблему? Спасибо

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Я думаю, вы должны заменить рекурсивный вызов shoot() на self.shoot() внутри метода shoot. Это должно избавить от проблемы, а также дать вам рекурсивную функцию, которую вы хотите.

2 голосов
/ 10 января 2020

shoot это не функция, строго говоря. Это метод экземпляра, который должен вызываться из объекта bullet. Вам нужно использовать

self.shoot()

для рекурсии.

Однако это плохой способ сохранить движение пули. Это работа для всех oop. Рекурсию лучше всего использовать, когда вы вызываете подпрограмму с уменьшенной версией проблемы; это просто продолжение.

    while self.shooting == True:
        self.x = (p.x + 60)
        self.y = (p.y + 25)
        self.x += self.speed
        self.y += self.speed
        pygame.draw.circle(d, (0, 0, 0), (self.x, self.y), self.radius)

Это поднимает вопрос о том, как вы собираетесь прекратить движение пули. Вам нужно что-то вроде

        self.shooting = (self.x <= x_limit) and \
                        (self.y <= y_limit)

Где x / y_limit - верхние границы в этом направлении движения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...