Игра не отслеживает нажатия клавиш сама по себе 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) # Рисуем пушку на экране с цветом и размерами
Так же присутствует проблема, что все объекты в игре перемещаются по экрану с микро-фризами, иногда плавно, иногда дергаются. Не понимаю с чем это может быть связано. Спасибо