М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет181/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   177   178   179   180   181   182   183   184   ...   334
Байланысты:
Изучаем Python

УПРАЖНЕНИЯ
12.1. Синее небо:
создайте окно Pygame с синим фоном.
12.2. Игровой персонаж:
найдите изображение игрового персонажа, который вам нравит-
ся, в формате 
.bmp
(или преобразуйте существующее изображение). Создайте класс, кото-
рый рисует персонажа в центре экрана, и приведите цвет фона изображения в соответствие 
с цветом фона экрана (или наоборот).
Управление кораблем
Реализуем возможность перемещения корабля по горизонтали. Для этого мы на-
пишем код, реагирующий на нажатие клавиш 

или 

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

значение 
rect.x
корабля увеличивается для перемещения корабля вправо:
alien_invasion.py
def _check_events(self):
"""Обрабатывает нажатия клавиш и события мыши."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_RIGHT:
# Переместить корабль вправо.

self.ship.rect.x += 1


252
Глава 12 • Инопланетное вторжение
Внутри 
_check_events()
в цикл событий добавляется блок 
elif
для выполнения 
кода при обнаружении события 
KEYDOWN

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

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

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

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

.
Если запустить программу 
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():
""" Класс для управления кораблем"""
def __init__(self, ai_game):
...
# Каждый новый корабль появляется у нижнего края экрана.
self.rect.midbottom = self.screen_rect.midbottom
# Флаг перемещения

self.moving_right = False

def update(self):
"""Обновляет позицию корабля с учетом флага."""
if self.moving_right:
self.rect.x += 1
def blitme(self):
...


Управление кораблем
253
Мы добавляем атрибут 
self.moving_right
в метод 
__init__()
и инициализируем 
его значением 
False

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

. Метод 
update()
будет вызываться через 
экземпляр 
Ship
, поэтому он не считается вспомогательным методом.
Теперь внесем изменения в 
run_game()
, чтобы при нажатии клавиши 

moving_
right
присваивалось значение 
True
, а при ее отпускании — 
False
:


Достарыңызбен бөлісу:
1   ...   177   178   179   180   181   182   183   184   ...   334




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

    Басты бет