Проблема с игрой. 2д игра в пайгейме

Рейтинг: 1Ответов: 1Опубликовано: 27.02.2023
import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    '''Класс для управления ресурсами и поведением игры.'''
    
    def __init__(self):
        '''Инициализирует игру и создаёт игровые ресурсы.'''
        pygame.init()
        self.settings = Settings()
        
        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption('Alien Invasion')
        
        self.ship = Ship(self.screen)
        # Назначение цвета фона.
    
    def run_game(self):
        '''Запуск основного цикла игры.'''
        while True:
            self._check_events()
            self.ship.update()
            self._update_screen()
            # При каждом проходе цикла перерисовывается экран.
            # Отслеживание событий клавиатуры и мыши.
    def _check_events(self):
        """Обрабатывает нажатия клавиш и события мыши."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            
    def _check_keydown_events(self, event):
        '''Реагирует на нажатие клавиш'''
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
                
    def _check_keyup_events(self, event):
        '''Реагирует на отпускание клавиш.'''
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
    
    def _update_screen(self):
        '''Обновляет изображения на экране и отображает ноовый экран.'''
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        # Отображение последнего прорисованного экрана.
        pygame.display.flip()
                
if __name__ == '__main__':
# Создание эклемпляра и запуск игры.
    ai = AlienInvasion()
    ai.run_game()

import pygame

class Ship():
    '''Класс для управления кораблём.'''
    
    def __init__(self, ai_game):
        '''Инициализирует корабль и задаёт его начальную позицию.'''
        self.screen = ai_game
        self.settings = ai_game
        self.screen_rect = ai_game.get_rect()
        
        # Загружает изображение корабля и получает прямоугольник.
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()
        # Каждый новый корабль появляется у нижнего края экрана.
        self.rect.midbottom = self.screen_rect.midbottom
        # Сохранение вещественной координаты центра корабля.
        self.x = float(self.rect.x)
        
        # Флаги перемещения
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        """Обновляет позицию корабля с учётом флага."""
        # Обновляется атрибут x, не rect.
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed
        
        elif self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed
            
        # Обновление атрибута rect на основании self.x.
        self.rect.x = self.x
        
    def blitme(self):
        'Рисует корабль в текущей позиции.'
        self.screen.blit(self.image, self.rect)
class Settings():
    '''Класс для хранения всех настроек игры Alien Invansion.'''
    
    def __init__(self):
        'Инициализирует настройки игры.'
        # Параметры экрана:
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
        
        # Настройки корабля
        self.ship_speed = 1.5

Выдаёт ошибку:

self.x -= self.settings.ship_speed
AttributeError: 'pygame.Surface' object has no attribute 'ship_speed'

и:

line 34 Incompatible types in assignment (expression has type "float", variable has type "int")

Ответы

▲ 0Принят

В вашем коде есть одна ошибка. При инициализации объекта Ship вы задаете его параметр settings в ai_game, надо в параметр settings объекта AlienInvasion.


Вот поправка: Файл ship.py


import pygame

class Ship:
    '''Класс для управления кораблём.'''

    def __init__(self, ai_game, settings):
        '''Инициализирует корабль и задаёт его начальную позицию.'''
        self.screen = ai_game
        self.settings = settings
        self.screen_rect = ai_game.get_rect()
        # ...

Файл main.py


import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    '''Класс для управления ресурсами и поведением игры.'''

    def __init__(self):
        '''Инициализирует игру и создаёт игровые ресурсы.'''
        pygame.init()
        self.settings = Settings()
    
        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption('Alien Invasion')
    
        self.ship = Ship(self.screen, self.settings)
        # Назначение цвета фона.
        # ...

А второй ошибкой и вовсе нету - я скачал файлы, запустил - нету.