13
Конспект. Знакомство с библиотекой Pygame. Спрайты. Учитель информатики Батракова Л.В. 1 В любой игре есть анимация, поэтому важно понять, как реализуется движение объектов игры. На этом уроке мы рассмотрим классы: Surface, Rect, Sprite и Group и некоторые их методы. Узнаем, как загрузить изображение для создания фона или игрового объекта (спрайта). Это позволит нам приблизиться к созданию полноценной игры. Класс Surface и метод blit() В pygame поверхности создаются не только вызовом функции display.set_mode(), но и другими методами. Например, с помощью класса pygame.Surface можно создавать дополнительные поверхности. Это связано с тем, что поверхности играют важную роль, так как в конечном итоге именно они отображаются на экране. Кроме того, они позволяют группировать объекты. Их можно сравнить со слоями в анимации. При создании экземпляра Surface непосредственно от класса необходимо указать ширину и высоту, подобно тому, как это происходит при вызове set_mode(). Например: surf = pygame.Surface((150, 150)) Чтобы новая поверхность появилась, надо использовать метод blit().Метод blit() применяется к той поверхности, на которую "накладывается", т. е. на которой "отрисовывается" другая. Другими словами, метод blit() применяется к родительской Surface, в то время как дочерняя передается в качестве аргумента. Также в метод надо передать координаты размещения верхнего левого угла дочерней поверхности в координатной системе родительской. Например: screen.blit(surf, (50, 20)) Здесь screen основная поверхность. К ней применяется метод blit(), который на screen в ее координате 50x20 прорисовывает поверхность surf. Пример1. Метод "blit" накладывает холст "screen2" в заданную точку (200, 200): import pygame size = width, height = (600, 600) screen = pygame.display.set_mode(size) clock = pygame.time.Clock() fps = 60 screen2 = pygame.Surface((200, 200)) screen2.fill(pygame.Color('tomato')) # метод "blit" накладывает холст "screen2" в заданную точку (200, 200) screen.blit(screen2, (200, 200)) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False pygame.display.flip() clock.tick(fps) pygame.quit()

Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

  • Upload
    others

  • View
    23

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

1

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

уроке мы рассмотрим классы: Surface, Rect, Sprite и Group и некоторые их методы. Узнаем, как

загрузить изображение для создания фона или игрового объекта (спрайта). Это позволит нам приблизиться

к созданию полноценной игры.

Класс Surface и метод blit()

В pygame поверхности создаются не только вызовом функции display.set_mode(), но и другими

методами. Например, с помощью класса pygame.Surface можно создавать дополнительные

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

они отображаются на экране. Кроме того, они позволяют группировать объекты. Их можно сравнить со

слоями в анимации.

При создании экземпляра Surface непосредственно от класса необходимо указать ширину и высоту,

подобно тому, как это происходит при вызове set_mode(). Например: surf = pygame.Surface((150, 150))

Чтобы новая поверхность появилась, надо использовать метод blit().Метод blit() применяется к той

поверхности, на которую "накладывается", т. е. на которой "отрисовывается" другая. Другими словами,

метод blit() применяется к родительской Surface, в то время как дочерняя передается в качестве

аргумента. Также в метод надо передать координаты размещения верхнего левого угла дочерней

поверхности в координатной системе родительской. Например: screen.blit(surf, (50, 20))

Здесь screen – основная поверхность. К ней применяется метод blit(), который на screen в ее

координате 50x20 прорисовывает поверхность surf.

Пример1. Метод "blit" накладывает холст "screen2" в заданную точку (200, 200): import pygame

size = width, height = (600, 600)

screen =

pygame.display.set_mode(size)

clock = pygame.time.Clock()

fps = 60

screen2 = pygame.Surface((200, 200))

screen2.fill(pygame.Color('tomato'))

# метод "blit" накладывает холст

"screen2" в заданную точку (200,

200)

screen.blit(screen2, (200, 200))

running = True

while running:

for event in pygame.event.get():

if event.type ==

pygame.QUIT:

running = False

pygame.display.flip()

clock.tick(fps)

pygame.quit()

Page 2: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

2

Поверхности можно делать прозрачными с помощью их метода set_alpha(). Аргумент меняется от 0

(полная прозрачность) до 255 (полная непрозрачность).

