Как стрелять во время движения в пигме - PullRequest
2 голосов
/ 31 января 2020

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

def move(self):
    keys = pygame.key.get_pressed()

    if keys[pygame.K_d]:
        self.x += self.speed
    if keys[pygame.K_a]:
        self.x -= self.speed

И для стрельбы я делаю это:

     def handle_events():
          if event.type ==  pygame.MOUSEBUTTONDOWN:
          game.bullets.append(Bullet())

Любая помощь будет принята с благодарностью. Также примечание: если кто-то знает о чем-то в коде в целом, что может вызвать это (поскольку это происходит во всех моих играх), размещает комментарий, чтобы я мог обновить вопрос с помощью соответствующего кода, так как сейчас я понятия не имею, что может быть причиной это.

Редактировать: Недавно я заметил, что игрок все еще может стрелять, когда его притягивает сила тяжести (которая технически все еще движется). Поэтому я предполагаю, что что-то происходит, когда я нажимаю клавиши (любую клавишу, а не только те, которые я включил в код), что делает игрока неспособным стрелять.

Моя handle_evnets() функция буквально только обрабатывает закрытие игра и нажатие кнопки мыши. Вот код в любом случае:

   def handle_events():
        for event in events:
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type ==  pygame.MOUSEBUTTONDOWN:
                game.bullets.append(Bullet())

Вот класс пули, который добавляется к game.bullets, если MOUSEBUTTONDOWN

class Bullet:
        def __init__(self):
            self.pos = [(player.x - 10 - scroll[0]), (player.y + 15 - scroll[1])]
            self.height = 3
            self.width = 20
            self.bullet = pygame.Surface((self.width, self.height)).convert_alpha()
            self.bullet.fill((255, 255, 255))
            self.dir = [(mouse.x - (player.x - 10 - scroll[0])),  (mouse.y - (player.y + 15 - scroll[1]))]
            self.distance = math.hypot(self.dir[0], self.dir[1])
            self.dir = [(self.dir[0]/ self.distance), (self.dir[1]/ self.distance)]
            angle = math.degrees(math.atan2((-self.dir[1]), self.dir[0]))
            self.bullet = pygame.transform.rotate(self.bullet, (angle))
            self.speed = 10

Вот класс Game и что происходит с маркером после его добавления к этому классу, который является shoot_bullet() функцией.

 class Game:
    def __init__(self):
    self.bullets = []


    def shoot_bullet(self):
        for bullet in self.bullets:
            bullet.pos[0] += bullet.dir[0] * bullet.speed
            bullet.pos[1] += bullet.dir[1] * bullet.speed
            D.blit(bullet.bullet, (bullet.pos[0], bullet.pos[1]))

1 Ответ

1 голос
/ 31 января 2020

Я думаю, что на самом деле все сводится к тому, что «pygame.MOUSEBUTTONDOWN» не работает, если нажата какая-либо клавиша.

Нет. Проблема связана с переменной events:

def handle_events():
   for event in events:
       #[...]

       if event.type ==  pygame.MOUSEBUTTONDOWN:
           game.bullets.append(Bullet())

Вышеуказанная функция обращается к переменной events в глобальном пространстве имен, но этот список, похоже, не содержит события вообще.
Где-то в вашем коде вы делаете events = pygame.event.get(). Но это, вероятно, в рамках функции или метода. В результате создается новая переменная events в локальном пространстве имен, а глобальная переменная events не обновляется.

У вас есть 2 возможности для решения проблемы. Либо добавьте аргумент handle_events и передайте events в handle_events:

def handle_events(events):
    for event in events:
        #[...]

        if event.type ==  pygame.MOUSEBUTTONDOWN:
            game.bullets.append(Bullet())

, либо убедитесь, что переменная events в глобальном пространстве имен установлена ​​при получении событий, с помощью global выписка .
Где бы вы ни делали events = pygame.event.get(), добавьте global events прямо перед:

global events
events = pygame.event.get() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...