PythonВведение в Pygame. (Перевод)

История

Pygame стартовал летом 2000 года. Будучи уже много лет программистом на CИ, Я открыл Python и SDL примерно в одно время. Ты уже знаком с Python, который был в версии 1.5.2. Тебе может понадобиться введение в SDL, Simple Directmedia Library. Созданная Семом Латинга, SDL кросплатформенная библиотека СИ для контролирования мультимедиа, сравнимая с DirectX. Она была использована для сотен коммерческих игр и игр с открытым исходным кодом. Я был поражен что настолько чистых и простых проектов не было уже давно, я понял, смешивать Python и SDL было интересным предложением.

Я обнаружил что небольшой проект уже осуществляется c той же целью, PySDL. Созданный Марком Бакером, PySDL был простой реализацией SDL как расширения Python. Интерфейс был чище чем стандартной SWIG оболочки, но я чувствовал влияние СИ стиля в коде. Внезапная смерть PySDL побудила меня взять на себя новый проект из моих собственных.

Я хотел собрать проект который действительно возьмет преимущества Python. Моей целью было сделать просто простые вещи и просто делать сложные вещи. Pygame стартовал в октябре 2000 года. Шесть месяцев спустя была реализована версия 1.0 Pygame.

Проба

Я считаю лучший путь для понимания новой библиотеки это переход прямо к примеру. В первые дни Pygame я создал анимацию отскакивающего мяча с 7 строками кода. Давайте рассмотрим дружественную версию что тоже самое. Это должно быть достаточно просто, чтобы проследить, и полностью разобрать следующее.


 1    import sys, pygame
 2    pygame.init()
 3
 4    size = width, height = 320, 240
 5    speed = [2, 2]
 6    black = 0, 0, 0
 7
 8    screen = pygame.display.set_mode(size)
 9
10    ball = pygame.image.load("ball.bmp")
11    ballrect = ball.get_rect()
12
13    while 1:
14        for event in pygame.event.get():
15            if event.type == pygame.QUIT: sys.exit()
16
17        ballrect = ballrect.move(speed)
18        if ballrect.left < 0 or ballrect.right > width:
19            speed[0] = -speed[0]
20        if ballrect.top < 0 or ballrect.bottom > height:
21            speed[1] = -speed[1]
22
23        screen.fill(black)
24        screen.blit(ball, ballrect)
25        pygame.display.flip()

Это очень простой способ получить анимацию. В начале вы видите импорт и инициализацию Pygame, в чем нет ничего удивительного. Выражение «import pygame» импортирует пакет в котором все доступные модули Pygame. Вызов «pygame.init()» инициализирует каждый из этих модулей.

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

В 10 строке мы загружаем изображение мяча. Pygame поддерживает различные форматы изображения посредством библиотеки SDL_image и включает в себя форматы JPG, PNG, TGA, GIF. Функция «pygame.image.load()» возвращает нам Поверхность с данными мяча. Поверхность будет хранить цветовой ключ и альфу прозрачности из файла. После загрузки изображения мяча мы объявляем переменную названную ballrect. Pygame поставляется с удобным утилитарным типом объекта названным Rect, который представляет прямоугольную область. Позднее, в анимационной части кода, мы увидим чем занимается Rect объект.

С этой строки, под номером 13, наша программа инициализирована и готова к работе. Внутри бесконечного цикла мы проверяем пользовательский ввод, движение мяча, и его отскок. Если вы в курсе программирования GUI, вы имеете некоторый опыт по событиям и по циклам. В Pygame нет различий, мы проверяем произошло ли событие QUIT. Если так мы просто выходим из программы, можно быть уверенным что Pygame все выключит.

Это время обновления расположения мяча. Строки с 17 по 21 двигают переменную ballrect с текущей скоростью. Если мяч двигается за границы экрана, мы обращаем скорость в том направлении. Не точно Ньютоновская физика, но то что нам нужно.

