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



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


Глава 12 • Стреляющий корабль
alien_invasion.py
...
# Запуск основного цикла игры.
while True:
gf.check_events()
gf.update_screen(ai_settings, screen, ship)
run_game()
Эти две функции упрощают цикл 
while
и процесс дальнейшей разработки. Б
у
ль-
шая часть работы будет выполняться не в 
run_game()
, а в модуле 
game_functions
.
Так как мы решили начать работу с кодом c одного файла, мы не стали вводить мо-
дуль 
game_functions
с самого начала. Эта последовательность дает представление 
о реальном процессе разработки: сначала вы пишете свой код в самом простом виде, 
а потом подвергаете его рефакторингу по мере роста сложности проекта.
Теперь, когда мы изменили структуру кода и упростили его расширение, можно 
переходить к динамическим аспектам игры!
УПРАЖНЕНИЯ
12-1 . Синее небо: создайте окно Pygame с синим фоном .
12-2 . Игровой персонаж: найдите изображение игрового персонажа, который вам нравится, 
в формате .bmp (или преобразуйте существующее изображение) . Создайте класс, который 
рисует персонажа в центре экрана, и приведите цвет фона изображения в соответствие 
с цветом фона экрана (или наоборот) .
Управление кораблем
Реализуем возможность перемещения корабля по горизонтали. Для этого мы на-
пишем код, реагирующий на нажатие клавиш 

или 

. Начнем с движения впра-
во, а потом применим те же принципы к движению влево. Заодно вы научитесь 
управлять перемещением изображений на экране.
Обработка нажатия клавиши
Каждый раз, когда пользователь нажимает клавишу, это нажатие регистрируется 
в Pygame как событие. Каждое событие идентифицируется методом 
pygame.event.
get()
, поэтому в функции 
check_events()
необходимо указать, какие события 
должны отслеживаться. Каждое нажатие клавиши регистрируется как событие 
KEYDOWN
.
При обнаружении события 
KEYDOWN
необходимо проверить, была ли нажата кла-
виша, инициирующая некоторое игровое событие. Например, при нажатии кла-
виши 

значение 
rect.centerx
корабля увеличивается для перемещения корабля 
вправо:
game_functions.py
def check_events(ship):
"""Обрабатывает нажатия клавиш и события мыши."""


Управление кораблем
241
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
 
elif event.type == pygame.KEYDOWN:
 
if event.key == pygame.K_RIGHT:
# Переместить корабль вправо.
 
ship.rect.centerx += 1
Функции 
check_events()
передается параметр 
ship
, потому что корабль должен 
двигаться вправо при нажатии клавиши 

. Внутри 
check_events()
в цикл событий 
добавляется блок 
elif
для выполнения кода при обнаружении события 
KEYDOWN


Чтобы проверить, является ли нажатая клавиша клавишей 

(
pygame.K_RIGHT
), 
мы читаем атрибут 
event.key

. Если нажата клавиша 

, корабль перемещается 
вправо, для чего значение 
ship.rect.centerx
увеличивается на 1 

.
Вызов 
check_events()
в 
alien_invasion .py
необходимо изменить, чтобы в аргументе 
передавался объект 
ship
:
alien_invasion.py
# Запуск основного цикла игры.
while True:
gf.check_events(ship)
gf.update_screen(ai_settings, screen, ship)
Если запустить программу 
alien_invasion .py
сейчас, вы увидите, что корабль переме-
щается вправо на 1 пиксел при каждом нажатии клавиши 

. Неплохо для начала, 
но это не лучший способ управления кораблем. Чтобы управление было более 
удобным, следует реализовать возможность непрерывного перемещения.
Непрерывное перемещение
Если игрок удерживает клавишу 

, корабль должен двигаться вправо до тех пор, 
пока клавиша не будет отпущена. Чтобы узнать, когда клавиша 

будет отпущена, 
наша игра отслеживает событие 
pygame.KEYUP
; таким образом, реализация непре-
рывного движения будет основана на отслеживании событий 
KEYDOWN
и 
KEYUP
в со-
четании с флагом 
moving_right
.
В неподвижном состоянии корабля флаг 
moving_right
равен 
False
. При нажатии 
клавиши 

флагу присваивается значение 
True
, а когда клавиша будет отпущена, 
флаг возвращается в состояние 
False
.
Класс 
Ship
управляет всеми атрибутами корабля, и мы добавим в него атрибут 
с именем 
moving_right
и метод 
update()
для проверки состояния флага 
moving_
right
. Метод 
update()
изменяет позицию корабля, если флаг содержит значение 
True
. Этот метод будет вызываться каждый раз, когда вы хотите обновить позицию 
корабля.
Ниже приведены изменения в классе 
Ship
:
ship.py
class Ship():


242

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




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

    Басты бет