Как сделать стены в pygame

Обновлено: 11.05.2024

Управление слоями в pygame

Я создаю игру на pygame, основная суть которой - процедурно генерируемый 2д-мир. Отрисовка выполняется в каждой итерации основного цикла и не вызывает вопросов. Проблемы начинаются когда я пытаюсь нарисовать спрайт игрока, он просто перекрывается спрайтами мира.

В текущий момент я добавил отрисовку игрока в функцию отрисовки мира, которая осуществляется тупым созданием новых спрайтов. Это приводит к довольно быстрому увеличению потребляемой памяти. Каким образом я могу заставить один спрайт pygame отображаться поверх всех остальных, независимо от времени создания?

Для быстрого создания спрайтов я взял класс Sprite из многочисленных гайдов по pygame:

Вот код функции для отрисовки мира:

Данные о блоках в мире хранятся в виде словарей в двумерном массиве. Для удобства работы с двумерными массивами я создал класс, и методы get и put - от него.

dum - пустой класс, имитирующий спрайт. Обозначает пустоту в текущем месте массива

pla - двумерный массив, хранящий в себе игрока, все остальное заполнено пустотой

sp - двумерный массив, играет роль видеобуфера, созданного чтобы отрисовка новых спрайтов не забивала память. Хранит в себе спрайты мира.

Пишем платформер на Python, используя pygame

image


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

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

Что такое платформер?

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

Одними из моих любимых игр данного жанра являются «Super Mario Brothers» и «Super Meat Boy». Давайте попробуем создать нечто среднее между ними.

Самое — самое начало.

Внимание! Используем python ветки 2.х, с 3.х обнаружены проблемы запуска нижеописанных скриптов!

Наверное, не только игры, да и все приложения, использующие pygame начинаются примерно так:

Запустив этот код, мы увидим окно, залитое зелененьким цветом.



(Картинка кликабельна)

Ну что же, начало положено, идём дальше.

Уровень.

А как без него? Под словом «уровень» будем подразумевать ограниченную область виртуального двумерного пространства, заполненную всякой — всячиной, и по которой будет передвигаться наш персонаж.

Для построения уровня создадим двумерный массив m на n. Каждая ячейка (m,n) будет представлять из себя прямоугольник. Прямоугольник может в себе что-то содержать, а может и быть пустым. Мы в прямоугольниках будем рисовать платформы.

Добавим еще константы

Затем добавим объявление уровня в функцию main


И в основной цикл добавим следующее:


Т.е. Мы перебираем двумерный массив level, и, если находим символ «-», то по координатам (x * PLATFORM_WIDTH, y * PLATFORM_HEIGHT), где x,y — индекс в массиве level

Запустив, мы увидим следующее:


Персонаж

Просто кубики на фоне — это очень скучно. Нам нужен наш персонаж, который будет бегать и прыгать по платформам.

Создаём класс нашего героя.

Для удобства, будем держать нашего персонажа в отдельном файле player.py


Что тут интересного?
Начнём с того, что мы создаём новый класс, наследуясь от класса pygame.sprite.Sprite, тем самым наследую все характеристики спрайта.
Cпрайт — это движущееся растровое изображение. Имеет ряд полезных методов и свойств.

self.rect = Rect(x, y, WIDTH, HEIGHT), в этой строчке мы создаем фактические границы нашего персонажа, прямоугольник, по которому мы будем не только перемещать героя, но и проверять его на столкновения. Но об этом чуть ниже.

Метод update(self, left, right)) используется для описания поведения объекта. Переопределяет родительский update(*args) → None. Может вызываться в группах спрайтов.

Метод draw(self, screen) используется для вывода персонажа на экран. Далее мы уберем этот метод и будем использовать более интересный способ отображения героя.

Добавим нашего героя в основную часть программы.

Перед определением уровня добавим определение героя и переменные его перемещения.

В проверку событий добавим следующее:

Т.е. Если нажали на клавишу «лево», то идём влево. Если отпустили — останавливаемся. Так же с кнопкой «право»

Само передвижение вызывается так: (добавляем после перерисовки фона и платформ)

Но, как мы видим, наш серый блок слишком быстро перемещается, добавим ограничение в количестве кадров в секунду. Для этого после определения уровня добавим таймер

И в начало основного цикла добавим следующее:

Завис в воздухе

Да, наш герой в безвыходном положении, он завис в воздухе.
Добавим гравитации и возможности прыгать.

И так, работаем в файле player.py

Добавим еще констант

В метод _init_ добавляем строки:

Добавляем входной аргумент в метод update
def update(self, left, right, up):
И в начало метода добавляем:


И перед строчкой self.rect.x += self.xvel
Добавляем

И добавим в основную часть программы:
После строчки left = right = False
Добавим переменную up


В проверку событий добавим

И изменим вызов метода update, добавив новый аргумент up:
hero.update(left, right)
на


Здесь мы создали силу гравитации, которая будет тянуть нас вниз, постоянно наращивая скорость, если мы не стоим на земле, и прыгать в полете мы не умеем. А мы пока не можем твердо встать на что-то, поэтому на следующей анимации наш герой падает далеко за границы видимости.

Встань обеими ногами на землю свою.

Как узнать, что мы на земле или другой твердой поверхности? Ответ очевиден — использовать проверку на пересечение, но для этого изменим создание платформ.

Создадим еще один файл blocks.py, и перенесем в него описание платформы.

Дальше создадим класс, наследуясь от pygame.sprite.Sprite

Тут нет ни чего нам уже не знакомого, идём дальше.

В основной файле произведем изменения, перед описанием массива level добавим

Группа спрайтов entities будем использовать для отображения всех элементов этой группы.
Массив platforms будем использовать для проверки на пересечение с платформой.


Т.е. создаём экземплр класса Platform, добавляем его в группу спрайтов entities и массив platforms. В entities, чтобы для каждого блока не писать логику отображения. В platforms добавили, чтобы потом проверить массив блоков на пересечение с игроком.

Дальше, весь код генерации уровня выносим из цикла.


Запустив, мы увидим, что ни чего не изменилось. Верно. Ведь мы не проверяем нашего героя на столкновения. Начнём это исправлять.

Работаем в файле player.py

Удаляем метод draw, он нам больше не нужен. И добавляем новый метод collide


В этом методе происходит проверка на пересечение координат героя и платформ, если таковое имеется, то выше описанной логике происходит действие.

Ну, и для того, что бы это всё происходило, необходимо вызывать этот метод.
Изменим число аргументов для метода update, теперь он выглядит так:

И не забудьте изменить его вызов в основном файле.


Т.е. передвинули героя вертикально, проверили на пересечение по вертикали, передвинули горизонтально, снова проверили на пересечение по горизонтали.

Вот, что получится, когда запустим.

Фу[у]! Движущийся прямоугольник — не красиво!

Давайте немного приукрасим нашего МариоБоя.

Начнем с платформ. Для этого в файле blocks.py сделаем небольшие изменения.

Заменим заливку цветом на картинку, для этого строчку
self.image.fill(Color(PLATFORM_COLOR))
Заменим на


Мы загружаем картинку вместо сплошного цвета. Разумеется, файл «platform.jpg» должен находиться в папке «blocks», которая должна располагаться в каталоге с исходными кодами.

Вот, что получилось


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

Сперва добавим в блок констант.

Тут, думаю, понятно, анимация разных действий героя.

Теперь добавим следующее в метод __init__


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

Осталось в нужный момент показать нужную анимацию.

Добавим смену анимаций в метод update.

Больше, нужно больше места

Ограничение в размере окна мы преодолеем созданием динамической камеры.

Для этого создадим класс Camera

Далее, добавим начальное конфигурирование камеры

Создадим экземпляр камеры, добавим перед основным циклом:

Мы создали внутри большого прямоугольника, размеры которого вычисляются так:

меньший прямоугольник, размером, идентичным размеру окна.

Меньший прямоугольник центрируется относительно главного персонажа(метод update), и все объекты рисуются в меньшем прямоугольнике (метод apply), за счет чего создаётся впечатление движения камеры.

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


И перед ней добавим


Теперь можем изменить уровень.


Вот, собственно, и результат

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

upd pygame можно скачать отсюда, спасибо, Chris_Griffin за замечание
upd1 Вторая часть

Стены в Pygame

Я пытаюсь сделать простую игру Pac-Man в Pygame, но я не знаю, как делать стены. Как я могу проверить, попал ли игрок в стену, когда он движется? Это код main.py :

Это класс игрока в файле player.py:

А вот файл room.py, он содержит класс Wall:

2 ответа

Итак, у меня есть свой код и работает, прямо сейчас, когда игрок сталкивается со стеной, в то время как пользователь держит правую или левую руку, игрок будет медленно скользить вниз по стене, если игрок отпустит направление (влево или вправо), игрок продолжает падать нормально. Что я хочу.

import pygame, sys from pygame.locals import * pygame.init() windowwidth = 600 windowheight = 800 WALLWIDTH = 30 WALLHEIGHT = 30 PLAYERWIDTH = 20 PLAYERHEIGHT = 20 BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) LIMEGREEN = (50, 205, 50) running = True while running == True: for event.

Прежде чем переместить игрока в новое положение, вам нужно перебрать все элементы в WALLS и проверить, будет ли ограничивающий прямоугольник игрока пересекаться со стеной. pygame.Rect имеет ряд вспомогательных методов для этого ( Rect.collide* )

Если это так, то отклоните этот шаг.

Вы можете проверить наличие столкновений со стенами в move(), используя a.colliderect(b)

Что-то в этом роде

Похожие вопросы:

Мне интересно, как я буду рисовать стены, используя pygame, и мне было интересно, придется ли мне screen.blit(tile) для каждой отдельной плитки по краю, я надеюсь, что есть более простой способ. Я.

Как найти коллизии между символами и изображениями в PyGame? Я нарисовал игрока из изображения и нарисовал стены из плиток, так как же я обнаружу эти столкновения?

Эй, ребята, я пытался построить pacman с помощью pygame, у меня небольшая проблема. Когда Пакман движется, если я нажимаю клавишу, то он меняет направление, к сожалению, если выше есть стена, то.

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

import pygame, sys from pygame.locals import * pygame.init() windowwidth = 600 windowheight = 800 WALLWIDTH = 30 WALLHEIGHT = 30 PLAYERWIDTH = 20 PLAYERHEIGHT = 20 BLACK = (0, 0, 0) WHITE = (255.

У меня есть проблема с copy.deepcopy и pygame поверхностными объектами. Регулярно я использую WSL и python для выполнения python (потому что мне нужно запустить windows на моей машине, но я ненавижу.

Поэтому я пытался сделать отскок DVD на pygame и не мог заставить его удариться о стены и отскочить , но в конце концов я нашел чей-то другой метод и использовал его, но я не могу понять, почему он.

Прежде чем вы критикуете меня за то, что я не гуглил или не проводил исследования, прежде чем спросить, я провел исследование заранее, но безрезультатно. Я пытаюсь создать игру Atari Breakout. В.

Я пишу игру в понг с 1 веслом в pygame году. Мяч должен отскакивать от стены и весла. Но мяч лишь иногда отскакивает от стены. Вот код, который заставляет мяч подпрыгивать: elif ball_x == 785: dbx =.

Создание игр на Python 3 и Pygame: Часть 2

Во второй из пяти частей туториала, посвящённого созданию игр с помощью Python 3 и Pygame, мы рассмотрим класс TextObject , используемый для рендеринга текста на экране. Мы создадим основное окно, в том числе и фоновое изображение, а затем научимся отрисовывать объекты: кирпичи, мяч и ракетку.

Класс TextObject

Класс TextObject предназначен для отображения текста на экране. Можно сделать вывод, что с точки зрения дизайна он должен быть подклассом класса GameObject , потому что тоже является визуальным объектом и его тоже иногда нужно двигать. Но я не хотел вводить глубокую иерархию классов, при которой весь отображаемый Breakout текст оставался на экране неизменным.

Класс TextObject создаёт объект шрифта. Он рендерит текст на отдельную текстовую поверхность, которая затем копируется (рендерится) на основную поверхность. Интересный аспект TextObject заключается в том, что у него нет какого-то фиксированного текста. Он получает функцию text_func() , вызываемую каждый раз, когда он рендерится.

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

Создание основного окна

Игры на Pygame выполняются в окнах. Можно даже сделать так, чтобы они выполнялись в полноэкранном режиме. Сейчас я расскажу, как отобразить пустое окно Pygame. Вы увидите многие элементы, которые мы обсуждали ранее. Сначала вызывается init() Pygame, а затем создаются основная поверхность рисования и таймер.

Затем выполняется основной цикл, который постоянно заполняет экран однотонным серым цветом и вызывает метод таймера tick() с частотой кадров.

Использование фонового изображения

Обычно однотонный цвет фона выглядит не очень интересно. Pygame очень хорошо работает с изображениями. Для Breakout я нашёл любопытную фотографию настоящего космоса, сделанную НАСА. Код очень прост. Сначала он перед основным циклом загружает фоновое изображение с помощью функции pygame.image.load() . Затем вместо того, чтобы заливать экран цветом, он выполняет блиттинг (копирование битов) изображения на экран в позицию (0,0). В результате на экране отображается изображение.


Отрисовка фигур

Pygame может рисовать всё, что угодно. В модуле pygame.draw есть функции для отрисовки следующих фигур:

  • прямоугольника (rect)
  • многоугольника (polygon)
  • круга (circle)
  • эллипса (ellipse)
  • дуги (arc)
  • отрезка (line)
  • отрезков (lines)
  • сглаженного отрезка (anti-aliased line)
  • сглаженных отрезков (anti-aliased lines)

Отрисовка кирпичей

Кирпичи — это просто прямоугольники. В Pygame есть функция pygame.draw.rect() , получающая поверхность, цвет и объект Rect (левую и верхнюю координату, ширину и высоту) и рендерящая прямоугольник. Если дополнительный параметр ширины больше нуля, то он отрисовывает контур. Если ширина равна нулю (значение по умолчанию), то рисует сплошной прямоугольник.

Стоит заметить, что класс Brick является подклассом GameObject и получает все его свойства, но также имеет и цвет, который обрабатывает самостоятельно (потому что могут существовать игровые объекты, имеющие несколько цветов). Поле special_effect мы пока рассматривать не будем.

Отрисовка мяча

Мяч в Breakout — это просто круг. В Pygame есть функция pygame.draw.circle() , получающая цвет, центр, радиус и дополнительный параметр ширины, который по умолчанию равен нулю. Как и в функции pygame.draw.rect() , если ширина равна нулю, то отрисовывается сплошной круг. Ball тоже является подклассом GameObject.

Так как мяч всегда движется (в отличие от кирпичей), он также имеет скорость, которая передаётся для обработки базовому классу GameObject . Класс Ball имеет небольшое отличие — параметры x и y обозначают его центр, а параметры x и y, передаваемые базовому классу GameObject являются верхним левым углом ограничивающего прямоугольника. Чтобы преобразовать центр в верхний левый угол, достаточно вычесть радиус.

Отрисовка ракетки

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

Заключение

В этой части мы узнали о классе TextObject и о том, как рендерить текст на экране. Также мы познакомились с тем, как рисовать объекты: кирпичи, мяч и ракетку.

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

Смайлик, отскакивающий от стенок окна

Мне, нужно чтобы этот смайл от стены отскакивал. Как это сделать ?
Условие:
в начале работы программы ему задаётся произвольный ненулевой вектор движения;
при касании со стенами, вектор движения отражается от стены и смайлик двигается в другую сторону

Помощь в написании контрольных, курсовых и дипломных работ здесь.

94731 / 64177 / 26122 Ответы с готовыми решениями:

Шар, отскакивающий от стенок экрана
помогите составить процедуру, рисующую на синем фоне шар, который отскакивает от стенок икрана.

Изобразить теннисный мячик (белый круг), движущийся в поле экрана и отскакивающий от “стенок” – границ экрана
Изобразить теннисный мячик (белый круг), движущийся в поле экрана и отскакивающий от “стенок” –.

Отталкивание квадрата от стенок окна
Как реализовать отталкивание квадрата от стенок окна в builder? Видел пример с шариком, вроде.

Увеличение размера окна у стенок экрана не работает
Это издевательство, уже не раз пожалел с переходом на Windows 10, хотя у него есть и свои плюсы.

Pygame, событие в движении, удары и стенки

Помощь в написании контрольных, курсовых и дипломных работ здесь.

94731 / 64177 / 26122 Ответы с готовыми решениями:

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

При импорте pygame пишет что нет модуля pygame.base
Устанавливаю для kivy.Всё есть (sython,gsstreamer,kivy,pyscripter,python) , а вот фраем. pygame не.


pygame.error: cannot convert without pygame.display initialized
Только начал изучать спрайты Выдаёт ошибку: Traceback (most recent call last): File.

Pygame, построение блоков по шаблону

Здравствуйте, немного не по теме, теперь для pygame создали отельный раздел? Круто.
А теперь по делу, суть вопроса следующая. изучая pygame я наткнулся на один пример как можно выложить уровень/локацию / карту(называйте как хотите) спрайтами по текстовому шаблону. Поработав с ним вроде все запустилось, но есть одна проблема. всю карту он выкладывает только одним типом блока. То есть к примеру если уровень в тексте выглядит так -

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы ( 1 ) 94731 / 64177 / 26122 Ответы с готовыми решениями:

При импорте pygame пишет что нет модуля pygame.base
Устанавливаю для kivy.Всё есть (sython,gsstreamer,kivy,pyscripter,python) , а вот фраем. pygame не.

Построение блоков. CSS
Здравствуйте. Вот у меня есть несколько объектов(div-ы): родительский: .work_space 1272 / 660 / 362

Реализация стен в игре

Я могу получить список стен, с которыми игрок сталкивается через pygame.spritecollide() и могу узнать все прямоугольники пересечения через player.rect.clip(wall.rect) . Но я не знаю, что с этим делать.

У меня были такие идеи:

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

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

Не знаю, какой алгоритм нужно реализовать, чтобы грамотно сделать коллизию со стенами.


Pygame использует объекты Rect для хранения и манипулирования прямоугольными областями. Rect может быть создан из комбинации значений слева, сверху, ширины и высоты. Rect также могут быть созданы из объектов python, которые уже являются Rect или имеют атрибут с именем «rect».

Методы работы с Rect
pygame.Rect.copy Возвращает новый прямоугольник, имеющий ту же позицию и размер, что и оригинал.
pygame.Rect.move Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым целочисленным значением, положительным или отрицательным.
pygame.Rect.move_ip То же, что и метод Rect.move (), но работает на месте.
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 пересекаются ли все прямоугольники в словаре

Обработка событий

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

Функция get в модуле pygame.event возвращает последнее событие, ожидающее в очереди и удаляет его из очереди.

Объект event

Модуль pygame.event для обработки очереди событий

pygame.event.pump Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump (), чтобы позволить pygame обрабатывать внутренние действия
pygame.event.get получает события из очереди
pygame.event.poll получить одно событие из очереди
pygame.event.wait ждёт одиночного события из очереди
pygame.event.peek проверить, ждут ли очереди события определённого типа
pygame.event.clear удалить все события из очереди
pygame.event.event_name возвращает имя для типа события. Строка находится в стиле WordCap
pygame.event.set_blocked проверяет, какие события не разрешены в очереди
pygame.event.set_allowed проверяет, какие события разрешены в очереди
pygame.event.get_blocked проверить, заблокирован ли тип события из очереди
pygame.event.set_grab проверяет совместное использование устройств ввода с другими приложениями
pygame.event.get_grab проверить, работает ли программа на устройствах ввода данных
pygame.event.post поместить новое событие в очередь
pygame.event.Event создать новый объект события
pygame.event.EventType Объект Python, представляющий событие SDL. Экземпляры пользовательских событий создаются с вызовом функции Event. Тип EventType не может быть напрямую вызван. Экземпляры EventType поддерживают назначение и удаление атрибутов.

Существует множество способов доступа к очереди событий. Просто проверять существование событий, захватывать их непосредственно из стека.

Модуль pygame.mouse для работы с мышью

pygame.mouse.get_pressed получить состояние кнопок мыши
pygame.mouse.get_pos получить позицию курсора мыши
pygame.mouse.get_rel получить количество движений мыши
pygame.mouse.set_pos установить позицию курсора мыши
pygame.mouse.set_visible скрыть или показать курсор мыши
pygame.mouse.get_focused проверяет, принимает ли дисплей ввод мыши
pygame.mouse.set_cursor установить изображение для курсора мыши
pygame.mouse.get_cursor получить изображение для курсора мыши

Функции мыши можно использовать для получения текущего состояния устройства мышь. Эти функции также могут изменять курсор мыши.

Когда режим отображения (display) установлен, очередь событий начнет принимать события мыши. Кнопки мыши генерируют события pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP , когда они нажимаются и отпускаются. Эти события содержат атрибут кнопки, указывающий, какая кнопка была нажата. Колесо мыши будет генерировать pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP события при прокрутке.

Когда колесо повернуто вверх, кнопка будет установлена на 4, вниз -5. Всякий раз, когда мышь перемещается, генерируется событие pygame.MOUSEMOTION . Движение мыши разбито на небольшие и точные события движения. По мере перемещения мыши многие события движения будут помещены в очередь. События движения мыши, которые неправильно очищены от очереди событий, являются основной причиной того, что очередь событий заполняется.

Пример. Нарисовать курсор под текущей позицией мыши.

Определить какая кнопка была нажата на мышке можно используя значение event.button:

Координаты курсора при нажатии кнопки мыши находятся в event.pos .

Пример. Перемещать картинку курсором мыши.

Клавиатура

Модуль pygame.key

Этот модуль содержит функции для работы с клавиатурой.Очередь событий получает события pygame.KEYDOWN и pygame.KEYUP при нажатии и отпускании клавиш клавиатуры.

Оба события имеют ключевой атрибут, который представляет собой целочисленный идентификатор, представляющий каждую клавишу на клавиатуре.Событие pygame.KEYDOWN имеет дополнительные атрибуты: unicode и scancode. unicode представляет собой одну символьную строку, которая соответствует введённому символу. Scancode представляет собой код для конкретной платформы.

Получить код клавиши:


Существует много клавиатурных констант, они используются для представления клавиш на клавиатуре. Ниже приведен список всех клавиатурных констант:

Направленное движение с помощью клавиш

Можно перемещать изображение на экране с клавиатуры, назначая клавиши для перемещений: вверх, вниз, влево, вправо.

Создать картинку, например:

Проверить очередь событий:

Проверить, является ли полученное событие нажатием на клавиши со стрелками:

Если — да, то получмить код нажатой клавиши и сформировать новые координаты для картинки:

И нарисовать картинку в новом месте:

Объект Surface

pygame.Surface — объект pygame для представления изображений


Наложение поверхностей, прозрачность.

Управление временем

Модуль pygame.time содержит объект Clock, который можно использовать для отслеживания
времени. Чтобы создать объект типа: время, вызывается конструктор pygame.time.Clock:
clock = pygame.time.Clock()

Когда создан объект clock, можно вызвать его функцию tick один раз за кадр,
которая возвращает время, прошедшее со времени предыдущего вызова в миллисекундах:
time_passed = clock.tick ()

Функция tick может использовать необязательный параметр для установления максимальной частоты кадров. Этот параметр нужен, если игра запущена на рабочем компьютере и необходимо контролировать, чтобы она не использовала всю его вычислительная мощность на 100%:

time_passed = clock.tick (30)

Звуки

Для управления звуком используется модуль pygame.mixer . Он отвечает за любые действия со звуками.

Загружаем звуковой файл в формате *.wav

sound = pygame.mixer.Sound("sound.wav")
(загружаем до игрового цикла, т.к. это очень долгая операция)

Столкновения (collisions)

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

Читайте также: