Не могу настроить управление игры, написанную на питоне
файл Alien_invasion.py
import sys # Модуль sys будет завершать по команде игру
import pygame # Модуль pygame содержит всю функциаеалность для создания игры
from settings import Settings # иморптруем settings
from ship1 import Ship # импортируем ship
import game_functions as gf
def run_game(): # Определяем функцию
pygame.init() # Инициализруем настроки pygame
ai_settings = Settings() # Ипортируем класс settigs и вставляем ai_settings
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) # Используем атрибуты для создания формата окна
screen = pygame.display.set_mode((1700, 1000)) # Создаем отображаемую область, аргуметы означают размеры игрового окна
pygame.display.set_caption("Alien Invasion") # Отображение названия игры
bg_color = (230, 230, 230) # выбрали цвет экрана
ship = Ship(screen) # Создаем корабль до начала цикла while
while True: # Запускаем цикл
gf.check_events(ship)
ship.update()
gf.update_screen(ai_settings, screen, ship)
for event in pygame.event.get(): # Чтобы наша прогрмма реагировала на акие либо действия напишем цикл for. Используем метод pygame.event.get():, чтобы получать доступ к событиям
if event.type == pygame.QUIT: # Пишем if для обнаружение и обработки конкретных действий
sys.exit() # Например мы закрываем программа, он обнаруживает pygame.QUIT: и вызывает sys.exit() который завершает игру
screen.fill(bg_color) # Заполняем экран выбранным цветом фона
screen.fill(ai_settings.bg_color) # Используем атрибут для создания цвкта фона
ship.blitme() # Выводим корабль поверх фона
pygame.display.flip() # При запуске буде твыводиться новый экран
run_game() # Запускаем игру
файл ship.py
import pygame
class Ship():
def __init__(self, screen):
self.screen = screen
self.image = pygame.image.load('/Users/alexey/Dropbox/Мой Mac (FeelQueen’s iMac)/Documents/Python/rocket-147466_640.bmp') # Возврашает картинку коробля
self.rect = self.image.get_rect() # С поиощью метода get получили изображение
self.screen_rect = screen.get_rect() #
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom # центрируем изоюражение
self.moving_right = False
self.moving_left = False
def update(self): # Этот метод перемешает корабль, есди флаг self.moving_right = True
if self.moving_right == True:
self.rect.centerx += 1
if self.moving_left == True:
self.rect.centerx -= 1
def blitme(self):
self.screen.blit(self.image, self.rect)
setting.py
class Settings():
def __init__(self):
self.screen_width = 1700
self.screen_height = 1000
self.bg_color = (230, 230, 230)
self.ship_speed_factor = 8
game_funcyions.py
import sys
import pygame
def check_events(ship): # Реакции на нажатие клавиш
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.moving_right = True
if event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
if event.key == pygame.K_LEFT:
ship.moving_left = False
def update_screen(ai_settings, screen, ship): # Обновление экрана при нажатии клавиш, то есть отображение перемешения корабля
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
Когда я запускаю программу, нажимаю кнопку вправо и цикл выполняешься без остановки, должно быть так: Я отпускаю правую кнопку и перемещение корабля останавливается, так же не понимаю почему кнопка влево не работает от слова совсем
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Разберитесь с табуляциями. Как сейчас у вас код не скомпилируется. Но если убрать один пробел, то проблемы с табуляцией и логикой останутся:
if self.moving_right == True:
self.rect.centerx += 1
if self.moving_left == True:
self.rect.centerx -= 1
Тут if self.moving_left проверяется только если выполняется if self.moving_right. Проверки должны быть на одном уровне:
if self.moving_right == True:
self.rect.centerx += 1
if self.moving_left == True:
self.rect.centerx -= 1
Тоже самое с проверками на нажатие и отпускание клавиш:
elif event.type == pygame.KEYDOWN:
...
elif event.type == pygame.KEYUP:
Они должны быть на одном уровне:
elif event.type == pygame.KEYDOWN:
...
elif event.type == pygame.KEYUP: