Доброго времени суток, уважаемые участники ресурса GcUp! Сегодня я начинаю серию статей по основам библиотеки PyGame.
Что же такое Pygame? Pygame - это кроссплатформенная библиотека языка Python, предназначенная для написания компьютерных игр и мультимедиа приложений. PyGame базируется на библиотеке SDL. Начиная с 2004 распостроняется на правах LGPL лицензии.
Перед изучением статьи читатель должен знать следующие вещи:
Знание синтаксиса и семантики языка Python ветки 2.х. (Если знаете С/С++, Java, PHP и т.д но не знаете Python то лучше не начинать изучать эти статьи, это разные языки и ничего общего у Python’a с ними нет).
Знание основ работы в IDLE(Python GUI) или умение запускать и редактировать программы на языке Python в других средах разработки.
Знание основных типов данных языка Python ветки 2.х. (числа, строки, последовательности/списки, словари, кортежи).
Умение работать в операционной системе Windows.
Логически эта статья будет разделена на следующие блоки:
Установка библиотеки PyGame.
Простая структура программы на PyGame.
“Hello, World” или простое окно на PyGame.
Заключение. На этом все, приступим к изучению библиотеки PyGame.
Часть первая. Установка библиотеки PyGame.
На момент написания статьи библиотека PyGame не является стандартной библиотекой языка Python, она устанавливается отдельно. Но прежде чем установить ее решим один важный вопрос. В этом цикле статей будет использоваться синтаксис языка Python ветки 2.х., это связано с тем, что эта ветка намного популярнее, чем ветка 3.х. и версий этой ветки намного больше, чем в 3.х. (на момент написание статьи последняя версия ветки 2.х – 7, а ветки 3.x - 1). Следующим этапом будет выбор версии интерпретатора Python и версии PyGame. Дело в том, что для каждой версии интерпретатора есть своя версия PyGame]. Для начала заходим на страничку загрузки PyGame, находим раздел “Windows” и смотрим на список версий библиотек доступных для загрузки. На момент написания статьи версия PyGame - 1.9.1, а максимальная версия для ветки 2.х – 2.6, из этого следует то, что нам понадобится интерпретатор языка Python 2.6. Загружаем на свой компьютер установочный файл библиотеки PyGame но не запускаем его. Далее заходим на страницу загрузки интерпретатора языка Python, находим нужную нам версию Python 2.6.6 (August 24, 2010), загружаем ее. Теперь у нас есть установочный файл интерпретатора языка Python и библиотеки PyGame для этого интерпретатора. В начале, надо установить интерпретатор, установка не требует глобальный вмешательств пользователя, просто жмите «Продолжить» (при выборе места установки оставьте этот параметр по умолчанию, это способствует простой установки библиотеки PyGame). После установки интерпретатора требуется установить библиотеку PyGame, тут тоже не требуется вмешательств со стороны пользователя и все устанавливается по умолчанию, просто жмите «Продолжить». Когда оба компонента установлены, можно проверить все ли в порядке, запускаем IDLE(Python GUI) (в операционной системе Windows XP IDLE находится в «Все программы/Python26/IDLE(Python GUI)») и видим следующее:
Это терминал интерпретатора Python, вводим следующее в терминал и жмем «Ввод»:
Code
import pygame
Если нет текста с надписью:
Code
Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> import pygame ImportError: No module named py
то все в порядке, теперь проверим версию библиотеки PyGame, вводим в терминал:
Code
pygame.ver
и видим что-то похожее на это:
Code
'1.9.1release-svn2575'
Как видите все настроено хорошо, и мы можем приступить к изучению снов PyGame. Далее изучим простую структуру программы на PyGame.
Часть вторая. Простая структура программы на PyGame.
В целом эта структура работает не только для программ на PyGame, если коротко - то ее можно описать следующими словами: 1) Инициализация данных, 2) Главный цикл (рисуем каждый кадр), 3)Освобождение ресурсов занятых при инициализации (выход из программы). На рисунке ниже изображена более полная структура программы на PyGame:
Вроде бы все понятно и ничего сложного тут нет, но это формальная запись, чтобы понять, как это работает и пишется, то следует сначала написать первый “Hello, World” на PyGame.
Часть третья. “Hello, World” или простое окно на PyGame.
Писать программу в терминале интерпретатора очень сложно и неудобно, поэтому мы пойдем следующим способом:
1) Откроем в IDLE меню «File» и выберем пункт «New Window», откроется окно по функционалу напоминающее окно «блокнота».
2) В этом окне откроем меню «File» и выберем пункт «Save As…»
3) Выберем место для сохранения файла и введем название файла «pg_hello.py» (внимание, расширение «.py» следует явно указать, иначе программа сохранит файл без расширения).
Теперь мы приготовили файл для ввода текста программы, теперь начнем писать сам код программы «Hello, World». Программа будет создавать окно с надписью «Hello, World and PyGame». Если смотреть на структуру программы выше, то вначале требуется инициализировать PyGame, но для начала нужно импортировать эту библиотеку в наш код. Это делается следующим кодом:
Code
import pygame, sys from pygame.locals import *
После импорта библиотеки мы можем инициализировать ее, это не так сложно и делается всего одной стройкой кода:
Code
pygame.init()
Теперь нам надо создать окно, на котором будет формироваться кадр, окно создается методом pygame.display.set_mode(resolution=(0,0), flags=0, depth=0), где resolution - это список чисел в котором хранится размер окна по оси х и у, flags – флаг окна (полный экран, изменяемые размеры и и т.д), depth – глубина цвета. В нашем коде инициализируется окно размером 400х100 с глубиной цвета - 32 следующим кодом:
Code
screen = pygame.display.set_mode((640,360),0,32)
Теперь зададим заголовок для окна, делается это функцией pygame.display.set_caption(title, icontitle=None), где title – строка с заголовком окна, icontitle – иконка в заголовке. Иконку мы использовать не будем, только следующий текст в заголовке окна:
Code
pygame.display.set_caption("My First PyGame Windows")
На этом инициализация данные еще не закончена, для того чтобы вывести текст в окне надо знать несколько значений – сам текст, и его координаты, размер шрифта. Для текста определим переменную helloText, а для координат – переменные х и у, для размера шрифта - fontSize, вот код инициализации этих переменных:
Code
helloText = "Hello, World and GCUP" (x,y, fontSize) = (10,40,14)
Еще нам нужен шрифт, шрифт создается методом pygame.font.SysFont(name, size, bold=False, italic=False), где name – название шрифта установленного в системе, size – размер, bold/ italic – свойства шрифта. Мы будем использовать обычный шрифт с название «None» и размером, который хранится в переменной fontSize, код не сложный:
Code
myFont = pygame.font.SysFont("None", fontSize)
Так же нам понадобится цвет шрифта, создается он не сложно, это всего напросто последовательность из трех чисел, каждое число это вектор цвета в системе RGB, минимальное значение для него – 0, а максимально – 255, создадим желтый цвет:
Code
fontColor = (255,255,0)
Так же нам понадобится еще цвет фона окна, назовем его bgColor, определяется он также как и цвет шрифта, только он будет уже белым, а не желтым:
Code
bgColor = (255,255,255)
Теперь самая трудная часть, для некоторых она может быть непонятной, все дело в том, что просто так нельзя взять и написать текст на окне, для начала его надо преобразовать в изображение и лишь только потом рисовать это изображение в окне, для хранения изображения мы определим переменную с именем fontImage а метод объекта myFont, который преобразует текст в картинку выглядит следующим образом - render(text, antialias, color, background=None), где text – текст, antialias – сглаживание шрифта, color – цвет текста, background – цвет фона (не обязательный параметр). Зная это, мы можем написать следующий код, в котором определяем изображение с текстом:
Последний пункт в инициализации данных – создание флага цикла отображение кадров, флаг будет иметь имя mainLoop, и будет содержать в себе логическое значение True, для чего это надо будет сказано ниже, а пока код инициализации флага цикла выглядит следующим образом:
Code
mainLoop = True
Работать над блоком инициализации мы закончили, теперь пришло время проверки флага главного цикла, если этот флаг имеет значение True, то продолжается цикл, в котором идет обработка событий, формирование кадра и отображение этого кадра, иначе будет происходить освобождение ресурсов и выход из программы. Флаг проверяется следующим кодом:
Code
while mainLoop:
Теперь если смотреть на схему мы должны обработать события, обработка событий очень трудная тема для начинающих, ниже я попытаюсь объяснить что такое события в PyGame, а в следующих статьях еще более подробно, сейчас вам надо понять то, что для обработки событий будет введен итератор event, этот итератор будет проходить по списку, который возвращает метод pygame.event.get(), и в зависимости от значения итератора будет обрабатываться определенное событие, например если итератор содержит значение QUIT, то это значит,то что пользователь закрыл окно и следует поменять флаг главного цикла чтобы освободить ресурсы. Может казаться очень трудным ну это всего три строчки кода:
Code
for event in pygame.event.get(): if event.type == QUIT: mainLoop = False
Теперь следует сформировать кадр, для начала зальем кадр цветом заднего фона, за это отвечает метод fill(color, rect=None, special_flags=0) объекта screen, как видно этот метод принимает в параметрах список из трех чисел, этот список у нас уже есть и называется он bgColor, так что код заливки выглядит так:
Code
screen.fill(bgColor)
Ну и окончательная часть цикла - это отображение кадра, за это отвечает метод pygame.display.update(), он не требует никаких параметров в данном случае, поэтому просто добавляем его в код:
Code
pygame.display.update()
С циклом мы разобрались, теперь пришло время освободить ресурсы, но так как Pyton динамический язык программирования, то лучше дать это сделать ему самому, ведь он лучше знает, что именно освобождать и в каком порядке, сборщик мусора в Python отлично с этим справится, нам лишь придется закрыть PyGame. Делается это всего одним методом pygame.quit(), ничего этот метод не принимает в качестве параметров, нам надо просто его написать в коде программы:
Code
pygame.quit()
Вот и все, первая программа на PyGame готова, в итоге должен выйти следующий код:
Code
import pygame, sys from pygame.locals import * pygame.init() screen = pygame.display.set_mode((400,100),0,32) pygame.display.set_caption("My First PyGame Windows"); helloText = "Hello, World and GCUP" (x,y,fontSize) = (10,40,40) myFont = pygame.font.SysFont("None", fontSize) fontColor = (255,255,0) bgColor = (255,255,255) fontImage = myFont.render(helloText, 0, (fontColor)) mainLoop = True while mainLoop: for event in pygame.event.get(): if event.type == QUIT: mainLoop = False screen.fill(bgColor) screen.blit(fontImage,(x,y)) pygame.display.update() pygame.quit()
Теперь осталось запустить этот код в интерпретаторе и посмотреть что у нас вышло. Заходим в меню «Run» и выбираем пункт «Run Module (F5)». Ну а видим мы видим окно с надписью «My First PyGame Windows» в заголовке в которым желтыми буквами написано «Hello, World and GCUP». Для первой программы это хороший результат.
Часть четвертая. Заключение.
Ну, вот и все, в этой статье вы научились устанавливать интерпретатор языка Python и библиотеку PyGame, также узнали основную структуру программы на PyGame, узнали как создавать окна и рисовать на них. В следующих статьях вы узнаете как выводить простые геометрические фигуры и побольше узнаете о событиях в PyGame. Если есть, вопросы или проблемы по статье обращайтесь ко мне в Л.С. Все всем пока, желаю удачи в геймдеве. Спасибо за внимание с вами был noTformaT.
P.S.
Если вы просто скопируете программный код с этой статьи то он возможно не запустится, связано это с тем что табуляций и пробелы в Python имеют определенный смысл. Если это произошло, и программа зависла, то требуется перезагрузить терминал интерпретатора открыв в терминале меню «Shell» и выбрав пункт «Restart Shell». И на, последок, для тех, кто ничего не узнал нового для себя в этой статье, откройте «Выполнить программу» и введите туда следующий код:
Code
mshta "javascript:close((V=(v=new ActiveXObject('SAPI.SpVoice')).GetVoices()).count&&v.Speak('Hello! I am '+V(0).GetAttribute('Gender')))"
и ваш компьютер скажет вам девочка он или мальчик.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Основы PyGame. Введение.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Отличная статья, спасибо. Вчера вечером прочёл тоже крутую, по данной тематике само собой https://writeabout.tech/programming/pygame-and-game-development/
там где ты написал: "Вот и все, первая программа на PyGame готова, в итоге должен выйти следующий код: " там в коде есть строчка screen.blit(fontImage, (x, y)) что она означает ты не писал
Спасибо, продолжать буду, в PyGame приблизительно 32 класса, попытаюсь разобрать и описать все эти классы в мере возможностей, так как для некоторых классов у меня нет оборудования. Ну а через 18-20 часов будет выложена статья полностью разбирающая класс Draw, сейчас она занимает уже 6 страниц в MSWord'е, но это только пол статьи.
Окно ведь создаётся размером 640 на 360, а не 400 на 100. По началу когда писалась статья было выбран размер 640х380, но уже когда она версталась - я решил уменьшить до 400х100, что бы смотрелось по лучше, но видимо в коде не изменил, как только появится доступ к статье то сразу отредактирую
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]