В строке 23 мы очишаем экран заполняя его черным цветом RGB. Если ты никогда не работал с анимацией это может показаться странным. Ты может быть спросишь «Почему мы должны стереть все, почему бы нам не только перемещать мяч по экрану?» Это не совсем так, как работа компьютерной анимации. Анимация это не более чем серия одиночных изображений, которая при отображении в движении дает хороший обман человеческого зрения показывая в движении. Экран состоит всего из одного изображения который видит пользователь. Если мы бы не тратили время на удаление мяча с экрана, мы бы на самом деле увидели «след» мяча т.к. мы постоянно рисуем мяч в новой позиции.

В строке 24 мы рисуем изображение мяча на экране. Отрисовка изображения обрабатывается методом «Surface.blit()»". Блитирование в основном означает копирование цвета пикселей из одного изображения в другое. Мы передаем метод блитирования для исходной Поверхности для копирования и возможности привести источник в нужное положение.

Последняя вещь которую нам в действительности нужно сделать это обновить видимый дисплей. Pygame управляет дисплеем посредством двойного буфера. Затем, когда мы заканчиваем прорисовку мы вызываем метод «pygame.display.flip()». Он делает все что мы обрисовывали на Поверхности экрана видимым. Буферизация гарантирует, что на экране мы видим только полностью обработанные кадры. Без нее, пользователь мог бы увидеть на половину наполненные части экрана как если бы они были открыты.

На этом мы заканчиваем краткое введение в Pygame. Pygame так же включает модули производящие обработку подобную обработке ввода с клавиатуры, мыши или джойстика. Оно может микшировать аудио и декодировать музыкальный поток. С Поверхностями мы можем рисовать примеры масштабных, формообразующих, и пространственных изображений. Даже манипуляцию пикселями изображения в реальном времени, как Цифровыми массивами Python. Есть здесь проигрывание MPEG видео и поддержка CD. Pygame также имеет способность действовать как кросс-платформенное средство для отображения в PyOpenGL. Большинство модулей Pygame написаны на C, и только несколько на самом Python.

Сайт проекта Pygame содержит нужную документацию по каждой функции Pygame и учебные материалы для широкого круга пользователей. Исходные тексты Pygame поставляются с большим количеством примеров, таких как обезьяньи игры или ловля НЛО.

PYTHON И ИГРЫ

«Подходит ли Питон для игр?» Ответ таков: «Это зависит от игры.»

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

В последние несколько лет наблюдается интересная тенденция в игровой индустрии — движение к использованию высокоуровневых языков. Обычно игра разбивается на две основных части. Игровой движок, который должен быть настолько быстр, насколько это возможно, и игровая логика, которая используя движок создает саму игру. Не так давно движки писали с использованием ассемблера и небольших вставок на C. Теперь же, C стал основным языком написания игровых движков, в то время как сами игры пишутся на более выскокоуровневых скриптовых языках. Игры типа Quake3 или Unreal выполняют эти скрипты как портабельный байткод.

В начале 2001, разработчики Rebel Act Studios завершили свою игру — Severance: Blade of Darkness. Используя свой 3D движок, они написали всю остальную игру на Питоне. Игра представляет собой кровожадный файтинг с перспективой от третьего лица. Вы заставляете своих средневековых воинов выполнять головоломные атакующие комбинации в процессе исследования подземелий и замков. Вы можете скачать сторонние дополнения к этой игре, и обнаружить что они являются всего лишь исходными кодами на Питоне.

В течении последнего времени Питон использовался во множестве игр таких как Freedom Force или Humungous' Backyard Sports Series.

Pygame и SDL являются превосходными движками на С для двухмерных игр. Игры будут продолжать тратить большую часть машинного времени выполняя обработку графики внутри SDL. SDL может использовать преимущества аппаратного ускорения. Использование этой возможности может ускорить выполнение игры с 40 кадров в секунду до более чем 200. Когда вы видите игру на Питоне выполняющуюся со скоростью 200 кадров в секунду, вы осознаете что использование Питона для игр это реальная возможность.

Это впечатляет, как Питон и SDL могут работать на различных платформах. Например, в мае 2001 я выпустил мой проект SolarWolf, реализованный полностью на Pygame. Это был аркадный экшн. Что меня удивило, так это то что спустя год не было нужды в каких либо патчах, багфиксах или обновлениях. Игра была разработана полностью под Windows, но выполнялась на Linux, Mac OSX и многих Unix платформах без какой либо дополнительной работы с моей стороны.

Тем не менее, есть довольно ясные ограничения. Лучший путь для управления аппаратным ускорением графики не всегда является самым быстрым. Аппаратная поддержка доступна не для всех платформ. Когда игра усложняется, необходимо выбрать один из путей. SDL имеет и другие ограничения обусловленные дизайном, например полноэкранный скроллинг может ухудшить скорость вашей игры до неприемлимой. Хотя SDL и не подходит для всех типов игр, тем не менее вспомните что такие компании как Loki используя SDL создали множество успешных игр.

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

ЗАКЛЮЧЕНИЕ

Разработка игр очень захватывающа — есть что то притягательное в том чтобы наблюдать и взаимодействовать с тем что вы сами написали. На текущий Pygame используется почти в 30 проектах. Несколько из них уже вполне играбельны. Вы можете быть удивлены посетив сайт Pygame и увидев что можно сделать с помощью Питона.

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

В конце хотелось бы дать совет — делайте все проще. Я не могу передать насколько это важно. Если вы планируете создать вашу первую игру, есть многое чему стоит научиться. Даже простая игра будет состязанием для ваших умений, а сложные игры не обязательно будут интересными. Когда вы поймете Питон, вы сможете использовать Pygame для создания простых игр в течении одной или двух недель. Начиная с этого момента вы будете удивлены тем, сколько времени нужно для доведения игры до полностью рабочего состояния.

Обзор модулей Pygame
cdrom — управление устройствами компакт-дисков и воспроизведения звука
cursors — загрузка изображений курсора, включает стандартные курсоры
display — управление окном или экраном
draw — рисование графических примитивов на поверхности (класс Surface)
event — управление событиями и очередью событий
font — создание и отображение шрифтов TrueType
image — сохранение и загрузка изображений
joystick — управление джойстиками
key — управление клавиатурой
mouse — управление мышью
movie — проигрывание mpeg клипов
sndarray — управление звуками с помощью класса Numeric
surfarray — управление изображениями с помощью класса Numeric
time — управление таймерами
transform — изменение размеров, вращение и изменение ориентации изображений

Перевод: Алексей, saturn721, v1ctor.
Оригинал: www.pygame.org/docs/tut/intro/intro.html
  • +11
  • v1ctor
  • 22 мая 2010, 15:44

Комментарии (9)

Питон — офигенный язык, но он очень развращает
Чем развращает? Тем что много сторонних модулей и все уже решено? Это да)
Именно, хотя это выливается в скорость разработки, а вообще начал забывать объявлять переменные, с указателями путаться, когда опят за ц++ пришлось взяться. Вспомнилось быстро, после нескольких увлекательных дебагов, с гипнотизированием монитора.
Зато мне очень нравится как он приручает к структурированию кода. Еще ни разу не путался просматривая чужой код в отличии от других языков.
Структура — это, безусловно, хорошо, но у меня такой проблемы не было, с чтением кода (своего, кстати, тоже) проблем больше возникает, когда забываю что для чего обьявил. В кураче, например, было, несколько индексов: i, ii, iii %), но это уже проблема не конкретного языка…
Пример не работает:
File "game.py", line 12
    ballrect = ballrect.move(speed)
    ^
IndentationError: unexpected indent

pygame установлен
да да моя вина…
Код исправил.
работает (только картинку свою надо подсовывать)
Всё хорошо, и PyGame, и SDL. И содержание статьи, да.
Но почему бы не отдавать статью на прочтение хотя бы двум-трём знакомым перед публикацией? Торопиться же некуда.
Кнопку «Дополнить» вижу.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.