Пример 2. На основной поверхности рисуется зеленый прямоугольник, а сверху накладывается

поверхность с белым квадратом с прозрачностью (200). import pygame

pygame.init()

sc = pygame.display.set_mode((300, 200))

surf = pygame.Surface((200, 150))

surf.fill((255, 255, 255))

surf.set_alpha(200)

sc.blit(surf, (50, 25))

# сначала на главной поверхности рисуется

зеленый прямоуг.

pygame.draw.rect(sc, (0, 255, 0), (0, 80,

300, 40))

# затем другая поверхность,

# она будет поверх прямоугольника

sc.blit(surf, (50, 25))

pygame.display.update()

while 1:

for i in pygame.event.get():

if i.type == pygame.QUIT:

exit()

pygame.time.delay(100)

Если бы на surf располагались графические объекты, то они также стали бы полупрозрачными.

Кроме blit() и set_alpha() у поверхностей есть множество других методов. Некоторые из них будут

упомянуты позже.

Если не принимать во внимание функции модуля pygame.draw, то все, что рисуется на поверхностях,

делается с помощью метода blit().

Чтобы проиллюстрировать, что поверхности – это своего рода слои, запрограммируем анимацию одной

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

не оконной.

Пример 3. Анимация красной поверхности на фоне зеленой поверхности. sc = pygame.display.set_mode((400, 400))

background = pygame.Surface((400, 200))

background.fill((0, 255, 0))

xb = 0

yb = 100

hero = pygame.Surface((100, 100))

hero.fill((255, 0, 0))

x = 0

y = 50

# порядок прорисовки важен!

background.blit(hero, (x, y))

sc.blit(background, (xb, yb))

pygame.display.update()

while 1:

for i in pygame.event.get():

if i.type == pygame.QUIT:

exit()

elif i.type == pygame.MOUSEBUTTONUP:

yb = randint(0, 200)

Page 3: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

3

if x < 400:

x += 2

else:

x = 0

sc.fill((0, 0, 0))

background.fill((0, 255, 0))

background.blit(hero, (x, y))

sc.blit(background, (xb, yb))

pygame.display.update()

pygame.time.delay(30)

Внимание!

1. Сначала hero прорисовывается на background. Потом background прорисовывается на sc.

Если сделать наоборот, т. е. две строчки кода поменять местами, то при обновлении окна красного

квадрата вы не увидите. Потому что в этом случае на sc отрисуется "старая версия" background,

когда на нем еще не было hero.

2. Также отметим последовательность прорисовок в главном цикле игры. Сначала заливаются оба фона, иначе на них останется "след" от предыдущей итерации цикла. Далее надо заново наложить

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

Класс Rect

Еще одни ключевым классом объектов в Pygame является Rect. Его экземпляры представляют собой

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

проверку их перемещения, перекрытия, объединения и др.

Pygame использует объекты Rect для хранения и манипулирования прямоугольными областями.

Rect может быть создан из комбинации значений:

cлева (left)

сверху (top)

ширины (width)

высоты (height).

Rect также могут быть созданы из объектов python, которые уже являются Rect или имеют атрибут с

именем «rect».

Например: Rect(left, top, width, height)

Rect((left, top), (width, height))

Rect(object)

МЕТОДЫ РАБОТЫ С RECT

pygame.Rect.copy Возвращает новый прямоугольник, имеющий ту же позицию и

размер, что и оригинал.

pygame.Rect.move

Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым

целочисленным значением, положительным или

отрицательным.

pygame.Rect.move_ip То же, что и метод Rect.move (), но работает на месте.

Page 4: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

4

pygame.Rect.inflate увеличивать или уменьшать размер прямоугольника

pygame.Rect.inflate_ip увеличивать или уменьшать размер прямоугольника, на месте

pygame.Rect.clamp перемещает прямоугольник внутри другого

pygame.Rect.clamp_ip перемещает прямоугольник внутри другого, на месте

pygame.Rect.clip обрезает прямоугольник внутри другого

pygame.Rect.union соединяет два прямоугольника в один

pygame.Rect.union_ip соединяет два прямоугольника в один, на месте

pygame.Rect.unionall объединение многих прямоугольников

pygame.Rect.unionall_ip объединение многих прямоугольников, на месте

pygame.Rect.fit изменить размер и переместить прямоугольник, учитывая

соотношение сторон

pygame.Rect.normalize корректировать отрицательные размеры

pygame.Rect.contains проверить, находится ли один прямоугольник внутри другого

pygame.Rect.collidepoint проверить, находится ли точка внутри прямоугольника

pygame.Rect.colliderect тест, пересекаются ли два прямоугольника

pygame.Rect.collidelist проверить, пересекается ли хоть один прямоугольник в списке

pygame.Rect.collidelistall пересекаются ли все прямоугольники в списке

pygame.Rect.collidedict проверить, если один прямоугольник в словаре пересекается

pygame.Rect.collidedictall пересекаются ли все прямоугольники в словаре

Rect'ы можно передавать в функцию pygame.display.update(). В этом случае будут обновляться

только соответствующие им области.

Пример 4. Размещение желтой поверхности на зеленой, а белой – на желтой. В обоих случаях – в

координатах (70, 20). Однако в каждом случае точка берется относительно своей родительской

поверхности.

Page 5: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

5

import pygame

pygame.init()

sc = pygame.display.set_mode((300, 300))

sc.fill((200, 255, 200))

surf1 = pygame.Surface((200, 200))

surf1.fill((220, 200, 0)) # желтая

surf2 = pygame.Surface((100, 100))

surf2.fill((255, 255, 255)) # белая

rect = pygame.Rect((70, 20, 0, 0))

surf1.blit(surf2, rect)

sc.blit(surf1, rect)

pygame.display.update()

while 1:

for i in pygame.event.get():

if i.type == pygame.QUIT:

exit()

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

поверхности отобразились соответственно своим собственным размерам. Это значит, что поверхности не

располагаются внутри rect'ов. Они к ним никакого отношения не имеют. Из прямоугольников blit()

взял только координаты.

Экземпляры Rect предназначены для хранения не только координат, но и размеров поверхностей.

Размеры в основном нужны для проверки коллизий. В большинстве случаев сначала создается поверхность.

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

она. Все дальнейшее "взаимодействие" поверхности с другими объектами (размещение, проверка

столкновений и вхождений) происходит через "связанный" с ней Rect.

Пример 5: Движение поверхности. import pygame

pygame.init()

sc = pygame.display.set_mode((300, 300))

sc.fill((200, 255, 200))

surf2 = pygame.Surface((100, 100))

surf2.fill((255, 255, 255)) # белая

rect = surf2.get_rect() # создается Rect

print(surf2.get_width()) # вывод 100

print(rect.width) # 100

print(rect.x, rect.y) # 0 0

sc.blit(surf2, rect)

pygame.display.update()

while 1:

for i in pygame.event.get():

if i.type == pygame.QUIT:

exit()

rect.x += 1

sc.fill((200, 255, 200))

sc.blit(surf2, rect)

pygame.display.update()

pygame.time.delay(20)

Page 6: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

6

Метод поверхности get_rect() возвращает экземпляр Rect, ширина и высота которого совпадают с

размерами поверхности. В примере метод get_width() возвращает ширину поверхности, также

выводится ширина прямоугольника (rect.width), чтобы показать, что они равны.

Если в get_rect() не передавать аргументы, то верхний левый угол экземпляра Rect будет в точке (0, 0).

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

метод blit(). В результате поверхность будет двигаться.

Вывод. Нам не нужно вводить множество переменных для хранения координат и размеров. Для каждой

поверхности заводится свой rect, который хранит в себе множество свойств и включает ряд

полезных методов.

Загрузка и сохранение изображений в Pygame

Функция load() модуля pygame.image загружает изображение и создает экземпляр Surface, на

котором отображено это изображение. В load() передается имя файла. "Родным" форматом является BMP,

однако если функция pygame.image.get_extended() возвращает истину, то можно загружать ряд

других форматов: PNG, GIF, JPG и др.

Формат оператора: pygame.image.load("name.jpg")

Загрузка картинки не означает её отображение. Для того, чтобы можно было использовать эту картинку

позднее, нужно задать значение переменной равное тому, что вернёт команда load(). В этом случае,

будет создана новая переменная, например, background_image:

background_image = pygame.image.load("name.jpg")

Изображение нужно конвертировать в формат, с которым Pygame сможет легко работать. Для этого, мы

добавляем .convert() в конце команды для вызова соответствующей функции. Все картинки должны

быть загружены используя этот шаблон, меняя лишь имя переменной и имя файла:

background_image=pygame.image.load("name.jpg").convert()

Загрузка изображения должна быть произведена до основного игрового цикла. Хотя вполне возможно

загрузить картинку во время главного игрового цикла, это заставит программу загружать картинку с диска

Page 7: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

7

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

программы.

Для отображения картинки, программа использует команду blit(). Это “переносит” биты на экран.

После вызова команды blit, ей передаётся переменная, содержащая картинку, а также значения или

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

вызвана внутри цикла, чтобы картинка перерисовывалась в каждом кадре: screen.blit(background_image, [0,0])

Этот код переносит картинку, сохранённую в background_image на экран в координатах (0,0).

Пример 6. Установка фонового изображения

В этом примере загруженная картинка связана с переменной screen2. Для отображения картинки

используется оператор: screen.blit(screen2, (200, 200)),

который отображает картинку на основной поверхности screen и передает координаты верхнего левого

угла картинки (200, 200). Так как размер поверхности screen задан (600, 600), то картинка

будет расположена по центру экрана.

При загрузке файла с изображением используется конструкция try - except для обработки

исключений. Исключения необходимы для того, чтобы сообщать программисту об ошибках.

Пример применения этой конструкции:

>>> try: ... k = 1 / 0

... except ZeroDivisionError:

... k = 0

...

>>> print(k)

0

В блоке try мы выполняем инструкцию, которая может породить исключение, а в блоке except мы

перехватываем их.

Подробнее об обработке исключений смотрите здесь.

Page 8: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

8

Классы Sprite и Group

В программировании игр спрайтом называют объект, который предстает перед пользователем в виде

анимированного изображения и в большинстве случаев предполагает взаимодействие с ним.

Другими словами, все что в игре не является фоном, а интерактивным объектом-картинкой – это спрайт.

Хотя каждый спрайт может быть уникальным, у всех есть нечто общее, что в pygame вынесено в

отдельный класс Sprite, находящийся в модуле pygame.sprite. Описание смотрите здесь.

pygame.sprite.Sprite – это простой базовый класс для видимых игровых объектов. Формат: pygame.sprite.Sprite (* groups): return Sprite

В модуле pygame.sprite кроме класса Sprite есть класс Group и родственные ему, которые

предназначены для объединения спрайтов в группы. Это позволяет вызывать один метод группы, который, например, обновит состояние всех спрайтов, входящих в эту группу.

Почти все предопределенные методы класса pygame.sprite.Sprite касаются:

добавления экземпляра в группу

удаления из нее

проверки вхождения.

Методы класса pygame.sprite.Sprite

Sprite.update метод управления поведением спрайта

Sprite.add добавить спрайт в группы

Sprite.remove удалить спрайт из групп

Sprite.kill удалить спрайт из всех групп

Sprite.alive принадлежит ли спрайт каким-либо группам

Sprite.groups список групп, содержащих этот спрайт

Только метод update() затрагивает поведение самого спрайта, этот метод следует переопределить в

производном от Sprite классе.

Рассмотрим, как это работает на примере программ с кирпичиками.

Пример 7. Построение стенки из кирпичиков, которые объединены в группу спрайтов.

import pygame

size = width, height = (600, 600)

screen = pygame.display.set_mode(size)

clock = pygame.time.Clock()

fps = 60

def load_image(name):

try:

image = pygame.image.load(name).convert()

except:

print('Cannot load image:', name)

raise SystemExit()

return image

image = load_image('brick.jpg')

# каждый спрайт должен относиться к какой-нибудь группе спрайтов

# ниже создаётся группа "all_sprites"

all_sprites = pygame.sprite.Group()

# место расположения первого кирпичика

Page 9: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

9

x, y = 100, 100

# для вывода картинки кирпичика с любым размером

# нужно получить размеры этой картинки так:

# width, height = image.get_rect().width, image.get_rect().height

for i in range(10):

for j in range(10):

# создаём объект кирпичика, который будет спрайтом

brick = pygame.sprite.Sprite()

# задаём для объекта внешний вид - загружаем его картинку

brick.image = image

# получаем характеристику размеров изображения

# с помощью метода "get_rect()"

brick.rect = brick.image.get_rect()

# добавляем созданный кирпичек к общей группе спрайтов

all_sprites.add(brick)

# задаём координаты верхнего левого угла изображения-спрайта

brick.rect.x = x

brick.rect.y = y

# каждый кирпичек у нас размером 40 * 20 пикселей

# всего 10 кирпичиков

x = x + 40

y = y + 20

x = x - 10 * 40

running = True

while running:

for event in pygame.event.get():

if event.type == pygame.QUIT:

running = False

# обязательный метод для отрисовки всех спрайтов нашей группы "all_sprites"

all_sprites.draw(screen)

pygame.display.flip()

clock.tick(fps)

pygame.quit()

В программе создаётся объект кирпичика, который будет спрайтом:

brick = pygame.sprite.Sprite()

Все кирпичики будут объединены в группу "all_sprites", которая была создана при помощи

оператора:

Page 10: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

10

all_sprites = pygame.sprite.Group()

Все кирпичики обладают одинаковыми свойствами – видом (изображением 'brick.jpg') и размерами

(40 20). Из этих кирпичиков в цикле создается стена размером (10 10).

С каждым кирпичиком в цикле связывается его изображение brick.image = image и определяется

местоположение brick.rect = brick.image.get_rect().Добавление кирпичика в группу

осуществляется методом «add»: all_sprites.add(brick).

Для отрисовки всех спрайтов группы в игровом цикле обязательно надо воспользоваться методом: all_sprites.draw(screen)

Пример 8. Дрожание кирпичиков. import pygame

import random

size = width, height = (600, 600)

screen = pygame.display.set_mode(size)

clock = pygame.time.Clock()

fps = 60

def load_image(name):

try:

image = pygame.image.load(name).convert()

except:

print('Cannot load image:', name)

raise SystemExit()

return image

# функция для задания дрожания кирпичиков

def update(sprite):

# кирпичики будут дрожать благодаря интересному заданию перемещения

# с помощью метода "move()"

sprite.rect = sprite.rect.move(random.randrange(3) - 1,

random.randrange(3) - 1)

image = load_image('brick.jpg')

all_sprites = pygame.sprite.Group()

# начальная отрисовка кирпичиков (строки 30-42)

x, y = 100, 100

for i in range(10):

for j in range(10):

brick = pygame.sprite.Sprite()

brick.image = image

brick.rect = brick.image.get_rect()

all_sprites.add(brick)

brick.rect.x = x

brick.rect.y = y

x = x + 40

y = y + 20

x = x - 10 * 40

running = True

while running:

for event in pygame.event.get():

if event.type == pygame.QUIT:

running = False

screen.fill((0, 0, 0))

# для всех кирпичиков задаётся их дрожание

for sprite in all_sprites:

update(sprite)

all_sprites.draw(screen)

pygame.display.flip()

clock.tick(fps)

pygame.quit()

Page 11: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

11

В этой программе в игровом цикле перерисовываются кирпичики со смещением, которое определяется

