Игра не отслеживает нажатия клавиш сама по себе pygame

Изучаю пайтон, прохожу курс в котором автор показывает пример написание игры на Pygame Суть вопроса заключается в том, что игра сама по себе без каких-либо изменений в коде может перестать отвечать на нажатия клавиш движения (A, D)

Игра может прекрасно работать, но через некоторое время, даже если я не трогаю код - игра перестает реагировать на нажатия A и D Если такое случается - я меняю в файле controls любой символ, условно просто добавляю пробел к комментарию или меняю elif на if - игра начинает работать корректно, но спустя еще какое-то время снова перестает работать Пули которые выпускает пушка работает всегда, не зависимо от того работает ли перемещение пушки.

main.py

import pygame
import controls
from gun import Gun                         # Тащим пушку
from pygame.sprite import Group             # Тащим пулю

def run_Game():
    pygame.init()                                           # Инициализирует игру
    screen = pygame.display.set_mode(size=(1280, 720))      # Задаем размер окна
    pygame.display.set_caption("igra")                      # Задаем название окна
    bg_color = (0, 0, 0)                                    # Задаем цвет фона
    gun = Gun(screen)                                       # Присасываем пушку из gun.py в screen
    bullets = Group()                                       # Создаем контейнер для пуль
    run = True

    while run:                                                          # Основной цикл игры

        controls.events(gun, screen, bullets)                           # Вызываем действия
        gun.update_gun()                                                # Обновляем позицию пушки
        controls.update_display(bg_color, screen, gun, bullets)         # Вызываем обновление экрана
        controls.remove_bullets(bullets)                                # Обновдение и удаление пулек


run_Game()

controls.py

import pygame
import sys
from bullet import Bullet


def events(gun, screen, bullets):       # Oбработчик событий

    for event in pygame.event.get():    # Отслеживание событий клавиатуры и мыши
        if event.type == pygame.QUIT:   # Если игрок закрыл игру
            sys.exit()                  # Игра закрывается (отключаем тригер)

                # Едем вправо
        elif event.type == pygame.KEYDOWN:      # Нажатие кнопки
            if event.key == pygame.K_d:         # Если нажата кнопка
                print('1')
                gun.mright = True               # Движение вправо активно (из gun.py)

                # Едем влево
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:     # Если нажата кнопка А
                    gun.mleft = True            # Движение влево активно (из gun.py)

                # Создаем пульку
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:         # Если нажат пробел
                        new_bullet = Bullet(screen, gun)    # Создаем пульку из класса bullet.py
                        bullets.add(new_bullet)             # Кладем пульку в контейнер

                # Не едем вправо
        elif event.type == pygame.KEYUP:        # Отжатие кнопки
            if event.key == pygame.K_d:         # Если отжата кнопка D
                gun.mright = False              # Движение вправо не активно (из gun.py)

                # Не едем влево
            elif event.key == pygame.K_a:         # Если отжата кнопка А
                gun.mleft = False                 # Движение влево не активно (из gun.py)


def update_display(bg_color, screen, gun, bullets):         # Обновление экрана

    screen.fill(bg_color)                                   # Задаем цвет фона

    for bullet in bullets.sprites():                        # Рисуем пульки задним слоем от пушки
        bullet.draw_bullet()

    gun.output()                                            # Отрисовываем пушку
    pygame.display.flip()                                   # Прорисовка последнего экрана


def remove_bullets(bullets):                                # Удаляем пульки после границы

    bullets.update()                                        # Обновляем пули
    for bullet in bullets.copy():                           # Проверяем каждую пульку в контейнере
        if bullet.rect.bottom <= 0:                         # Если пулька ушла за границу экрана
            bullets.remove(bullet)                          # Говорим ей "пака"


gun.py

import pygame

"""Отображение элементов делаем через прямоугольники обращаясь к их координатам"""


class Gun():

    def __init__(self, screen):                                                 # Инициализация пушки на экран (screen)

        self.screen = screen                                                    # Загружаем экран
        self.image = pygame.image.load('image/gun.png')                         # Загружаем пушку
        self.rect = self.image.get_rect()                                       # Создаем прямоугольник и получаем в него пушку как прямоугольник
        self.screen_rect = screen.get_rect()                                    # Получаем экран в качестве прямоугольника
        self.rect.centerx = self.screen_rect.centerx                            # Координата центра пушки будет по центру screen по Х
        self.centre = float(self.rect.centerx)                                  # Объект принимает не только целые числа (для скорости с ".")
        self.rect.bottom = self.screen_rect.bottom                              # Задаем нижнюю координату У
        self.mright = False                                                     # Движение вправо
        self.mleft = False                                                      # Движение влево

    def output(self):                                                           # Выводим пушку на экран

        self.screen.blit(self.image, self.rect)                                 # Отрисовка пушки как прямоугольник на экране

    def update_gun(self):                                                       # Обновление позиции пушки
        if self.mright and self.rect.right < self.screen_rect.right:            # Если движение вправо активно и Х пушки меньше Х правой границы экрана
            self.centre += 3.5                                                  # Едем вправо на 1 пиксель

        if self.mleft and self.rect.left > self.screen_rect.left:               # Если движение влево активно и Х пушки меньше Х левой границы экрана
            self.centre -= 3.5                                                  # Едем влево на 1 пиксель

        self.rect.centerx = self.centre                                         # Центр пушки принмает числа float

bullet.py

import pygame

"""Создаем пулю в позиции пушки"""


class Bullet(pygame.sprite.Sprite):

    def __init__(self, screen, gun):                                        # Инициализация пули на экран и пушку
        super(Bullet, self).__init__()                                      # Берем init из класса
        self.screen = screen                                                # Загружаем экран
        self.rect = pygame.Rect(0, 0, 6, 16)                                # Делаем пулю прямоугольником. Х, У, ширина, выоста
        self.color = 255, 255, 255                                          # Цвет пули в RGB
        self.speed = 3.5                                                    # Скорость пули
        self.rect.centerx = gun.rect.centerx                                # Пуля появляется по Х координате пушки
        self.rect.top = gun.rect.top                                        # Пуля появляется в верхней части пушки
        self.y = float(self.rect.y)                                         # Объект принимает не только целые числа (для скорости с ".")

    def update(self):                                                       # Перемещение пули по Y
        self.y -= self.speed                                                # Пуля перемещается относительно скорости
        self.rect.y = self.y                                                # Обновляем позицию пули

    def draw_bullet(self):                                                  # Отрисовываем пулю
        pygame.draw.rect(self.screen, self.color, self.rect)                # Рисуем пушку на экране с цветом и размерами

Так же присутствует проблема, что все объекты в игре перемещаются по экрану с микро-фризами, иногда плавно, иногда дергаются. Не понимаю с чем это может быть связано. Спасибо


Ответы (0 шт):