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



Pdf көрінісі
бет130/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   126   127   128   129   130   131   132   133   ...   238
Байланысты:
2 5343781172763690906

ПРИМЕЧАНИЕ

Вызов 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   ...   126   127   128   129   130   131   132   133   ...   238




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

    Басты бет