Статья Автор: Омарбек Нұр-Мұхаммед

Примеры

Пример

В этом примере происходит перемещение прямоугольника с помощью клавиш клавиатуры:

import sys
import pygame
pygame.init()

SIZE = WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()

x, y = WIDTH // 2 - 50, HEIGHT // 2 - 50
speed = 5

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x -= speed
            if event.key == pygame.K_RIGHT:
                x += speed

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 255, 255), (x, y, 100, 100))
    pygame.display.update()

    clock.tick(30)

Если произошло событие pygame.KEYDOWN, то программа проверяет какая клавиша была нажата.

 

У этого примера есть недостаток. При нажатии клавиши прямоугольник смещается в сторону только один раз. Дело в том, что при нажатии клавиши формируется только одно событие. И как только оно было выбрано из очереди событий, то повторного такого же события в очереди уже нет.


Для плавного перемещения пример можно переписать.

 

Шаг 1: объявление дополнительных переменных

  • key_left (bool) - переменная True, если клавиша стрелка влево нажата и False, если клавиша отпущена
  • key_right (bool) - переменная True, если клавиша стрелка вправо нажата и False, если клавиша отпущена
key_left = False
key_right = False

 

Шаг 2: проверка событий

elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
        key_left = True
    if event.key == pygame.K_RIGHT:
        key_right = True

elif event.type == pygame.KEYUP:
    if event.key == pygame.K_LEFT:
        key_left = False
    if event.key == pygame.K_RIGHT:
        key_right = False

 

Шаг 3: перемещение прямоугольника

if key_left:
    x -= speed
if key_right:
    x += speed

Код

import sys
import pygame
pygame.init()

SIZE = WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()

key_left = False
key_right = False

x, y = WIDTH // 2 - 50, HEIGHT // 2 - 50
speed = 5

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                key_left = True
            if event.key == pygame.K_RIGHT:
                key_right = True

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                key_left = False
            if event.key == pygame.K_RIGHT:
                key_right = False

    if key_left:
        x -= speed
    if key_right:
        x += speed

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 255, 255), (x, y, 100, 100))
    pygame.display.update()

    clock.tick(30)

И снова пример можно переписать используя функцию pygame.key.get_pressed(). Функция возвращает последовательность логических значений, например:

(False, False, False, False, False, ...)

 

Если клавиша отпущена, то её значение False, а если нажата, то True:

(False, False, True, False, False, ...)

 

import sys
import pygame
pygame.init()

SIZE = WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()

x, y = WIDTH // 2 - 50, HEIGHT // 2 - 50
speed = 5

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:
        x -= speed
    if keys[pygame.K_RIGHT]:
        x += speed

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 255, 255), (x, y, 100, 100))
    pygame.display.update()

    clock.tick(30)
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать