Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 14.12.2025
Сообщений: 4

Не выводятся пули

21.01.2026, 18:24. Показов 437. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Alien Invasion.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
import game_functions as gf
 
def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption('Alien Invasion')
    ship = Ship(ai_settings, screen)
    bullets = Group()
    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        bullets.update()
        gf.update_screen(ai_settings, screen, ship, bullets )
run_game()
ship.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pygame
 
class Ship():
    def __init__(self, ai_settings, screen):
        self.screen = screen
        self.ai_settings = ai_settings
        self.image = pygame.image.load('D:images\\ship.bmp')
        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.moving_right = False
        self.moving_left = False
    def update(self):
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.center += self.ai_settings.ship_speed_factor
        if self.moving_left and self.rect.left > self.screen_rect.left:
            self.center -= self.ai_settings.ship_speed_factor
        self.rect.centerx = self.center
    def blitme(self):
        self.screen.blit(self.image, self.rect)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys
import pygame
from bullet import Bullet
def check_keydown_events(event, ai_settings, screen, ship, bullets):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        ship.moving_left = True
    elif event.key == pygame.K_SPACE:
        new_bullet = Bullet(ai_settings, screen, ship)
        bullets.add(new_bullet)
def check_keyup_events(event, ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        ship.moving_left = 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(ai_settings, screen, ship, bullets):
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    screen.fill(ai_settings.bg_color)
    ship.blitme()
    pygame.display.flip()
settings.py
Python
1
2
3
4
5
6
7
8
9
10
class Settings():
    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (11, 1, 38)
        self.ship_speed_factor = 0.8
        self.bullet_speed_factor = 1
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = 60, 60, 60
bullet.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
    def __init__(self, ai_settings, ship, screen):
        super().__init__()
        self.screen = screen
        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)
Занимаюсь по книжке, писал код и разбирал его, писал точь в точь, и после того как пытаюсь выстрелить - закрывает программу и начинает выкидывать такую ошибку
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Traceback (most recent call last):
  File "C:\Users\vl4d0\PycharmProjects\PythonProject\Alien Invasion.py", line 20, in <module>
    run_game()
    ~~~~~~~~^^
  File "C:\Users\vl4d0\PycharmProjects\PythonProject\Alien Invasion.py", line 16, in run_game
    gf.check_events(ai_settings, screen, ship, bullets)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\vl4d0\PycharmProjects\PythonProject\game_functions.py", line 22, in check_events
    check_keydown_events(event, ai_settings, screen, ship, bullets)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\vl4d0\PycharmProjects\PythonProject\game_functions.py", line 10, in check_keydown_events
    new_bullet = Bullet(ai_settings, screen, ship)
  File "C:\Users\vl4d0\PycharmProjects\PythonProject\bullet.py", line 8, in __init__
    self.rect.centerx = ship.rect.centerx
                        ^^^^^^^^^
AttributeError: 'pygame.surface.Surface' object has no attribute 'rect'
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2026, 18:24
Ответы с готовыми решениями:

Как сделать так что бы пули летели туда куда смотрит корабль
Здравствуйте, не как не могу понять как сделать так, чтобы корабль стрелял туда коуда я смотрю ...

Как сделать что бы пули летели в разные стороны?
Я создала человека, который должен выпускать пули, при нажатии на пробел в ту сторону в которую...

На графическом интерфейсе PyQT не выводятся все буквы
import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit ...

2
2 / 2 / 1
Регистрация: 16.12.2024
Сообщений: 5
24.01.2026, 00:26
Лучший ответ Сообщение было отмечено 8Observer8 как решение

Решение

Python
1
2
3
new_bullet = Bullet(ai_settings, screen, ship)
 
def __init__(self, ai_settings, ship, screen):
ты передаёшь screen вместо ship и ship вместо screen

screen это объект Surface

надо

Python
1
new_bullet = Bullet(ai_settings, ship, screen)
код не тестил если ещё будут ошибки скажи
2
0 / 0 / 0
Регистрация: 14.12.2025
Сообщений: 4
24.01.2026, 14:03  [ТС]
w1004w, Спасибо что помог, ошибка ушла
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2026, 14:03
Помогаю со студенческими работами здесь

Как вычислить приращение координат пули на поверхности если известны угол относительно оси Y и скорость пули?
у меня это приращение определяет вот такой код: def get_patron_speed(angle,speed): return ...

Не выводятся иконки на главной но если добавить к адресу www то выводятся иконки
Не выводятся иконки на главной, но если добавить к адресу www то выводятся иконки. Такое если...

на какую высоту h после попадаиня пули поднимется маятник
Пуля массой m1 = 10 г , летевшая со скоростью V= 600 м/с , попала в баллистический маятник и...

Полет пули.
Пуля должна по прямой лететь в точку назначения. Сначала я вот как делал. x, y -координаты пули....

Нахождение времени полета пули
Помогите пожалуйста составить само уравнение к задаче, сидел долго, так и не пришло ничего в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru