Программирование. Питон.
Лекция 9. Pygame
Pygame – это фреймворк, разработанный специально для создания игр на Питоне, позволяющий работать с двумерной и трехмерной графикой, подключать графические и физические библиотеки.
Базовое приложение
import pygame
from pygame. locals import *
pygame. init() #иницилизация
window = pygame. display. set_mode((550, 480)) #размеры
pygame. display. set_caption('My own world') #заголовок
running = True; #обработка событий
while running:
for event in pygame. event. get(): #для каждого события
if event. type == pygame. QUIT: #нажатие кнопки ‘х’ окна
running = False #выйти из цикла обработки событий
if event. type == KEYDOWN: #нажатие клавиши
if event. key == K_ESCAPE: #ESC
running = False #выйти из цикла обработки событий
pygame. quit() #выход
Буферизация
Отрисовка объектов производится на «поверхность», surface.
Поверхность окна – pygame.display.get_surface()
Однако при отрисовке изменения появятся не сразу, так как Pygame поддерживает буферизацию вывода. Т. е. когда Вы отрисовываете что-то на поверхность окна – отрисовка происходит в задний буфер. Окно обновляется из буфера по специальной команде: pygame. display. flip()
Графические примитивы
surface = pygame. display. get_surface()
pygame. draw. line(surface,(10,100,100),(10,200),(20,300),20)
pygame. display. flip()
Методы:
pygame. draw. rect(Surface, color, Rect, width=0)
pygame. draw. polygon(Surface, color, pointlist, width=0)
pygame. draw. circle(Surface, color, pos, radius, width=0)
pygame. draw. ellipse(Surface, color, Rect, width=0)
pygame. draw. arc(Surface, color, Rect, start_angle, stop_angle, width=1)
pygame. draw. line(Surface, color, start_pos, end_pos, width=1)
pygame. draw. lines(Surface, color, closed, pointlist, width=1)
pygame. draw. aaline(Surface, color, startpos, endpos, blend=1)
pygame. draw. aalines(Surface, color, closed, pointlist, blend=1)
Пример
import pygame
from pygame. locals import *
pygame. init()
window = pygame. display. set_mode((550, 480))
pygame. display. set_caption('My own little world')
screen = pygame. display. get_surface()
screen. fill((250, 150, 0))
x, y = screen. get_size() # размер экрана
background = rface((x / 2, y / 2)) #поверхность размером с половину экрана
background. fill((0, 150, 0)) # заполняем цветом
screen. blit(background, (x / 4, y / 4)) # рисуем заполненную одним цветом поверхность в центре
pygame. draw. line(screen,(10,100,10),(200,300),(20,300),20)
pygame. display. flip()
running = True;
while running:
for event in pygame. event. get():
if event. type == pygame. QUIT:
running = False
if event. type == KEYDOWN:
if event. key == K_ESCAPE:
running = False
pygame. quit()
Изображения
pygame. image. load(filename)
pygame. image. save(Surface, filename)
import pygame
from pygame. locals import *
def load_img (name):
try:
image = pygame. image. load(name)
except pygame. error, message:
print "Cannot load image:", name
raise SystemExit, message
return image
pygame. init()
window = pygame. display. set_mode((550, 480))
pygame. display. set_caption('View image')
screen = pygame. display. get_surface()
image = load_img('1.gif');
image = image. convert()
screen. blit(image, (0, 0))
pygame. display. flip()
running = True;
while running:
for event in pygame. event. get():
if event. type == pygame. QUIT:
running = False
if event. type == KEYDOWN:
if event. key == K_ESCAPE:
running = False
pygame. quit()
Звук
http://www. pygame. org/docs/ref/mixer. html
http://www. pygame. org/docs/ref/music. html
Возможно задание 1 потокового аудио (через pygame. mixer. music ) и множества отдельных звуковых каналов с предварительной загрузкой (через pygame. mixer. sound и pygame. mixer. channel).
Пример с фоновым звуком и звуком на событие (нажатие r)
import pygame
from pygame. locals import *
pygame. init()
window = pygame. display. set_mode((550, 480))
pygame. display. set_caption('My own little world')
window. fill((0,0,0), (0,0,10,10))
pygame. display. flip()
pygame. mixer. music. load('1.mp3')
pygame. mixer. music. play(-1) #цикличное воспроизведение
pygame. mixer. music. set_volume(0.1)
#music = pygame. mixer. Sound('music. ogg') #альтернативный вариант без стриминга
#music_channel = music. play(-1) #цикличное воспроизведение
#music_channel. set_volume(0.1)
sound = pygame. mixer. Sound('step. ogg')
running = True;
while running:
for event in pygame. event. get():
if event. type == pygame. QUIT:
running = False
if event. type == KEYDOWN:
if event. key == K_ESCAPE:
running = False
if event. key == K_m:
pygame. mixer. music. pause()
if event. key == K_l:
pygame. mixer. music. unpause()
if event. key == K_r:
sound. play()
pygame. quit()


