From pygame locals import что это значит

From pygame locals import что это значит

Getting pygame imported and initialized is a very simple process. It is also flexible enough to give you control over what is happening. Pygame is a collection of different modules in a single python package. Some of the modules are written in C, and some are written in python. Some modules are also optional, and might not always be present.

This is just a quick introduction on what is going on when you import pygame. For a clearer explanation definitely see the pygame examples.

Import¶

First we must import the pygame package. Since pygame version 1.4 this has been updated to be much easier. Most games will import all of pygame like this.

The first line here is the only necessary one. It imports all the available pygame modules into the pygame package. The second line is optional, and puts a limited set of constants and functions into the global namespace of your script.

An important thing to keep in mind is that several pygame modules are optional. For example, one of these is the font module. When you «import pygame», pygame will check to see if the font module is available. If the font module is available it will be imported as «pygame.font». If the module is not available, «pygame.font» will be set to None. This makes it fairly easy to later on test if the font module is available.

Читайте также:  Система размораживания автоматическая что это значит

Before you can do much with pygame, you will need to initialize it. The most common way to do this is just make one call.

This will attempt to initialize all the pygame modules for you. Not all pygame modules need to be initialized, but this will automatically initialize the ones that do. You can also easily initialize each pygame module by hand. For example to only initialize the font module you would just call.

Note that if there is an error when you initialize with «pygame.init()», it will silently fail. When hand initializing modules like this, any errors will raise an exception. Any modules that must be initialized also have a «get_init()» function, which will return true if the module has been initialized.

It is safe to call the init() function for any module more than once.

Modules that are initialized also usually have a quit() function that will clean up. There is no need to explicitly call these, as pygame will cleanly quit all the initialized modules when python finishes.

Источник

Каркас игры на Pygame

Pygame задает особые правила построения кода. Эти правила не являются строгими. Однако в большинстве случаев, чтобы игра благополучно запустилась, в программе должна быть соблюдена определенная последовательность вызова ключевых команд.

Эти команды (импорт модуля, вызовы функций, цикл) создают своего рода скелет, или каркас, программного кода. Выполнив его, вы получите «пустую» игру. Далее на этот скелет «подвешивается мясо», т. е. объявляются объекты и программируется логика игры.

Первое, что нужно сделать, это импортировать модуль pygame. После этого можно вывести на экран главное графическое окно игры с помощью функции set_mode() модуля display, входящего в состав библиотеки pygame:

Если выполнить этот код, то появится окно размером 600×400 пикселей и сразу закроется (в Linux, в Windows может зависнуть).

Функция set_mode() принимает три аргумента – размер в виде кортежа из двух целых чисел, флаги и глубину цвета. Их можно не указывать. В этом случае окно займет весь экран, цветовая глубина будет соответствовать системной. Обычно указывают только первый аргумент – размер окна.

Флаги предназначены для переключения на аппаратное ускорение, полноэкранный режим, отключения рамки окна и др. Например, команда pygame. display . set_mode ( ( 640 , 560 ) , pygame. RESIZABLE ) делает окно изменяемым в размерах.

Выражение вида pygame.RESIZABLE (вместо RESIZABLE может быть любое другое слово большими буквами) обозначает обращение к той или иной константе, определенной в модуле pygame. Часто можно встретить код, в котором перед константами не пишется имя модуля (вместо, например, pygame.QUIT пишут просто QUIT). В этом случае в начале программы надо импортировать не только pygame, но и содержимое модуля locals через from … import:

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

Функция set_mode() возвращает объект типа Surface (поверхность). В программе может быть множество объектов данного класса, но тот, что возвращает set_mode() особенный. Его называют display surface, что можно перевести как экранная (дисплейная) поверхность. Она главная.

В конечном итоге все отображается на ней с помощью функции pygame.display.update() или родственной pygame.display.flip(), и именно эту поверхность мы видим на экране монитора. Нам пока нечего отображать, мы не создавали никаких объектов. Поэтому было показано черное окно.

Функции update() и flip() модуля display обновляют содержимое окна игры. Это значит, что каждому пикселю заново устанавливается цвет. Представьте, что на зеленом фоне движется красный круг. За один кадр круг смещается на 5 пикселей. От кадра к кадру картинка целого окна изменяется незначительно, но в памяти окно будет перерисовываться полностью. Если частота составляет 60 кадров в секунду (FPS=60), то за секунду в памяти компьютера произойдет 60 обновлений множества значений, соответствующих экранным пикселям, что дает по большей части бессмысленную нагрузку на вычислительные мощности.

Если функции update() не передавать аргументы, то будут обновляться значения всей поверхности окна. Однако можно передать более мелкую прямоугольную область или список таковых. В этом случае обновляться будут только они.

