|
0 / 0 / 0
Регистрация: 11.11.2018
Сообщений: 1
|
|
Game_functions.py, line 113: AttributeError: 'Settings' object has no attribute 'sprites'11.11.2018, 16:43. Показов 3763. Ответов 0
Alien_invasion
import pygame import game_functions as gf import winsound from settings import Settings from ship import Ship from pygame.sprite import Group background_image = pygame.image.load("images/spase.jpg") background_image_menu = pygame.image.load("images/Menu.jpg") def run_game(): # Инициализирует pygame, settings и объект экрана. winsound.PlaySound("music.mp3", winsound.SND_ASYNC) pygame.init() ai_settings = Settings() screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) pygame.display.set_caption("Alien Invasion") ship = Ship(ai_settings, screen) bullets = Group() aliens = Group() gf.create_fleet(ai_settings, screen, aliens, ship) # Запуск основного цикла игры. while True: gf.check_events(ai_settings, screen, ship, bullets) ship.update() gf.update_bullets(bullets) gf.update_aliens(ai_settings, aliens) gf.update_screen(screen, ship, aliens, bullets) run_game() game_functions import sys import pygame from bullet import Bullet from alien import Alien def check_keydown_events(event, ai_settings, screen, ship, bullets): if event.key == pygame.K_d: # Переместить корабль вправо ship.moving_right = True elif event.key == pygame.K_a: ship.moving_left = True elif event.key == pygame.K_w: ship.moving_up = True elif event.key == pygame.K_s: ship.moving_down = True elif event.key == pygame.K_RETURN: fire_bullet(ai_settings, screen, ship, bullets) elif event.key == pygame.K_q: sys.exit() def check_keyup_events(event, ship): if event.key == pygame.K_d: ship.moving_right = False elif event.key == pygame.K_a: ship.moving_left = False elif event.key == pygame.K_w: ship.moving_up = False elif event.key == pygame.K_s: ship.moving_down = False def check_events(ai_settings, screen, ship, bullets): """ Обрабатывает нажатия клавиш и события мыши.""" for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: check_keydown_events(event, ai_settings, screen, ship, bullets) elif event.type == pygame.KEYUP: check_keyup_events(event, ship) def update_screen(screen, ship, aliens, bullets): """ Обновляет изображения на экране и отображает новый экран.""" # При каждом проходе цикла перерисовывается экран screen.blit(pygame.image.load("images/spase.jpg"), [0, 0]) for bullet in bullets: bullet.draw_bullet() ship.blitme() aliens.draw(screen) # Отображение последнего прорисованного экрана. pygame.display.flip() def update_bullets(bullets): """ Обновление позиции пуль и создание старых""" bullets.update() for bullet in bullets.copy(): if bullet.rect.bottom <= 0: bullets.remove(bullet) def fire_bullet(ai_settings, screen, ship, bullets): if len(bullets) < ai_settings.bullets_allowed: new_bullet = Bullet(ai_settings, screen, ship) bullets.add(new_bullet) def create_fleet(ai_settings, screen, aliens, ship): # Создание пришельца и вычисление количества пришельцев в ряду. # Интервал между соседними пришельцами равен одной ширине прицельца. alien = Alien(ai_settings, screen) number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width) number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height) # Создание первого ряда for row_number in range(number_rows + 1): for alien_number in range(number_aliens_x + 1): create_alien(ai_settings, screen, aliens, alien_number, row_number) def get_number_aliens_x(ai_settings, alien_width): available_space_x = ai_settings.screen_width - 2 * alien_width number_aliens_x = int(available_space_x / (2 * alien_width)) return number_aliens_x def create_alien(ai_settings, screen, aliens, alien_number, row_number): alien = Alien(ai_settings, screen) alien_width = alien.rect.width alien.x = alien_width + 2 * alien_width * alien_number alien.rect.x = alien.x alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number aliens.add(alien) def get_number_rows(ai_settings, ship_height, alien_height): available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height) number_rows = int(available_space_y / (2 * alien_height)) return number_rows def update_aliens(aliens, ai_settings): """Обновляет позиции всех пришельцев во флоте.""" check_fleet_edges(ai_settings, aliens) aliens.update() def check_fleet_edges(ai_settings, aliens): """Реагирует на достижение прицельцем края экрана.""" for alien in aliens.sprites(): if alien.check_edges(): change_fleet_direction(ai_settings, aliens) break def change_fleet_direction(ai_settings, aliens): """Опускает весь флот и меняет его направление.""" for alien in aliens.sprites(): alien.rect.y += ai_settings.fleet_drop_speed ai_settings.fleet_direction *= -1 settings import pygame background_image = pygame.image.load("images/spase.jpg") class Settings: """ Класс для хранения всех настроек игры Alien Invasion""" def __init__(self): """Инициализирует настройки игры.""" self.screen_width = 1600 self.screen_height = 900 self.background_image = (230, 230, 230) # Настройки корабля self.ship_speed_factor = 4.5 # Параметры пули self.bullet_speed_factor = 3 self.bullet_width = 5 self.bullet_height = 15 self.bullet_color = 4, 178, 185 self.bullets_allowed = 5 # Настройка прицельцев self.alien_speed_factor = 1 self.fleet_drop_speed = 10 # fleet_direction = 1 обозначает движение вправо; а -1 влево. self.fleet_direction = 1 alien import pygame from pygame.sprite import Sprite class Alien(Sprite): def __init__(self, ai_settings, screen): super(Alien, self).__init__() self.ai_settings = ai_settings self.screen = screen self.image = pygame.image.load("images/Alien1.png") self.rect = self.image.get_rect() self.rect.x = self.rect.width self.rect.y = self.rect.height self.x = float(self.rect.x) def blitme(self): self.screen.blit(self.image, self.rect) def check_edges(self): """Возвращает True, если пришелец находится у края экрана.""" screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: return True elif self.rect.left <= 0: return True def update(self): """Перемещение пришельца вправо и влево.""" self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction) self.rect.x = self.x ship import pygame class Ship: def __init__(self, ai_settings, screen): self.ai_settings = ai_settings self.screen = screen # Загрузка изображения корабля и задет его начвальную позицую. self.image = pygame.image.load("images/ship.png") self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() # Каждый новый корабль появляется у нижнего края экрана. self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom # Сохранение вецественной координаты центра корабля. self.center = float(self.rect.centerx) self.centerx = float(self.rect.centerx) self.centery = float(self.rect.centery) # Флаг перемещения self.moving_right = False self.moving_left = False self.moving_up = False self.moving_down = False def update(self): """ Обновляет позицию корабля с учетом флагов.""" if self.moving_right and self.rect.right < self.screen_rect.right: self.centerx += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: self.centerx -= self.ai_settings.ship_speed_factor if self.moving_up and self.rect.top > 0: self.centery -= self.ai_settings.ship_speed_factor if self.moving_down and self.rect.bottom < self.ai_settings.screen_height: self.centery += self.ai_settings.ship_speed_factor self.rect.centerx = self.centerx self.rect.centery = self.centery def blitme(self): """ Рисуем корабль в текущей позиции.""" self.screen.blit(self.image, self.rect) bullet import pygame from pygame.sprite import Sprite class Bullet(Sprite): def __init__(self, ai_settings, screen, ship): """ Создает обьект пуля в текущей позиции корабля""" super(Bullet, self).__init__() self.screen = screen # Создание пули в позиции (0, 0) и назначение правильной позиции. self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height) self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top # Позиция пули хранится в вещественном формате self.y = float(self.rect.y) self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor def update(self): self.y -= self.speed_factor self.rect.y = self.y def draw_bullet(self): # Вывод пули на экран pygame.draw.rect(self.screen, self.color, self.rect)
0
|
|
| 11.11.2018, 16:43 | |
|
Ответы с готовыми решениями:
0
AttributeError: '<invalid type>' object has no attribute 'setup' on line 111 in main.py
|
| 11.11.2018, 16:43 | |
|
Помогаю со студенческими работами здесь
1
Ошибка AttributeError (object has no attribute)
AttributeError: 'NoneType' object has no attribute 'id' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|