5.89M
Category: programmingprogramming

Разработка игрового цикла

1.

Разработка игрового цикла
Игровой цикл — это цикл, на каждом шаге («кадре»)
которого происходит:
спрайт
Игровое пространство разработчики называют сценой, а
один шаг игрового цикла — кадром.
Обсуждение
рабочих задач
➔ анализ и обработка событий;
➔ отрисовка фона и персонажей;
➔ отсчёт времени.

2.

Создание игр
Изучим внешний вид игры «Догонялки».
«Мозговой
штурм»
Что нужно знать, чтобы запрограммировать подобную игру?

3.

Игра «Догонялки»
Обсудим наполнение игры с помощью mind map:
Фон сцены — картинка
Игровая сцена
(внешний вид)
Спрайты — картинки
Высокая частота кадров/сек
Игра «Догонялки»
Спрайты управляются с
клавиатуры
Функционал
игры
У каждого спрайта
своё управление
Спрайт не может
пересечь границу сцены
«Мозговой
штурм»
(плавное перемещение спрайтов)

4.

pygame —
это библиотека для создания игр
Библиотека pygame имеет иерархическую структуру.
В ней имеется много модулей с готовыми инструментами для:
Модуль pygame.transform
Функции для
трансформации
поверхности
(н-р, фон под размеры окна)
«Мозговой
штурм»
➔ создания спрайтов;
➔ обработки внутриигровых событий спрайтов;
➔ обработки событий внешнего мира;
➔ настройки игровых таймеров
и др.
Модуль pygame.event
События внешнего мира
(методы и необходимые
константы)
...

5.

pygame —
это библиотека для создания игр
Библиотека pygame имеет иерархическую структуру.
В ней есть много модулей с готовыми инструментами для:
Команда
from pygame import *
Назначение
Подключение всех возможностей
библиотеки PyGame
«Мозговой
штурм»
➔ создания спрайтов;
➔ обработки внутриигровых событий спрайтов;
➔ обработки событий внешнего мира;
➔ настройки игровых таймеров
и др.

6.

1. Создание заготовки с фоном
Запрограммируем заготовку для игры с фоном-картинкой.
Примечание. Картинка должна лежать в папке проекта.
«Мозговой
штурм»
Что нужно знать, чтобы
создать такую сцену?

7.

1. Создание заготовки с фоном
В Pygame точка начала отсчёта располагается в левом верхнем углу окна.
Размер окна определяет разработчик.
«Мозговой
штурм»
(0, 0)

8.

1. Создание заготовки с фоном
Запрограммируем заготовку для игры с фоном-картинкой.
Примечание. Картинка должна лежать в папке проекта.
Назначение
window = display.set_mode((700, 500))
Создать окно размера:
(ширина, длина).
display.set_caption("Догонялки")
Установить название окна.
background =
transform.scale(
image.load("background.png"),
Создать объект-картинку,
адаптировать размер картинки
под параметры окна.
(700, 500)
)
window.blit(background,(0, 0))
Отобразить фон-картинку в окне.
«Мозговой
штурм»
Команда

9.

1. Создание заготовки с фоном
Запрограммируем заготовку для игры с фоном-картинкой.
from pygame import *
window = display.set_mode((700, 500))
display.set_caption("Догонялки")
background = transform.scale(image.load("background.png"), (700, 500))
Если создать и запустить такую программу, то она
запустится и сразу завершит работу! Почему?
«Мозговой
штурм»
window.blit(background,(0, 0))

10.

1. Создание заготовки с фоном
Запрограммируем заготовку для игры с фоном-картинкой.
from pygame import *
window = display.set_mode((700, 500))
display.set_caption("Догонялки")
background = transform.scale(image.load("background.png"), (700, 500))
В программе отсутствует игровой цикл!
Окно отображается на миг и тут же скрывается.
Что нужно добавить, чтобы окно отображалось
постоянно?
«Мозговой
штурм»
window.blit(background,(0, 0))

11.

1. Создание заготовки с фоном
Простейший игровой цикл, отображающий окно, пока оно не закрыто.
game = True — игра идёт
Игра
продолжается?
Нет
Да
Нет
Нажата кнопка
«Закрыть окно»?
Да
game = False
— завершить игру
«Мозговой
штурм»
Отобразить окно с фоном

12.

1. Создание заготовки с фоном
Новые методы, связанные с условием завершения игры.
Назначение
events = event.get()
Возвращает список произошедших событий
(события — экземпляры готового класса Event).
events[0].type
Каждый объект event имеет свойство type —
тип события (например, «клавиша опущена»).
Примеры type:
QUIT — нажата кнопка «Закрыть окно» (красный крестик).
KEYDOWN — какая-либо клавиша опущена.
Программные
названия
клавиш:
K_LEFT — нажата кнопка «Стрелка влево».
K_a — нажата кнопка «Буква А» (латиница).
«Мозговой
штурм»
Команда

13.

1. Создание заготовки с фоном
Запрограммируем заготовку для игры с фоном-картинкой.
from pygame import *
window = display.set_mode((700, 500))
display.set_caption("Догонялки")
background = transform.scale(image.load("background.png"), (700, 500))
game = True
window.blit(background,(0, 0))
for e in event.get():
if e.type == QUIT:
game = False
display.update()
Кадры, возникающие на экране с каждым шагом
цикла, нужно обновлять.
«Мозговой
штурм»
while game:

14.

2. Создание и размещение спрайтов
Объекты для спрайтов-картинок создаются аналогично фону.
Команда
sprite1 = transform.scale(
image.load('sprite1.png'),
Назначение
Создать объект-картинку и вписать её в
квадрат 100х100.
(100, 100)
)
Разместить спрайт в окне в точке (x1, y1).
Как дополнить имеющуюся программу спрайтами?
«Мозговой
штурм»
window.blit(sprite1, (x1, y1))

15.

Объединяем фрагменты в программу
Получим игру с пока неактивными спрайтами.
Подключение модулей Pygame
Создание объектов для фона и спрайтов
Переменная game = True (игра началась)
Размещение спрайтов на сцене
Завершение игры, если нажата кнопка
«Закрыть окно»
Обновление сцены
(следующий кадр игрового цикла)
«Мозговой
штурм»
Игровой цикл:

16.

FPS (frames per seconds) —
это количество кадров, отображаемых за одну секунду.
«Мозговой
штурм»
Комфортная частота кадров для кино — 24, для игр — 50–60.
Частота 5 кадров/сек
Частота 60 кадров/сек

17.

1. Настройка частоты кадров
Создадим специальный объект Clock() и передадим желаемую частоту.
clock = time.Clock()
FPS = 60
clock.tick(FPS)
Разместим в игровом цикле.
Назначение
Создать объект-«часы», отслеживающий
время.
Сразу создадим константу FPS и
установим желаемую частоту кадров.
В каждом кадре секунда будет
разделена на 60. Будет выполнена
задержка на 1/60 секунды.
«Мозговой
штурм»
Команда

18.

2. Обработка событий клавиатуры
Зададим управление sprite1 с помощью клавиш со стрелками.
Как обработать событие «нажата клавиша
“Стрелка вверх”»?
Не получится ли условный оператор с перебором
всех клавиш управления слишком большим?
«Мозговой
штурм»
Пусть нажатие на клавишу перемещает спрайт на 10 пикселей.

19.

2. События клавиатуры
Рассмотрим функции, упрощающие обработку событий клавиатуры.
keys_pressed = key.get_pressed()
if keys_pressed[K_UP]:
y1 -= 10
if keys_pressed[K_s] and y2 < 395:
y2 += 10
Назначение
Возвращает структуру с текущими
состояниями клавиш (True —
опущена, False — поднята).
Если клавиша «Стрелка вверх»
опущена, то уменьшить
координату Y Sprite1 на 10
пикселей.
Если клавиша «S» опущена и
нижняя часть экрана не
достигнута, то увеличить
координату Y Sprite2 на 10
пикселей.
«Мозговой
штурм»
Команда

20.

2. События клавиатуры
Игровой цикл после добавления обработки событий клавиатуры:
while game:
#...
keys_pressed = key.get_pressed()
x1 -= speed
if keys_pressed[K_RIGHT] and x1 < 595:
x1 += speed
if keys_pressed[K_UP] and y1 > 5:
y1 -= speed
if keys_pressed[K_DOWN] and y1 < 395:
y1 += speed
#...
Каждый раз нужно
проверять, не вышел ли
спрайт за рамки сцены.
«Мозговой
штурм»
if keys_pressed[K_LEFT] and x1 > 5:
English     Русский Rules