Функция flip() решает проблему иным способом. Она дает выигрыш, если в set_mod() были переданы определенные флаги (аппаратное ускорение + полноэкранный режим – pygame.HWSERFACE|pygame.FULLSCREEN, двойная буферизация – pygame.DOUBLEBUFF, использование OpenGL – pygame.OPENGL). Возможно, все флаги можно комбинировать вместе (через |). При этом, согласно документации, аппаратное ускорение работает только в полноэкранном режиме.

Вернемся к нашим трем строчкам кода. Почему окно сразу закрывается? Очевидно потому, что программа заканчивается после выполнения этих выражений. Ни init(), ни set_mode() не предполагают входа в «режим циклического ожидания событий». В tkinter для этого используется метод mainloop() экземпляра Tk(). В pygame же требуется собственноручно создать бесконечный цикл, заставляющий программу зависнуть. Основная причина в том, что только программист знает, какая часть его кода должна циклически обрабатываться, а какая – нет. Например, код, создающий классы, объекты и функции не «кладут» в цикл.

Итак, создадим в программе бесконечный цикл:

После такого окно уже не закроется, а программа благополучно зависнет насовсем. Многократные клики по крестику не помогут. Только принудительная остановка программы через среду разработки или Ctrl+С, если запускали через терминал.

Как сделать так, чтобы программа закрывалась при клике на крестик окна, а также при нажатии Alt+F4? Pygame должен воспринимать такие действия как определенный тип событий.

Добавим в цикл магии:

При выходе будет генерироваться ошибка, пока забудем про нее. Сейчас достаточно того, что окно успешно закрывается.

Рассмотрим выражение pygame.event.get(). Модуль event библиотеки pygame содержит функцию get(), которая забирает список событий из очереди, в которую записываются все произошедшие события. То, что возвращает get() – это список. Забранные события удаляются из очереди, то есть второй раз они уже забираться не будут, а в очередь продолжают записываться новые события.

Цикл for просто перебирает схваченный на данный момент (в текущей итерации цикла) список событий. Каждое событие он присваивает переменной i или любой другой. Чтобы было понятней, перепишем программу таким образом:

На экране вы увидите примерно такое:

Вверху будет множество пустых квадратных скобок, которые соответствуют пустым спискам events, создаваемым на каждой итерации цикла while. И только когда окно закрывается, генерируются два события. Свойство type второго имеет значение 256, что совпадает со значением константы QUIT.

В pygame событие – это объект класса Event. А если это объект, то у него есть атрибуты (свойства и методы). В данном случае мы отслеживаем только те события, у которых значение свойства type совпадает со значением константы QUIT модуля pygame. Это значение присваивается type тогда, когда происходят события нажатия на крестик или Alt+F4. Когда эти события происходят, то в данном случае мы хотим, чтобы выполнилась функция quit() модуля pygame, которая завершает его работу.

Теперь почему возникает ошибка. Функция pygame.quit() отключает (деинициализирует) pygame, но не завершает работу программы. Таким образом, после выполнения этой функции отключаются модули библиотеки pygame, но выхода из цикла и программы не происходит. Программа продолжает работу и переходит к следующей итерации цикла while (или продолжает выполнять тело данной итерации, если оно еще не закончилось).

В данном случае происходит переход к следующей итерации цикла while. И здесь выполнить функцию get() модуля event оказывается уже невозможным. Возникает исключение и программа завершается. По-сути программу завершает не функция pygame.quit(), а выброшенное, но не обработанное, исключение.

Данную проблему можно решить разными способами. Часто используют функцию exit() модуля sys. В этом случае код выглядит примерно так:

Сначала отключается pygame, потом происходит выход из программы. Такой вариант вероятно следует считать наиболее безопасным завершением. Команда pygame.quit() не обязательна. Если завершается программа, то отключится и pygame.

Другой вариант – не допустить следующей итерации цикла. Для этого потребуется дополнительная переменная:

В этом случае завершится текущая итерация цикла, но новая уже не начнется. Если в основной ветке ниже по течению нет другого кода, программа завершит свою работу.

Нередко код основной ветки программы помещают в функцию, например, main(). Она выполняется, если файл запускается как скрипт, а не импортируется как модуль. В этом случае для завершения программы проще использовать оператор return, который осуществляет выход из функции.

Теперь зададимся вопросом, с какой скоростью крутится цикл while? С большой, зависящей от мощности компьютера. Но в данном случае такая скорость не есть необходимость, она даже вредна, так как бессмысленно расходует ресурсы. Человек дает команды и воспринимает изменения куда медленнее.

Для обновления экрана в динамической игре часто используют 60 кадров в секунду, а в статической, типа пазла, достаточно будет 30-ти. Из этого следует, что циклу незачем работать быстрее.

Поэтому в главном цикле следует выполнять задержку. Делают это либо вызовом функции delay() модуля time библиотеки pygame, либо создают объект часов и устанавливают ему частоту кадров. Первый способ проще, второй – более профессиональный.

Функция delay() принимает количество миллисекунд (1000 мс = 1 с). Если передано значение 20, то за секунду экран обновится 50 раз. Другими словами, частота составит 50 кадров в секунду.

Методу tick() класса Clock передается непосредственно желаемое количество кадров в секунду. Задержку он вычисляет сам. То есть если внутри цикла указано tick(60) – это не значит, что задержка будет 60 миллисекунд или произойдет 60 обновлений экрана за одну итерацию цикла. Это значит, что на каждой итерации цикла секунда делится на 60 и уже на вычисленную величину выполняется задержка.

Нередко частоту кадров выносят в отдельную константоподобную переменную:

В начало цикла или конец вставлять задержку зависит от контекста. Если до цикла происходит отображение каких-либо объектов на экране, то скорее всего надо вставлять в начало цикла. Если первое появление объектов на экране происходит внутри цикла, то в конец.

В итоге каркас игры на Pygame должен выглядеть примерно так:

Практическая работа

В модуле pygame.display есть функция set_caption(). Ей передается строка, которую она устанавливает в качестве заголовка окна. Сделайте так, чтобы каждую секунду заголовок окна изменялся.

Шапошникова С. (plustilino) © 2020

Pygame. Введение в разработку игр на Python

Источник

Python Pygame: Простое Введение

Привет, товарищ ученик! Сегодня вы узнаете о Python Pygame.

Автор: Pankaj Kumar
Дата записи

Привет, товарищ ученик! Сегодня вы узнаете о Python Pygame.

Python Pygame обычно используется для создания игр и другой графики. Можно управлять всей логикой и графикой. Нет никаких проблем с фоновыми сложностями, связанными с аудио и видео.

Начало работы с Python Pygame

Прежде чем перейти к основным вещам, давайте рассмотрим простой код, приведенный ниже.

  • импорт pygame и из pygame. импорт местных жителей * – Он обеспечивает доступ ко всем функциям pygame и внутренним модулям
  • pygame.init() – Инициализируйте pygame, чтобы обеспечить легкий доступ к функциям и автоматически запускать все модули pygame, которые необходимо инициализировать.
  • pygame. display.set_mode((ширина, высота)) – Он отображает окно определенной высоты и ширины.
  • pygame. display.set_caption(“Моя первая игра”) – Добавление названия игры в верхней части экрана заголовка.
  • Функция для обработки событий – Необходимо определить функцию для обработки событий, происходящих на экране. На данный момент мы принимаем во внимание одно событие, то есть закрытие окна при нажатии кнопки ” X ” на окне.
  • pygame. display.update() – Он используется для внесения необходимых обновлений на дисплее.

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

Добавление объектов в вывод Python Pygame

Приведенный выше экран абсолютно скучен. Только черный экран и ничего больше. Давайте начнем добавлять несколько элементов на экран.

1. Вставка изображения

Сначала необходимо изменить цвет фона на белый, а затем загрузить изображение из каталога. Затем загрузите изображение в определенном положении. Код для того же самого показан ниже:

На экране ниже показан вывод кода, введенного выше.

2. Вставка фигур

В библиотеке Pygame можно рисовать определенные пиксели, линии, круги, прямоугольники и любой полигон, просто указав точки, между которыми нужно рисовать.

Рекомендуемое чтение – Как использовать черепаху Python для рисования объектов?

Вставка прямоугольника – Чтобы нарисовать прямоугольник, необходимо использовать pygame.draw.rect (), который принимает ряд параметров, включая имя экрана,цвет прямоугольника и размеры прямоугольника ( x, y, ширина, высота).

Приведенный ниже код отображает на экране красный прямоугольник.

Вставка кругов – Для вставки кругов требуются такие параметры, как имя экрана, цвет, координаты центра и радиус круга.

Вывод двух фигур, нарисованных на экране, выглядит следующим образом.

Обратитесь к официальной документации Pygame.draw , чтобы узнать все различные формы, которые вы можете нарисовать с помощью этого модуля.

Создание простого пейзажа с помощью Python Pygame

Приведенный ниже код отображает на экране простой пейзаж. Попробуйте это самостоятельно, чтобы получить те же результаты!

Результаты приведенного выше кода приведены ниже:

Вывод

В этом уроке вы узнали некоторые основные понятия pygame и о том, как создавать простые формы и объекты, используя их. Продолжайте Учиться!

Источник

Оцените статью