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



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


Глава 12 • Стреляющий корабль
def __init__(self, screen):
...
# Каждый новый корабль появляется у нижнего края экрана.
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# Флаг перемещения
 
self.moving_right = False
 
def update(self):
"""Обновляет позицию корабля с учетом флага."""
if self.moving_right:
self.rect.centerx += 1
def blitme(self):
...
Мы добавляем атрибут 
self.moving_right
в методе 
__init__()
и инициализируем 
его значением 
False

. Затем вызывается метод 
update()
, который перемещает 
корабль вправо, если флаг равен 
True

.
Теперь внесем изменения в 
check_events()
, чтобы при нажатии клавиши 

moving_
right
присваивалось значение 
True
, а при ее отпускании — 
False
:
game_functions.py
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
...
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
 
ship.moving_right = True
 
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
В точке 

изменяется реакция игры при нажатии клавиши 

; вместо непосред-
ственного изменения позиции корабля программа просто присваивает 
moving_right
значение 
True
. В точке 

добавляется новый блок 
elif
, реагирующий на события 
KEYUP
. Когда игрок отпускает клавишу 

(
K_RIGHT
), 
moving_right
присваивается 
значение 
False
.
Остается изменить цикл 
while
в 
alien_invasion .py
, чтобы при каждом проходе цикла 
вызывался метод 
update()
корабля:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ship)
ship.update()
gf.update_screen(ai_settings, screen, ship)
Позиция корабля будет обновляться после проверки событий клавиатуры, но 
перед обновлением экрана. Таким образом, позиция корабля обновляется в от-


Управление кораблем
243
вет на действия пользователя и будет использоваться при перерисовке корабля 
на экране.
Если запустить 
alien_invasion .py
и удерживать клавишу 

, корабль непрерывно 
двигается вправо, пока клавиша не будет отпущена.
Перемещение влево и вправо
Теперь, когда мы реализовали непрерывное движение вправо, добавить движе-
ние влево относительно несложно. Для этого нужно снова изменить класс 
Ship
и функцию 
check_events()
. Ниже приведены необходимые изменения в 
__init__()
и 
update()
в классе 
Ship
:
ship.py
def __init__(self, screen):
...
# Флаги перемещения
self.moving_right = False
self.moving_left = False
def update(self):
"""Обновляет позицию корабля с учетом флагов."""
if self.moving_right:
self.rect.centerx += 1
if self.moving_left:
self.rect.centerx -= 1
В методе 
__init__()
добавляется флаг 
self.moving_left
. В 
update()
используются 
два отдельных блока 
if
вместо 
elif
, чтобы при нажатии обеих клавиш со стрелками 
атрибут 
rect.centerx
сначала увеличивался, а потом уменьшался. В результате 
корабль остается на месте. Если бы для движения влево использовался блок 
elif

то клавиша 

всегда имела бы приоритет. Такая реализация повышает точность 
перемещения при переключении направления, когда игрок может ненадолго удер-
живать нажатыми обе клавиши.
В 
check_events()
необходимо внести два изменения:
game_functions.py
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
...
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = Fals
e


244

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




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

    Басты бет