функцией update(sprite.Смещение генерируется методом move:

sprite.rect = sprite.rect.move(random.randrange(3) - 1,

random.randrange(3) - 1)

Пример 9. Движение машинки. import pygame

size = width, height = (600, 600)

screen = pygame.display.set_mode(size)

clock = pygame.time.Clock()

fps = 60

def load_image(name):

try:

if name[-2:] == 'jpg':

image = pygame.image.load(name).convert()

else:

image = pygame.image.load(name).convert_alpha()

except:

print('Cannot load image:', name)

raise SystemExit()

return image

def update(image, speed):

# как только машинка доедет до правого или левого края экрана,

# направление перемещения меняется на противоположное

if image.rect.x + image.rect.width > width:

speed = -speed

elif image.rect.x < 0:

speed = -speed

# а здесь задаётся само перемещение в зависимости от "speed"

image.rect.x = image.rect.x + speed

# из функции мы выводим направление перемещения, которое, возможно,

# изменилось за время её работы

return speed

image = load_image('car.png')

all_sprites = pygame.sprite.Group()

car = pygame.sprite.Sprite()

car.image = image

car.rect = car.image.get_rect()

car.rect.x = 300

car.rect.y = 300

all_sprites.add(car)

Page 12: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

12

# от переменной "v" зависит направления и скорость перемещения машинки

v = 5

running = True

while running:

for event in pygame.event.get():

if event.type == pygame.QUIT:

running = False

screen.fill((0, 0, 0))

for sprite in all_sprites:

v = update(sprite, v)

all_sprites.draw(screen)

pygame.display.flip()

clock.tick(fps)

pygame.quit()

Изображение машинки имеет формат .png, который поддерживает прозрачность (транспорантность) фона,

поэтому используется convert_alpha(), который учитывает прозрачность. Формат .jpg

прозрачность не учитывает.

Здесь так же создается группа спрайтов. Размеры машинки берутся из картинки через метод rec.

V = 5 определяет скорость перемещения машинки.

В игровом цикле функция update(image, speed)меняет направление движения машинки на

противоположное, как только машинка достигает границ окна.

Преобразование поверхностей PyGame имеет множество функций, которые могут вращать, масштабировать и выполнять другие

причудливые преобразования. Они сгруппированы в модуле pygame.transform.

Например:

pygame.transform.flip (Surface, xbool, ybool) поворот по вертикали и горизонтали

pygame.transform.scale (Surface, (width, height), DestSurface = None)

изменить размер до нового разрешения

pygame.transform.rotate (Поверхность, угол) повернуть изображение на заданный угол

Задания для самостоятельного выполнения

1. Напишите программу, отображающую бананы на холсте. Количество отображаемых бананов

выберите самостоятельно на промежутке [10;100], места расположения бананов выбираются

программой случайно. Изображение банана находится в папке «Учебные материалы» на GooglDiske

и называется «banana_full.png».

Для генерации заданного количества бананов n можно воспользоваться циклом «for»: for i in range(n):

Page 13: Конспект. Знакомство с библиотекой Pygame. Спрайты ... · Конспект. Знакомство с библиотекой Pygame.Спрайты

Конспект. Знакомство с библиотекой Pygame. Спрайты.

Учитель информатики Батракова Л.В.

13

2. Доработайте первую задачу и напишите программу, в которой созревшие полураскрытые бананы

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

Изображение полураскрытого банана находится в папке «Учебные материалы» на GooglDiske и

называется «banana_ready.png».

Для задания дрожания и движения вниз необходимо воспользоваться методом «move()»

аналогично материалу занятия (Пример 8). Для задания заметного дрожания (движения влево-

вправо) можно воспользоваться генерацией произвольного целого числа на заданном промежутке

для координаты «x», например, на промежутке [-5;5]: random.randint(-5, 5). Не забудьте,

что в данной задаче для координаты «y» задаётся постоянное перемещение вниз, например, с

помощью задания числа «1».

3. Очень часто неприятное событие проигрыша сопровождается соответствующей заставкой с

надписью «GAMEOVER», например, выезжающей по диагонали с левой верхней части экрана. Вам

предстоит повторить такую заставку, написав программу, в которой готовое изображение

«gameover.png» выезжает горизонтально с левой части холста и движется до тех пор, пока не

остановится точно по центру, достигнув его правый край. Чтобы всё выглядело точно, задайте

соответствующий изображению размер холста 1075 * 605 пикселей. Изображение для данной

задачи находится в папке «Учебные материалы» на GooglDiske и называется «gameover.png».

4. Доработайте программу «Пример 9», чтобы изображение машинки менялось на противоположное при изменении направления.

Внимание!

Все программы надо сохранить на GooglDiske или присылать по электронному журналу или по

почте [email protected]

За выполненные задания вы получаете

Желаю удачи!!! Используемые материалы:

https://younglinux.info/pygame/rect https://waksoft.susu.ru/2019/04/24/pygame-shpargalka-dlja-ispolzovanija/

https://www.pygame.org/docs/ref/sprite.html

http://pygametutorials.wikidot.com/book-transform https://pythonru.com/uroki/biblioteka-pygame-chast-2-rabota-so-sprajtami

http://programarcadegames.com/index.php?chapter=bitmapped_graphics_and_sound&lang=ru#section_11

https://pythontutor.ru/