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



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


Глава 12 • Стреляющий корабль
Если событие 
KEYDOWN
происходит для события 
K_LEFT
, то 
moving_left
присваи-
вается 
True
. Если событие 
KEYUP
происходит для события 
K_LEFT
, то 
moving_left
присваивается 
False
. Здесь возможно использовать блоки 
elif
, потому что каждое 
событие связано только с одной клавишей. Если же игрок нажимает обе клавиши 
одновременно, то программа обнаруживает два разных события.
Если вы запустите 
alien_invasion .py
, то увидите, что корабль может непрерывно 
двигаться влево и вправо. Если же нажать обе клавиши, корабль останавливается.
Следующий шаг — доработка движения корабля. Внесем изменения в скорость 
и ограничим величину перемещения, чтобы корабль не выходил за края экрана.
Регулировка скорости корабля
В настоящий момент корабль смещается на один пиксел за каждый проход цикла 
while
, но для повышения точности управления скоростью можно добавить в класс 
Settings
атрибут 
ship_speed_factor
. Этот атрибут определяет величину смещения 
корабля при каждом проходе цикла. Новый атрибут 
settings .py
выглядит так:
settings.py
class Settings():
"""Класс для хранения всех настроек игры Alien Invasion."""
def __init__(self):
...
# Настройки корабля
Переменной 
ship_speed_factor
присваивается значение 1.5. При перемещении ко-
рабля его позиция изменяется на 1,5 пиксела вместо 1. Дробные значения скорости 
позволят лучше управлять скоростью корабля при последующем повышении темпа 
игры. Однако атрибуты прямоугольников (такие, как 
centerx
) принимают только 
целочисленные значения, поэтому в 
Ship
необходимо внести ряд изменений:
ship.py
class Ship():
 
def __init__(self, ai_settings, screen):
"""Инициализирует корабль и задает его начальную позицию."""
self.screen = screen
 
self.ai_settings = ai_settings
...
# Каждый новый корабль появляется у нижнего края экрана
...
# Сохранение вещественной координаты центра корабля.
 
self.center = float(self.rect.centerx)
# Флаги перемещения
self.moving_right = False
self.moving_left = False


Управление кораблем
245
def update(self):
"""Обновляет позицию корабля с учетом флагов."""
# Обновляется атрибут center, не rect.
if self.moving_right:
 
self.center += self.ai_settings.ship_speed_factor
if self.moving_left:
self.center -= self.ai_settings.ship_speed_factor
# Обновление атрибута rect на основании self.center.
 
self.rect.centerx = self.center
def blitme(self):
...
В точке 

в список параметров 
__init__()
добавляется параметр 
ai_settings
, что-
бы для корабля была доступна величина его скорости. Затем параметр 
ai_settings
преобразуется в атрибут для использования в 
update()

. Так как позиция корабля 
изменяется с нецелым приращением пикселов, она должна храниться в перемен-
ной, способной хранить дробные значения. Формально атрибутам 
rect
можно 
присвоить дробные значения, но 
rect
сохранит только целую часть этого значения. 
Для точного хранения позиции корабля определяется новый атрибут 
self.center

способный хранить дробные значения 

. Функция 
float()
используется для пре-
образования значения 
self.rect.centerx
в вещественный формат и сохранения 
этого значения в 
self.center
.
После изменения позиции корабля в 
update()
значение 
self.center
изменяется 
на величину, хранящуюся в 
ai_settings.ship_speed_factor

. После обновле-
ния 
self.center
новое значение используется для обновления атрибута 
self.
rect.centerx
, управляющего позицией корабля 

. В 
self.rect.centerx
будет 
сохранена только целая часть 
self.center
, но для отображения корабля этого 
достаточно.
Значение 
ai_settings
должно передаваться в аргументе при создании экземпляра 
Ship
в 
alien_invasion .py
:
alien_invasion.py
...
def run_game():
...
# Создание корабля.
ship = Ship(ai_settings, screen)
...
Теперь с любым значением 
ship_speed_factor
, б
у
льшим 1, корабль будет двигаться 
быстрее. Эта возможность ускорит реакцию корабля на действия игрока, а также 
позволит нам изменить темп игры с течением времени.
Ограничение перемещений
Если удерживать какую-нибудь клавишу со стрелкой достаточно долго, корабль 
выйдет за край экрана. Давайте сделаем так, чтобы корабль останавливался при до-
стижении края экрана. Задача решается изменением метода 
update()
в классе 
Ship
:


246

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




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

    Басты бет