467.88K
Категория: ПрограммированиеПрограммирование

Разработка компьютерных игр на языке Python

1.

2.

Разработка компьютерных
игр на языке Python
Модуль 3. Введение в ООП

3.

Тема 3.3. Классы Surface, Rect.
Модуль pygame.font,
pygame.image и
pygame.transform

4.

Тема 3.4. Классы Sprite и
Group. Класс Sound. Варианты
и способы использования в
логике игр

5.

МОДУЛЬ PYGAME.FONT
Классы Font и SysFont находятся в модуле pygame.font и предназначены
для работы со шрифтами и текстом. Чтобы создавать от этих классов
объекты, модуль pygame.font необходимо предварительно
инициализировать командой pygame.font.init()
От классов pygame.font.Font и pygame.font.SysFont создаются объектышрифты. Второй класс берет системные шрифты, поэтому конструктору
достаточно передать имя шрифта. Конструктору Font надо передавать
имя файла шрифта.

6.

Например:
pygame.font.SysFont('arial', 36)
pygame.font.Font('/адрес/Arial.ttf', 36)
Узнать, какие шрифты есть в системе, можно
с помощью функции get_fonts():
>>> pygame.font.get_fonts()
['cmmi10', 'umeminchos3', 'kacstbook' ...
Узнать адрес конкретного
шрифта:
>>> pygame.font.match_font('verdana')
'/usr/share/fonts/.../Verdana.ttf'
Вы можете скопировать шрифт в каталог
программы и обращаться к нему без адреса:
pygame.font.Font('Verdana.ttf', 24)
Чтобы использовать шрифт по умолчанию:
pygame.font.Font(None, 24)
От обоих классов (Font и SysFont) создаются объекты типа Font.
Метод render() экземпляра Font создает поверхность (экземпляр Surface), на которой "написан"
переданный в качестве аргумента текст, шрифтом, к которому применяется метод. Вторым аргументом
указывается сглаживание, третьим – цвет текста. При необходимости четвертым аргументом можно
указать цвет фона.

7.

МОДУЛЬ PYGAME.IMAGE
Функция load() модуля pygame.image загружает изображение и создает
экземпляр Surface, на котором отображено это изображение. В load()
передается имя файла. "Родным" форматом является BMP, однако если
функция pygame.image.get_extended() возвращает истину, то можно
загружать ряд других форматов: PNG, GIF, JPG и др.

8.

Загрузка и сохранение изображений в Pygame
import pygame as pg
import sys
W = 400
H = 300
sc = pg.display.set_mode((W, H))
sc.fill((100, 150, 200))
dog_surf = pg.image.load('dog.bmp')
dog_rect = dog_surf.get_rect(bottomright=(W, H))
sc.blit(dog_surf, dog_rect)
pg.display.update()
while 1:
for i in pg.event.get():
if i.type == pg.QUIT:
sys.exit()
pg.time.delay(20)

9.

Метод convert()
Ко всем экземплярам Surface
рекомендуется применять метод
convert(), который, если не
передавать аргументы, переводит
формат кодирования пикселей
поверхности в формат кодирования
пикселей главной поверхности. При
выполнении игры это ускоряет
прорисовку поверхностей.
Таким образом, код загрузки и обработки
изображений разных форматов должен выглядеть
примерно так:
dog_surf = pg.image.load('dog.bmp').convert()
# если загружнное изображение имеет альфа-канал
sun_surf = pg.image.load('sun.png').convert_alpha()
Что по смыслу равносильно:
dog_surf = pg.image.load('dog.bmp')
dog_surf = dog_surf.convert()
Метод convert() возвращает новую,
конвертированную, поверхность. Он не
изменяет ту, к которой применяется.

10.

Функция save()
В модуле pygame.image есть функция save(), которая
позволяет сохранять переданную ей поверхность (не
обязательно главную) в формат BMP, TGA, PNG, JPEG.
Пример:
while 1:
for i in pygame.event.get():
if i.type == pygame.QUIT:
sys.exit()
elif i.type == pygame.KEYUP \
and i.key == pygame.K_s:
pygame.image.save(sc, 'day.png')
pygame.time.delay(20)

11.

МОДУЛЬ PYGAME.TRANSFORM
Модуль pygame.transform содержит функции для изменения поверхностей.
Некоторые трансформации (например, изменение размера) приводят к
ухудшению изображения из-за потери части пикселей. В таких случаях
надо сохранять исходную поверхность и выполнять трансформации от
нее.
Функции модуля transform, которые изменяют поверхности, возвращают
новые. Первым аргументом им передается исходный Surface. Ниже
приведены примеры использования наиболее востребованных функций.

12.

Функция flip() переворачивает Surface по горизонтали и вертикали
import pygame
import sys
sc = pygame.display.set_mode((400, 300))
sc.fill((100, 150, 200))
dog_surf = pygame.image.load('dog.bmp').convert()
dog_surf.set_colorkey((255, 255, 255))
dog_rect = dog_surf.get_rect(center=(200, 150))
sc.blit(dog_surf, dog_rect)
pygame.display.update()
while 1:
for i in pygame.event.get():
if i.type == pygame.QUIT:
sys.exit()
# При отжатии (нажать и отпустить) клавиши f
elif i.type == pygame.KEYUP and i.key == pygame.K_f:
# собака перевернется слева направо
flip = pygame.transform.flip(dog_surf, True, False)
sc.fill((100, 150, 200))
sc.blit(flip, dog_rect)
pygame.display.update(dog_rect)
pygame.time.delay(20)

13.

Поворот и изменение размера:
import pygame
import sys
sc = pygame.display.set_mode((400, 300))
sc.fill((100, 150, 200))
dog_surf = pygame.image.load('dog.bmp').convert()
dog_surf.set_colorkey((255, 255, 255))
dog_rect = dog_surf.get_rect(center=(200, 150))
sc.blit(dog_surf, dog_rect)
pygame.display.update()
# ждем 1 секунду перед изменением
pygame.time.wait(1000)
sc.fill((100, 150, 200))
# уменьшаем в два раза
scale = pygame.transform.scale(
dog_surf, (dog_surf.get_width() // 2,
dog_surf.get_height() // 2))
scale_rect = scale.get_rect(center=(200, 150))
sc.blit(scale, scale_rect)
pygame.display.update(dog_rect)
pygame.time.wait(1000)
sc.fill((100, 150, 200))
# поворачиваем на 45 градусов
rot = pygame.transform.rotate(dog_surf, 45)
rot_rect = rot.get_rect(center=(200, 150))
sc.blit(rot, rot_rect)
pygame.display.update()
while 1:
for i in pygame.event.get():
if i.type == pygame.QUIT:
sys.exit()
pygame.time.delay(20)

14.

Практические
задания
Рассмотрим пример кода работы
программы с выводом текста на
экран
import pygame
import sys
pygame.font.init()
sc = pygame.display.set_mode((300, 200))
sc.fill((255, 255, 255))
f1 = pygame.font.Font(None, 36)
text1 = f1.render('Hello Привет', True,
(180, 0, 0))
f2 = pygame.font.SysFont('serif', 48)
text2 = f2.render("World Мир", False,
(0, 180, 0))
sc.blit(text1, (10, 50))
sc.blit(text2, (10, 100))
pygame.display.update()
while 1:
for i in pygame.event.get():
if i.type == pygame.QUIT:
sys.exit()

15.

Практические
задания
Рассмотрим такой пример где
текст перемещается по нажатию
стрелок на клавиатуре:
import pygame as pg
import sys
pg.init()
sc = pg.display.set_mode((400, 300))
sc.fill((200, 255, 200))
font = pg.font.Font(None, 72)
text = font.render("Hello Wold", True, (0, 100, 0))
place = text.get_rect(center=(200, 150))
sc.blit(text, place)
pg.display.update()
while 1:
for i in pg.event.get():
if i.type == pg.QUIT:
sys.exit()
pressed = pg.key.get_pressed()
if pressed[pg.K_LEFT]:
place.x -= 1
elif pressed[pg.K_RIGHT]:
place.x += 1
sc.fill((200, 255, 200))
sc.blit(text, place)
pg.display.update()
pg.time.delay(20)

16.

Практические
задания
Пример программы, в которой
загружается
картинка
и
фон
делается прозрачным с помощью
метода set_colorkey() класса Surface.
Все
пиксели,
цвет
которых
совпадает
с
переданным
в
set_colorkey() значением, станут
прозрачными.
import pygame as pg
import sys
W = 400
H = 300
sc = pg.display.set_mode((W, H))
sc.fill((100, 150, 200))
dog_surf = pg.image.load('dog.bmp')
dog_surf.set_colorkey((255, 255, 255))
dog_rect = dog_surf.get_rect(bottomright=(W, H))
sc.blit(dog_surf, dog_rect)
pg.display.update()
while 1:
for i in pg.event.get():
if i.type == pg.QUIT:
sys.exit()
pg.time.delay(20)

17.

Практические
задания
У формата PNG с альфа-каналом
(когда для точек можно
настраивать степень
прозрачности; обычно
устанавливается полностью
прозрачный фон) таких проблем
нет:
sun_surf = pg.image.load('sun.png')
sun_rect = sun_surf.get_rect()
sc.blit(sun_surf, sun_rect)

18.

Практические
задания
Задание 1. Сделайте текст
«Доброе утро!» желтым
цветом на зеленом фоне,
чтобы он двигался снизу
вверх.

19.

Практические
задания
Задание 1. Сделайте текст
«Доброе утро!» желтым
цветом на зеленом фоне,
чтобы он двигался снизу
вверх.
import pygame
# Инициализация pygame
pygame.init()
# Установка ширины и высоты окна
WIDTH = 400
HEIGHT = 300
# Создание окна
win = pygame.display.set_mode((WIDTH, HEIGHT))
# Установка цвета фона
GREEN = (0, 255, 0)
win.fill(GREEN)
# Создание объекта шрифта
font = pygame.font.SysFont(None, 48)
# Создание надписи
text = font.render("доброе утро!", True, (255, 255, 0))
# Получение прямоугольника с размерами надписи
text_rect = text.get_rect()

20.

Практические
задания
Задание 1. Сделайте текст
«Доброе утро!» желтым
цветом на зеленом фоне,
чтобы он двигался снизу
вверх.
# Начальные координаты надписи
x = WIDTH // 2 - text_rect.width // 2
y = HEIGHT
# Основной цикл программы
running = True
while running:
# Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Обновление координаты надписи
y -= 0.1
# Проверка, если надпись вышла за пределы окна, то сбросить
ее координату внизу окна
if y + text_rect.height < 0:
y = HEIGHT
# Установка цвета фона
win.fill(GREEN)
# Отображение надписи
win.blit(text, (x, y))
# Обновление экрана
pygame.display.flip()
# Выход из программы
pygame.quit()

21.

Практические
задания
Задание 2. Измените
цвет шрифта по нажатию
клавиши
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
font = pygame.font.Font(None, 36)
text = font.render("Hello, World!", True, pygame.Color('white'))
color1 = pygame.Color('red')
color2 = pygame.Color('green')
current_color = color1
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if current_color == color1:
current_color = color2
else:
current_color = color1
text = font.render("Hello, World!", True, current_color)
screen.blit(text, (100, 100))
pygame.display.flip()
pygame.quit()

22.

Практические
задания
Задание 3. Загрузите
картинку и поверните ее
на 90 градусов, на 180.
Измените фон картинки.
import pygame
# Инициализация Pygame
pygame.init()
# Задание размеров окна
window_width, window_height = 800, 600
window = pygame.display.set_mode((window_width, window_height))
# Загрузка картинки
image = pygame.image.load("Rock.png")
# Поворот картинки на 90 градусов
rotated_image_90 = pygame.transform.rotate(image, 90)
# Поворот картинки на 180 градусов
rotated_image_180 = pygame.transform.rotate(image, 180)
# Изменение фона окна Pygame
window.fill((255, 255, 255))
# Отрисовка изображений на экране
window.blit(image, (0, 0))
window.blit(rotated_image_90, (200, 0))
window.blit(rotated_image_180, (400, 0))
# Отображение изменений
pygame.display.flip()
# Ожидание закрытия окна
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Завершение работы Pygame
pygame.quit()

23.

Практические
задания
Задание 4. Творческое
задание. Нарисуйте свой
рисунок. Добавьте
движение и
трансформацию
import pygame
import sys
def main():
pygame.init()
width = 800
height = 600
screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
x = 400
y = 300
size = 50
speed = 5
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

24.

Практические
задания
Задание 4. Творческое
задание. Нарисуйте свой
рисунок. Добавьте
движение и
трансформацию
Keys пишется на уровне for
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed
elif keys[pygame.K_RIGHT]:
x += speed
elif keys[pygame.K_UP]:
y -= speed
elif keys[pygame.K_DOWN]:
y += speed
screen.fill((0, 0, 0)) # Заливка экрана черным цветом
pygame.draw.rect(screen, (255, 0, 0), (x, y, size, size)) # Рисуем
прямоугольник
# Производим трансформацию объекта
size += 1 if size < 100 else -99
pygame.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()

25.

Практические
задания
Задание 5*. Допустим, у
вас есть такое
изображение вида сверху
машины:
Напишите программу
управления ее
движением с помощью
стрелок клавиатуры
(вверх, вниз, влево,
вправо) с учетом
поворотов.
import pygame
import math
# Инициализация Pygame
pygame.init()
# Определение размеров окна
WINDOW_WIDTH = 8000
WINDOW_HEIGHT = 6000
# Определение цветов
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# Создание окна
window = pygame.display.set_mode((WINDOW_WIDTH,
WINDOW_HEIGHT))
pygame.display.set_caption("Управление машиной")
# Загрузка изображения машины
car_image = pygame.image.load("car.png")
# Начальное положение и направление машины
car_x = WINDOW_WIDTH // 2
car_y = WINDOW_HEIGHT // 2
car_rotation_angle = 0

26.

Практические
задания
Задание 5*. Допустим, у
вас есть такое
изображение вида сверху
машины:
Напишите программу
управления ее
движением с помощью
стрелок клавиатуры
(вверх, вниз, влево,
вправо) с учетом
поворотов.
# Основной цикл программы
while True:
# Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
# Получение нажатых клавиш
keys = pygame.key.get_pressed()
# Поворот машины
if keys[pygame.K_LEFT]:
car_rotation_angle += 5
if keys[pygame.K_RIGHT]:
car_rotation_angle -= 5
# Перемещение машины вперед и назад
if keys[pygame.K_UP]:
car_x += math.cos(math.radians(car_rotation_angle)) * 2
car_y += math.sin(math.radians(car_rotation_angle)) * 2
if keys[pygame.K_DOWN]:
car_x -= math.cos(math.radians(car_rotation_angle)) * 2
car_y -= math.sin(math.radians(car_rotation_angle)) * 2
# Очистка экрана
window.fill(WHITE)
# Рисование машины
rotated_car_image = pygame.transform.rotate(car_image, car_rotation_angle)
car_rect = rotated_car_image.get_rect(center=(car_x, car_y))
window.blit(rotated_car_image, car_rect)
# Обновление экрана
pygame.display.flip()
English     Русский Правила