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



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

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 = False



244    Глава 12  •  Стреляющий корабль

Если событие 

KEYDOWN

 происходит для события 

K_LEFT

, то 


moving_left

 присваи-

вается 

True


. Если событие 

KEYUP


 происходит для события 

K_LEFT


, то 

moving_left

 

присваивается 



False

. Здесь возможно использовать блоки 

elif

, потому что каждое 



событие связано только с одной клавишей. Если же игрок нажимает обе клавиши 

одновременно, то программа обнаруживает два разных события.

Если вы запустите 

alien_invasion .py

, то увидите, что корабль может непрерывно 

двигаться влево и вправо. Если же нажать обе клавиши, корабль останавливается.

Следующий шаг — доработка движения корабля. Внесем изменения в скорость 

и ограничим величину перемещения, чтобы корабль не выходил за края экрана.

Регулировка скорости корабля

В настоящий момент корабль смещается на один пиксел за каждый проход цикла 

while

, но для повышения точности управления скоростью можно добавить в класс 



Settings

 атрибут 

ship_speed_factor

. Этот атрибут определяет величину смещения 

корабля при каждом проходе цикла. Новый атрибут 

settings .py

 выглядит так:



Достарыңызбен бөлісу:
1   ...   122   123   124   125   126   127   128   129   ...   238




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

    Басты бет