0 / 0 / 0
Регистрация: 14.12.2025
Сообщений: 4

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

21.01.2026, 18:24. Показов 335. Ответов 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
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
1 / 1 / 0
Регистрация: 16.12.2024
Сообщений: 5
24.01.2026, 00:26
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)
код не тестил если ещё будут ошибки скажи
1
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru