Основы PyGame¶
Pygame — библиотека, предназначенная для разработки мультимедийных приложений с графическим интерфейсом, например игр.
Документация, обучающие материалы и дополнительная информация доступна разработчикам на сайте проекта: https://www.pygame.org/docs/
Начало работы¶
Начнем знакомство с библиотекой непосредственно с разбора примера простого приложения:
В первую очередь импортируем модуль pygame в наш файл с исходным кодом:
Затем вызываем функцию init() для подготовки модулей pygame к работе:
После этого создаем графическое окно, передав в качестве аргумента в функцию set_mode() его разрешение в виде пары целых чисел. В свою очередь функция вернет нам объект типа Surface, используемый для представления изображений:
Далее, запускаем основной цикл программы, в котором, среди всех событий, происходящих в нашем приложении, перехватываем событие закрытия основного графического окна пользователем:
После того как ожидаемое событие наступило, завершаем работу с библиотекой pygame вызовом функции pygame.quit() и нашей программы вызовом функции exit() из модуля sys .
Рисование геометрических фигур¶
Разместим в окне нашего приложения прямоугольник. Прямоугольные объекты представлены типом Rect :
Для создания объекта этого типа нам необходимо указать координаты левого верхнего угла прямоугольника и длины его сторон:
Обратите внимание, что начало координат (0, 0) находится в левом верхнем углу окна.
В библиотеке pygame функции отображения геометрических фигур находятся в модуле draw . Нарисуем прямоугольник c помощью функции rect() :
Для этого передадим в функцию в качестве аргументов поверхность, на которой мы размещаем прямоугольник, его цвет, сам прямоугольник и толщину линии — стороны прямоугольника. Если толщина равна нулю прямоугольник закрашивается сплошным цветом.
Рассмотрим готовый пример:
Обратите внимание на последнюю строку нашей программы. На самом деле графические объекты которые мы хотим разместить на основном экране сначала попадают в специальный буфер. Чтобы отобразить изменения стали видны вызываем функцию flip() .
Прочие функции для рисования графических фигур¶
Нарисовать линию на поверхности Surface , цветом color , с началом в точке start_pos , концом в точке end_pos и толщиной линии width.
pygame.draw. lines ( Surface, color, closed, pointlist, width=1 ) ¶
Нарисовать линию, соединяющую точки из последовательности pointlist на поверхности Surface , цветом color , с толщиной линии width . Каждая точка представлена парой координат. Если параметр closed равен True , конечная точка соединяется с начальной.
Нарисовать окружность на поверхности Surface, цветом color , с центром в точке pos и радиусом radius . Если толщина линии width равна нулю, окружность закрашивается.
Нарисовать эллипс, ограниченный прямоугольником Rect , на поверхности Surface , цветом color . Если толщина линии width равна нулю, эллипс закрашивается.
pygame.draw. polygon ( Surface, color, pointlist, width=0 ) ¶
Нарисовать многоугольник по точкам из последовательности pointlist на поверхности Surface , цветом color , с толщиной линии width . Каждая точка представлена парой координат. Если толщина линии width равна нулю многоугольник закрашивается.
Цвета в библиотеке pygame представлены в соответствии с моделью RGB: https://ru.wikipedia.org/wiki/RGB
Значение для цвета можно задать тройкой чисел, каждое из которых лежит в диапазоне от 0 до 255. Первое значение в последовательности определяет, какое количество красного содержится в данном оттенке, второе — зеленого, третье — голубого. Чем меньше значение числа, тем темнее будет оттенок. Например, красный цвет можно представить как (255, 0, 0), белый как (255, 255, 255), а черный как (0, 0, 0).
Помимо этого, в модуле color из библиотеки pygame содержится словарь THECOLORS, ключами которого являются названия различных цветовых оттенков. Подключить его можно с помощью команды:
Закрасим основной экран c помощью метода fill() :
Текст и шрифты¶
При работе с текстом мы будем использовать шрифты — группы символов объединенных по стилистическому или иному признаку. Шрифты в библиотеке pygame представлены типом Font
Чтобы создать объект Font на основе имеющегося в системе шрифта вызовем следующую функцию:
С помощью параметра name передаем в функцию имя шрифта, параметр size — размер шрифта в пунктах. Параметры bold и italic отвечают за начертание шрифта.
Список имеющихся в системе шрифтов можно получить с помощью функции get_fonts() :
Далее, с помощью метода render() нашего объекта типа Font получаем изображение с текстом, которое передаем на вход методу blit() для отрисовке на нашем основном экране:
Текст размещается в на основном экране по координатам (50, 50)
Задания¶
1. Используя функции для работы с графикой библиотеки pygame, нарисуйте дом с квадратным основанием и треугольной крышей.
2. Используя функции для работы с графикой библиотеки pygame, нарисуйте белый флаг с олимпийскими кольцами.
3. Разработайте программу, которая разбивает основное игровое окно на клетки заданного размера.
4. Доработайте программу так, чтобы в каждой клетке был записан её порядковый номер.
5. Доработайте в программу возможность закрашивания клетки с произвольным номером случайным цветом. Номера клеток которые необходимо закрасить считывать из файла.
WEB start
Компьютеры. Интернет. Профессиональное обучение. 055-966-10-17
Наши преимущества
- Наши программы обучения ориентированы на конкретного слушателя. Вы можете обучаться по одной из предложенных Вам программ, а можете самостоятельно составить, откорректировать, откорректировать свою персональную программу обучения. Преподаватель, консультант помогают Вам сориентироваться в материале курса при выборе программы обучения.
- Обучение индивидуальное. Преподаватель проводит занятие только для Вас, ориентируясь на Ваши возможности, предыдущие знания и опыт, скорость восприятия нового материала.
- Вы учитесь в удобное для Вас время , в удобной для Вас форме, может быть выбран гибкий график занятий, в соответствии с Вашими возможностями и пожеланиями.
- Обучение проводится дистанционно . Вы можете обучаться, сидя за Вашим компьютером дома или на работе, не тратя время на поездки к месту обучения.
Регистрация на сайте
Дополнительные материалы
- API WEB — уведомлений (Notifications)
- CSS — шрифты
- CSS3 адаптивные блоки (Flex Box Model)
- HTML5 — элемент CANVAS, рисование
- HTML5 семантические элементы
- Joomla, компонент Sourcerer
- Visual Studio Code для HTML, CSS, SASS, JavaScript
- WordPress — дочерние темы
- Вставка видео в HTML документ
- Построение многоязычных сайтов на CMS WordPress
- Создание шаблонов для Joomla 3.x
PyGame
Python — программирование игр — PyGame
Основные модули пакета Pygame
| Модуль | Назначение |
|---|---|
| pygame.cdrom | Доступ к CD-приводам и управление ими |
| pygame.cursors | Загружает изображения курсора |
| pygame.display | Доступ к дисплею |
| pygame.draw | Рисует фигуры, линии и точки |
| pygame.event | Управление внешними событиями |
| pygame.font | Использует системные шрифты |
| pygame.image | Загружает и сохраняет изображение |
| pygame.joystick | Использует джойстики и аналогичные устройства |
| pygame.key | Считывает нажатия клавиш с клавиатуры |
| pygame.mixer | Загружает и воспроизводит мелодии |
| pygame.mouse | Управляет мышью |
| pygame.movie | Воспроизведение видеофайлов |
| pygame.music | Работает с музыкой и потоковым аудио |
| pygame.overlay | Доступ к расширенным видеоизображениям |
| pygame | Содержит функции Pygame высокого уровня |
| pygame.rect | Управляет прямоугольными областями |
| pygame.sndarray | Манипулирует звуковыми данными |
| pygame.sprite | Управление движущимися изображениями |
| pygame.surface | Управляет изображениями и экраном |
| pygame.surfarray | Манипулирует данными пикселей изображения |
| pygame.time | модуль pygame для управления временем и частотой кадров |
| pygame.transform | Изменение размера и перемещение изображений |
Окно PyGame
Подключение библиотеки PyGame
Окно игры: размер, позиция
gameScreen = pygame.display.set_mode((400, 300))
модуль os — позиция окна
os.environ[‘Sp_VIDEO_WINDOW_POS’] = «%d,%d» % (x,y)
Цикл игры, выход из игры
runGame = True # флаг выходв из цикла игры
Отслеживание события: «закрыть окно»
for event in pygame.event.get():
if event.type == pygame.QUIT: runGame = False
Выход из игры: pygame.quit()
Рисование базовых элементов
pygame.draw
| pygame.draw.rect | — | нарисовать прямоугольную форму |
| pygame.draw.polygon | — | фигуру с любым количеством сторон |
| pygame.draw.circle | — | круг вокруг точки |
| pygame.draw.ellipse | — | нарисовать круглую форму внутри прямоугольника |
| pygame.draw.arc | — | нарисовать секцию эллипса |
| pygame.draw.line | — | нарисовать сегмент прямой линии |
| pygame.draw.lines | — | для рисования нескольких смежных отрезков |
| pygame.draw.aaline | — | рисовать тонкую линию |
| pygame.draw.aalines | — | нарисовать связанную последовательность сглаженных линий |
Загрузка изображения
Модуль pygame.image позволяет загрузить изображерие из файла и возвращает объект типа Surface.
pygame.image.load(«путь к файлу» )
загрузить новое изображение из файла
Загрузить изображение (путь к файлу для Windows)
определить место размещения
выгрузить объект Surface, который содержит загруженное из файла изображение (myImage), в описанное место на экране (myRect)
Объект Rect
Pygame использует объекты Rect для хранения и манипулирования прямоугольными областями. Rect может быть создан из комбинации значений слева, сверху, ширины и высоты. Rect также могут быть созданы из объектов python, которые уже являются Rect или имеют атрибут с именем «rect».
Rect(left, top, wiph, height) -> Rect
Rect((left, top), (wiph, height)) -> Rect
Методы работы с Rect
| pygame.Rect.copy | — | Возвращает новый прямоугольник, имеющий ту же позицию и размер, что и оригинал. |
| pygame.Rect.move | — | Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым целочисленным значением, положительным или отрицательным. |
| pygame.Rect.move_ip | — | То же, что и метод Rect.move (), но работает на месте. |
| pygame.Rect.inflate | — | увеличивать или уменьшать размер прямоугольника, на месте |
| pygame.Rect.inflate_ip | — | увеличивать или уменьшать размер прямоугольника, на месте |
| pygame.Rect.clamp | — | перемещает прямоугольник внутри другого |
| pygame.Rect.clamp_ip | — | перемещает прямоугольник внутри другого, на месте |
| pygame.Rect.clip | — | обрезает прямоугольник внутри другого |
| pygame.Rect.union | — | соединяет два прямоугольника в один |
| pygame.Rect.union_ip | — | соединяет два прямоугольника в один, на месте |
| pygame.Rect.unionall | — | объединение многих прямоугольников |
| pygame.Rect.unionall_ip | — | объединение многих прямоугольников, на месте |
| pygame.Rect.fit | — | изменить размер и переместить прямоугольник учмиывая соотношение сторон |
| pygame.Rect.normalize | — | корректировать отрицательные размеры |
| pygame.Rect.contains | — | проверить, находится ли один прямоугольник внутри другого |
| pygame.Rect.collidepoint | — | проверить, находится ли точка внутри прямоугольника |
| pygame.Rect.colliderect | — | тест, пересекаются ли два прямоугольника |
| pygame.Rect.collidelist | — | проверить, пересекается ли хоть один прямоугольник в списке |
| pygame.Rect.collidelistall | — | пересекаются ли все прямоугольники в списке |
| pygame.Rect.collidedict | — | проверить, если один прямоугольник в словаре пересекается |
| pygame.Rect.collidedictall | — | пересекаются ли все прямоугольники в словаре |
Обработка событий
Событие — это то, как Pygame сообщает о том, что что-то случилось за пределами кода программы. События создаются, например, при нажатии клавиш клавиатуры, мыши и размещаются в очереди, дожидаясь бработки.
Функция get в модуле pygame.event возвращает последнее событие, ожидающее в очереди и удаляет его из очереди.
Объект event
модуль для обработки очереди событий
| pygame.event.pump | — | Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump (), чтобы позволить pygame обрабатывать внутренние действия |
| pygame.event.get | — | получает события из очереди |
| pygame.event.poll | — | получить одно событие из очереди |
| pygame.event.wait | — | ждёт одиночного события из очереди |
| pygame.event.peek | — | проверить, ждут ли очереди события определённого типа |
| pygame.event.clear | — | удалить все события из очереди |
| pygame.event.event_name | — | возвращает имя для типа события. Строка находится в стиле WordCap |
| pygame.event.set_blocked | — | проверяет, какие события не разрешены в очереди |
| pygame.event.set_allowed | — | проверяет, какие события разрешены в очереди |
| pygame.event.get_blocked | — | проверить, заблокирован ли тип события из очереди |
| pygame.event.set_grab | — | проверяет совместное использование устройств ввода с другими приложениями |
| pygame.event.get_grab | — | проверить, работает ли программа на устройствах ввода данных |
| pygame.event.post | — | поместить новое событие в очередь |
| pygame.event.Event | — | создать новый объект события |
| pygame.event.EventType | — | Объект Python, представляющий событие SDL. Экземпляры пользовательских событий создаются с вызовом функции Event. Тип EventType не может быть напрямую вызван. Экземпляры EventType поддерживают назначение и удаление атрибутов. |
Pygame отслеживает все сообщения о событиях через очередь событий. Процедуры в этом модуле помогают управлять этой очередью событий. Входная очередь сильно зависит от модуля отображения (display) pygame. Если дисплей не был инициализирован и видеорежим не установлен, очередь событий не будет работать.
Существует множество способов доступа к очереди событий. Просто проверять существование событий, захватывать их непосредственно из стека.
| pygame.mouse.get_pressed | — | получить состояние кнопок мыши |
| pygame.mouse.get_pos | — | получить позицию курсора мыши |
| pygame.mouse.get_rel | — | получить количество движений мыши |
| pygame.mouse.set_pos | — | установить позицию курсора мыши |
| pygame.mouse.set_visible | — | скрыть или показать курсор мыши |
| pygame.mouse.get_focused | — | проверяет, принимает ли дисплей ввод мыши |
| pygame.mouse.set_cursor | — | установить изображение для курсора мыши |
| pygame.mouse.get_cursor | — | получить изображение для курсора мыши |
Функции мыши можно использовать для получения текущего состояния устройства мышь. Эти функции также могут изменять курсор мыши.
Когда режим отображения (display) установлен, очередь событий начнет принимать события мыши. Кнопки мыши генерируют события pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP, когда они нажимаются и отпускаются. Эти события содержат атрибут кнопки, указывающий, какая кнопка была нажата. Колесо мыши будет генерировать pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP события при прокрутке.
Когда колесо повернуто вверх, кнопка будет установлена на 4, вниз -5. Всякий раз, когда мышь перемещается, генерируется событие pygame.MOUSEMOTION. Движение мыши разбито на небольшие и точные события движения. По мере перемещения мыши многие события движения будут помещены в очередь. События движения мыши, которые неправильно очищены от очереди событий, являются основной причиной того, что очередь событий заполняется.
Пример. Нарисовать курсор под текущей позицией мыши.
Определить какая кнопка была нажата на мышке можно используя значение event.button:
Пример. Перемещать картинку курсором мыши.
Клавиатура
Этот модуль содержит функции для работы с клавиатурой.Очередь событий получает события pygame.KEYDOWN и pygame.KEYUP при нажатии и отпускании клавиш клавиатуры.
Оба события имеют ключевой атрибут, который представляет собой целочисленный идентификатор, представляющий каждую клавишу на клавиатуре.Событие pygame.KEYDOWN имеет дополнительные атрибуты: unicode и scancode. unicode представляет собой одну символьную строку, которая соответствует введённому символу. Scancode представляет собой код для конкретной платформы.
Получить код клавиши:
pressed_keys = pygame.key.get_pressed()
if pressed_keys[K_SPACE]:
# Space key has been pressed
fire()
Существует много клавиатурных констант, они используются для представления клавиш на клавиатуре. Ниже приведен список всех клавиатурных констант:
| KeyASCII | ASCII | CommonName |
|---|---|---|
| K_BACKSPACE | \b | backspace |
| K_TAB | \t | tab |
| K_CLEAR | clear | |
| K_RETURN | \r | return |
| K_PAUSE | pause | |
| K_ESCAPE | ^[ | escape |
| K_SPACE | space | |
| K_EXCLAIM | ! | exclaim |
| K_QUOTEDBL | « | quotedbl |
| K_HASH | # | hash |
| K_DOLLAR | $ | dollar |
| K_AMPERSAND | & | ampersand |
| K_QUOTE | quote | |
| K_LEFTPAREN | ( | leftparenthesis |
| K_RIGHTPAREN | ) | rightparenthesis |
| K_ASTERISK | * | asterisk |
| K_PLUS | + | plussign |
| K_COMMA | , | comma |
| K_MINUS | — | minussign |
| K_PERIOD | . | period |
| K_SLASH | / | forwardslash |
| K_0 | 0 | 0 |
| K_1 | 1 | 1 |
| K_2 | 2 | 2 |
| K_3 | 3 | 3 |
| K_4 | 4 | 4 |
| K_5 | 5 | 5 |
| K_6 | 6 | 6 |
| K_7 | 7 | 7 |
| K_8 | 8 | 8 |
| K_9 | 9 | 9 |
| K_COLON | : | colon |
| K_SEMICOLON | ; | semicolon |
| K_LESS | less-thansign | |
| K_EQUALS | = | equalssign |
| K_GREATER | > | greater-thansign |
| K_QUESTION | ? | questionmark |
| K_AT | @ | at |
| K_LEFTBRACKET | [ | leftbracket |
| K_BACKSLASH | \ | backslash |
| K_RIGHTBRACKET | ] | rightbracket |
| K_CARET | ^ | caret |
| K_UNDERSCORE | _ | underscore |
| K_BACKQUOTE | ` | grave |
| K_a | a | a |
| K_b | b | b |
| K_c | c | c |
| K_d | d | d |
| K_e | e | e |
| K_f | f | f |
| K_g | g | g |
| K_h | h | h |
| K_i | i | i |
| K_j | j | j |
| K_k | k | k |
| K_l | l | l |
| K_m | m | m |
| K_n | n | n |
| K_o | o | o |
| K_p | p | p |
| K_q | q | q |
| K_r | r | r |
| K_s | s | s |
| K_t | t | t |
| K_u | u | u |
| K_v | v | v |
| K_w | w | w |
| K_x | x | x |
| K_y | y | y |
| K_z | z | z |
| K_DELETE | delete | |
| K_KP0 | keypad0 | |
| K_KP1 | keypad1 | |
| K_KP2 | keypad2 | |
| K_KP3 | keypad3 | |
| K_KP4 | keypad4 | |
| K_KP5 | keypad5 | |
| K_KP6 | keypad6 | |
| K_KP7 | keypad7 | |
| K_KP8 | keypad8 | |
| K_KP9 | keypad9 | |
| K_KP_PERIOD | . | keypadperiod |
| K_KP_DIVIDE | / | keypaddivide |
| K_KP_MULTIPLY | * | keypadmultiply |
| K_KP_MINUS | — | keypadminus |
| K_KP_PLUS | + | keypadplus |
| K_KP_ENTER | \r | keypadenter |
| K_KP_EQUALS | = | keypadequals |
| K_UP | uparrow | |
| K_DOWN | downarrow | |
| K_RIGHT | rightarrow | |
| K_LEFT | leftarrow | |
| K_INSERT | insert | |
| K_HOME | home | |
| K_END | end | |
| K_PAGEUP | pageup | |
| K_PAGEDOWN | pagedown | |
| K_F1 | F1 | |
| K_F2 | F2 | |
| K_F3 | F3 | |
| K_F4 | F4 | |
| K_F5 | F5 | |
| K_F6 | F6 | |
| K_F7 | F7 | |
| K_F8 | F8 | |
| K_F9 | F9 | |
| K_F10 | F10 | |
| K_F11 | F11 | |
| K_F12 | F12 | |
| K_F13 | F13 | |
| K_F14 | F14 | |
| K_F15 | F15 | |
| K_NUMLOCK | numlock | |
| K_CAPSLOCK | capslock | |
| K_SCROLLOCK | scrollock | |
| K_RSHIFT | rightshift | |
| K_LSHIFT | leftshift | |
| K_RCTRL | rightcontrol | |
| K_LCTRL | leftcontrol | |
| K_RALT | rightalt | |
| K_LALT | leftalt | |
| K_RMETA | rightmeta | |
| K_LMETA | leftmeta | |
| K_LSUPER | leftWindowskey | |
| K_RSUPER | rightWindowskey | |
| K_MODE | modeshift | |
| K_HELP | help | |
| K_PRINT | printscreen | |
| K_SYSREQ | sysrq | |
| K_BREAK | break | |
| K_MENU | menu | |
| K_POWER | power | |
| K_EURO | Euro |
Направленное движение с помощью клавиш
Можно перемещать изображение на экране с клавиатуры, назначая клавиши для перемещений:
вверх, вниз, влево, вправо.
Создать картинку, например:
Проверить очередь событий:
Проверить, является ли полученное событие нажатием на клавиши со стрелками:
Если — да, то получмить код нажатой клавиши и сформировать новые координаты для картинки:
И нарисовать картинку в новом месте:
Объект Surface
объект pygame для представления изображений
Surface((width, height), flags=0, depth=0, masks=None) -> Surface
Surface((width, height), flags=0, Surface) -> Surface
Наложение поверхностей, прозрачность.
Управление временем
Когда создан объект clock, можно вызвать его функцию tick один раз за кадр,
которая возвращает время, прошедшее со времени предыдущего вызова в миллисекундах:
Функция tick может использовать необязательный параметр для установления максимальной частоты кадров. Этот параметр нужен, если игра запущена на рабочем компьютере и необходимо контролировать, чтобы она не использовала всю его вычислительная мощность на 100%:
# Игра будет работать со скоростью не более 30 кадров в секунду
time_passed = clock.tick (30)
Звуки
Для управления звуком исползуется модуль pygame.mixer. Он отвечает за любые действия со звуками.
Загружаем звуковой файл в формате *.wav
sound = pygame.mixer.Sound(«sound.wav»)
(загружаем до игрового цикла, т.к. это очень долгая операция)
Столкновения (collisions)
При написании игр часто возникает необходимость проверять взаимное расположение объектов на экране, отслеживать моменты их столкновений, пересечений.
Getting Started with Pygame
Pygame is a free-to-use and open-source set of Python Modules. And as the name suggests, it can be used to build games. You can code the games and then use specific commands to change it into an executable file that you can share with your friends to show them the work you have been doing. It includes computer graphics and sound libraries designed to be used with the Python programming language. PyGame 2.0.1 is the latest version at the time of writing this article.
Setting Up Pygame:
By default, Python doesn’t come with PyGame as an in-built Library. So we have to install it using the command prompt. Open a command prompt and type the following command:
If you already have PyGame installed, use the following command to check the version:
If your Pygame is not updated to the latest version, use the following command:
If this command shows a ModuleNotFoundError, then it is clear that pygame is not installed.