вторник, 17 мая 2011 г.

Основы PyGame. Введение.

Сегодня я начинаю серию статей по основам библиотеки 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, вводим следующее в терминал и жмем «Ввод»:
import pygame
Если нет текста с надписью:
Traceback (most recent call last): 
  File "", line 1, in  
  import pygame 
ImportError: No module named py
то все в порядке, теперь проверим версию библиотеки PyGame, вводим в терминал:
pygame.ver
и видим что-то похожее на это:
'1.9.1release-svn2575'
Как видите все настроено хорошо, и мы можем приступить к изучению снов PyGame. Далее изучим простую структуру программы на PyGame.

Часть вторая. Простая структура программы на PyGame.

В целом эта структура работает не только для программ на PyGame, если коротко - то ее можно описать следующими словами: 1) Инициализация данных, 2) Главный цикл (рисуем каждый кадр), 3)Освобождение ресурсов занятых при инициализации (выход из программы). На рисунке ниже изображена более полная структура программы на PyGame:
Вроде бы все понятно и ничего сложного тут нет, но это формальная запись, чтобы понять, как это работает и пишется, то следует сначала написать первый “Hello, World” на PyGame.

Часть третья. “Hello, World” или простое окно на PyGame.

Писать программу в терминале интерпретатора очень сложно и неудобно, поэтому мы пойдем следующим способом:
  • Откроем в IDLE меню «File» и выберем пункт «New Window», откроется окно по функционалу напоминающее окно «блокнота».
  • В этом окне откроем меню «File» и выберем пункт «Save As…»
  • Выберем место для сохранения файла и введем название файла «pg_hello.py» (внимание, расширение «.py» следует явно указать, иначе программа сохранит файл без расширения).
Теперь мы приготовили файл для ввода текста программы, теперь начнем писать сам код программы «Hello, World». Программа будет создавать окно с надписью «Hello, World and PyGame».
Если смотреть на структуру программы выше, то вначале требуется инициализировать PyGame, но для начала нужно импортировать эту библиотеку в наш код. Это делается следующим кодом:
import pygame, sys 
from pygame.locals import *
После импорта библиотеки мы можем инициализировать ее, это не так сложно и делается всего одной стройкой кода:
pygame.init()
Теперь нам надо создать окно, на котором будет формироваться кадр, окно создается методом pygame.display.set_mode(resolution=(0,0), flags=0, depth=0), где resolution - это список чисел в котором хранится размер окна по оси х и у, flags – флаг окна (полный экран, изменяемые размеры и и т.д), depth – глубина цвета. В нашем коде инициализируется окно размером 400х100 с глубиной цвета - 32 следующим кодом:
screen = pygame.display.set_mode((640,360),0,32)
Теперь зададим заголовок для окна, делается это функцией pygame.display.set_caption(title, icontitle=None), где title – строка с заголовком окна, icontitle – иконка в заголовке. Иконку мы использовать не будем, только следующий текст в заголовке окна:
pygame.display.set_caption("My First PyGame Windows")
На этом инициализация данные еще не закончена, для того чтобы вывести текст в окне надо знать несколько значений – сам текст, и его координаты, размер шрифта. Для текста определим переменную helloText, а для координат – переменные х и у, для размера шрифта - fontSize, вот код инициализации этих переменных:
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, код не сложный:
myFont = pygame.font.SysFont("None", fontSize)
Так же нам понадобится цвет шрифта, создается он не сложно, это всего напросто последовательность из трех чисел, каждое число это вектор цвета в системе RGB, минимальное значение для него – 0, а максимально – 255, создадим желтый цвет:
fontColor = (255,255,0)
Так же нам понадобится еще цвет фона окна, назовем его bgColor, определяется он также как и цвет шрифта, только он будет уже белым, а не желтым:
bgColor = (255,255,255)
Теперь самая трудная часть, для некоторых она может быть непонятной, все дело в том, что просто так нельзя взять и написать текст на окне, для начала его надо преобразовать в изображение и лишь только потом рисовать это изображение в окне, для хранения изображения мы определим переменную с именем fontImage а метод объекта myFont, который преобразует текст в картинку выглядит следующим образом - render(text, antialias, color, background=None), где text – текст, antialias – сглаживание шрифта, color – цвет текста, background – цвет фона (не обязательный параметр). Зная это, мы можем написать следующий код, в котором определяем изображение с текстом:
fontImage = myFont.render(helloText, 0, (fontColor))
Последний пункт в инициализации данных – создание флага цикла отображение кадров, флаг будет иметь имя mainLoop, и будет содержать в себе логическое значение True, для чего это надо будет сказано ниже, а пока код инициализации флага цикла выглядит следующим образом:
mainLoop = True
Работать над блоком инициализации мы закончили, теперь пришло время проверки флага главного цикла, если этот флаг имеет значение True, то продолжается цикл, в котором идет обработка событий, формирование кадра и отображение этого кадра, иначе будет происходить освобождение ресурсов и выход из программы.
Флаг проверяется следующим кодом:
while mainLoop:
Теперь если смотреть на схему мы должны обработать события, обработка событий очень трудная тема для начинающих, ниже я попытаюсь объяснить что такое события в PyGame, а в следующих статьях еще более подробно, сейчас вам надо понять то, что для обработки событий будет введен итератор event, этот итератор будет проходить по списку, который возвращает метод pygame.event.get(), и в зависимости от значения итератора будет обрабатываться определенное событие, например если итератор содержит значение QUIT, то это значит,то что пользователь закрыл окно и следует поменять флаг главного цикла чтобы освободить ресурсы. Может казаться очень трудным ну это всего три строчки кода:
for event in pygame.event.get(): 
  if event.type == QUIT: 
  mainLoop = False
Теперь следует сформировать кадр, для начала зальем кадр цветом заднего фона, за это отвечает метод fill(color, rect=None, special_flags=0) объекта screen, как видно этот метод принимает в параметрах список из трех чисел, этот список у нас уже есть и называется он bgColor, так что код заливки выглядит так:
screen.fill(bgColor)
Ну и окончательная часть цикла - это отображение кадра, за это отвечает метод pygame.display.update(), он не требует никаких параметров в данном случае, поэтому просто добавляем его в код:
pygame.display.update()
С циклом мы разобрались, теперь пришло время освободить ресурсы, но так как Pyton динамический язык программирования, то лучше дать это сделать ему самому, ведь он лучше знает, что именно освобождать и в каком порядке, сборщик мусора в Python отлично с этим справится, нам лишь придется закрыть PyGame. Делается это всего одним методом pygame.quit(), ничего этот метод не принимает в качестве параметров, нам надо просто его написать в коде программы:
pygame.quit()
Вот и все, первая программа на PyGame готова, в итоге должен выйти следующий код:
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.