Книга «Изучаем Python»



Pdf көрінісі
бет153/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   149   150   151   152   153   154   155   156   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )

ПРИМЕЧАНИЕ
Вызов super(Bullet, self) .__init__() использует синтаксис Python 2 .7 . В Python 3 этот синтаксис тоже 
работает, хотя вызов также можно записать в более простой форме super() .__init__() .
В точке 

создается атрибут 
rect
пули. Пуля не создается на основе готового 
изображения, поэтому прямоугольник приходится строить «с нуля» при по-
мощи класса 
pygame.Rect()
. При создании экземпляра этого класса необходимо 
задать координаты левого верхнего угла прямоугольника, его ширину и высоту. 
Прямоугольник инициализируется в точке (0, 0), но в следующих двух строках 
он перемещается в нужное место, так как позиция пули зависит от позиции 
корабля. Ширина и высота пули определяются значениями, хранящимися 
в 
ai_settings
.
В точке 

атрибуту 
centerx
пули присваивается значение 
rect.centerx
корабля. 
Пуля должна появляться 
у
верхнего края корабля, поэтому верхний край пули 
совмещается с верхним краем прямоугольника корабля для имитации «выстрела» 
из корабля 

.
Координата 
y
пули хранится в вещественной форме для внесения более точных 
изменений в скорость пули 

. В точке 

настройки цвета и скорости пули сохра-
няются в 
self.color
и 
self.speed_factor
.
А вот как выглядит вторая часть 
bullet .py

update()
и 
draw_bullet()
:
bullet.py
def update(self):
"""Перемещает пулю вверх по экрану."""


250
Глава 12 • Стреляющий корабль
# Обновление позиции пули в вещественном формате.
 
self.y -= self.speed_factor
# Обновление позиции прямоугольника.
 
self.rect.y = self.y
def draw_bullet(self):
"""Вывод пули на экран."""
 
pygame.draw.rect(self.screen, self.color, self.rect)
Метод 
update()
управляет позицией пули. Когда происходит выстрел, пуля двига-
ется вверх по экрану, что соответствует уменьшению координаты 
y
; следовательно, 
для обновления позиции пули следует вычесть величину, хранящуюся в 
self.
speed_factor
, из 
self.y

. Затем значение 
self.y
используется для изменения 
значения 
self.rect.y

. Атрибут 
speed_factor
позволяет увеличить скорость пуль 
по ходу игры или при изменении ее поведения. Координата 
x
пули после выстрела 
не изменяется, поэтому пуля летит вертикально по прямой линии.
Для вывода пули на экран вызывается функция 
draw_bullet()
. Она заполняет часть 
экрана, определяемую прямоугольником пули, цветом из 
self.color

.
Группировка пуль
Класс 
Bullet
и все необходимые настройки готовы; можно переходить к на-
писанию кода, который будет выпускать пулю каждый раз, когда игрок на-
жимает клавишу «пробел». Сначала мы создадим в 
alien_invasion .py
группу для 
хранения всех летящих пуль, чтобы программа могла управлять их полетом. 
Эта группа будет представлена экземпляром класса 
pygame.sprite.Group
, ко-
торый напоминает список с расширенной функциональностью, которая может 
быть полезна при построении игр. Мы воспользуемся группой для прорисовки 
пуль на экране при каждом проходе основного цикла и обновления текущей 
позиции каждой пули:
alien_invasion.py
import pygame
from pygame.sprite import Group
...
def run_game():
...
# Создание корабля.
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()


Стрельба
251
Класс 
Group
импортируется из 
pygame.sprite
. В точке 

создается экземпляр 
Group
с именем 
bullets
. Эта группа создается за пределами цикла 
while
, чтобы новая 
группа пуль не создавалась при каждом проходе цикла.


Достарыңызбен бөлісу:
1   ...   149   150   151   152   153   154   155   156   ...   266




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет