Как сделать стены в pygame
Добавил пользователь Morpheus Обновлено: 17.09.2024
pygame - это библиотека модулей для языка Python, созданная для разработки 2D игр.
Для того чтобы установить pygame на свой компьютер необходимо открыть командную строку или терминал и написать команду
pip3 install pygame
После установки необходимо создать новый файл и импортировать модуль pygame и написать шаблон игры
Пользователь может взаимодействовать с нашей игрой. Каждое действие пользователя - это некоторое событие , которое мы можем обработать . Выражение pygame.event.get() - это список событий, произошедших в нашей игре.
Цикл for просто перебирает необработанные события. Каждое событие он присваивает переменной event (можно написать любую другую).
Поговорим о цикле while , основном цикле игры . Как часто он выполняется? Очень и очень часто, это зависит от мощности компьютера. Для обновления экрана в играх часто используют 60 кадров в секунду.
Ограничим количество выполнений цикла.
import pygame
from sys import exit
display = pygame.display. set_mode ( ( 800 , 600 ) )
Методу tick() передается желаемое количество кадров в секунду. Задержку он вычисляет сам. На каждой итерации основного цикла игры секунда делится на 60 и на вычисленную величину выполняется задержка.
В библиотеке pygame существует множество функций для рисования различных фигур.
Функция polygon() рисует произвольную фигуру. Она принимает 3 обязательных параметра (поверхность, цвет и кортеж координат) и 1 необязательный (толщину линий).
import pygame
from sys import exit
display = pygame.display. set_mode ( ( 800 , 600 ) )
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
display - наша поверхность
(255, 0, 0) - красный цвет , почитайте про rgb
( (0, 0), (100, 0), (100, 100), (0, 100) ) - координаты вершин квадрата. Возьмите листочек и нарисуйте его координатах (замените сотню на единицу).
Давайте нарисуем треугольник
import pygame
from sys import exit
display = pygame.display. set_mode ( ( 800 , 600 ) )
(0, 0, 255) - синий цвет
((100, 100), (200, 200), (100, 200)) - координаты вершин нашего треугольник.
Самостоятельно нарисуйте пятиугольник (вам помогут карандаш и лист бумаги)
Рисование окружностей
Чтобы нарисовать окружность нужно вызвать метод circle из модуля draw. Команда выглядит так: pygame.draw.circle(display, color, position, radius).
display - поверхность, на которой рисуем
color - цвет, записанный в кортеже из трех чисел. (еще раз про rgb)
position - координаты точки центра окружности ( кортеж из двух чисел (x, y) )
radius - радиус окружности в пикселях
import pygame
from sys import exit
display = pygame.display. set_mode ( ( 800 , 600 ) )
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
display - наша поверхнотсть для рисования
(255, 255, 0) - желтый цвет
(400, 200) - координаты точки центра (в нашем случае 400 пикселей от верхнего левого угла по горизонтали и 200 пикселей по вертикали)
100 - радиус нашей окружности в пикселях
Объявления переменных для цветов
Для нашего с вами удобства давайте объявим несколько переменных, в которые сохраним используемые нами цвета
import pygame
from sys import exit
WHITE = ( 255 , 255 , 255 )
BLACK = ( 0 , 0 , 0 )
PURPLE = ( 156 , 39 , 176 )
INDIGO = ( 63 , 81 , 181 )
BLUE = ( 33 , 150 , 243 )
GREEN = ( 76 , 175 , 80 )
YELLOW = ( 255 , 235 , 59 )
ORANGE = ( 255 , 152 , 0 )
GREY = ( 158 , 158 , 158 )
display = pygame.display. set_mode ( ( 800 , 600 ) )
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Рисование прямоугольников
Для отрисовки прямоугольников можно использовать метод rect.
pygame.draw.rect(display, color, (x, y, width, height) )
color - цвет (теперь можно просто написать имя переменную)
(x, y, width, height) - кортеж из четырех значений. Первые два значения - это координаты верхнего левого угла прямоугольника, а два последних - это ширина и высота.
import pygame
from sys import exit
WHITE = ( 255 , 255 , 255 )
BLACK = ( 0 , 0 , 0 )
PURPLE = ( 156 , 39 , 176 )
INDIGO = ( 63 , 81 , 181 )
BLUE = ( 33 , 150 , 243 )
GREEN = ( 76 , 175 , 80 )
YELLOW = ( 255 , 235 , 59 )
ORANGE = ( 255 , 152 , 0 )
GREY = ( 158 , 158 , 158 )
display = pygame.display. set_mode ( ( 800 , 600 ) )
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Если ваша творческая натура требует большего, то вот ссылка на документацию модулю draw
Там можно найти рисование линий, дуг, эллипсов.
Большой пример ( запусти его у себя на компьтере:
Для многих Python - это язык для написания веб проектов, машинного обучения или для анализа данных. На самом деле он более функционален и в этой статье мы вам это докажем.
Для реализации игр на Питон мы можем выбрать одну из нескольких библиотек. Можно работать с: Kivy, Tkinter, PyQt или же с любой другой библиотекой, что обеспечивает построение графического интерфейса через Python. Таких библиотек много, но мы возьмем библиотеку PyGame , которая даже своим названием говорит о её предназначении.
PyGame появился в 2000 году. С тех пор на его основе было сделано много интересных проектов . К сожалению, PyGame не универсален и разработка на нём ведется лишь под Андроид устройства.
Настройка проекта
Перед использованием PyGame его нужно установить через терминал. Прописываем команду:
Для создания базового окна игры, необходимо лишь импортировать библиотеку, инициализировать главный объект, указать размеры, а также название окна и создать основной цикл, что должен вызываться постоянно и тем самым проект будет запущен и работать все время.
Сюда же дописываем отслеживание действий пользователя. Если он закроет окно, то мы будем останавливать программу.
Создание платформера
Для создания платформера потребуется написать куда больше строк кода. Мы прикрепляем весь код проекта ниже. В коде есть комментарии для лучшего понимания:
Также для игры вам потребуются картинки игрока и платформы. Вы можете их скачать ниже.
(фото на задний фон)
Видео на эту тему
Также вы можете просмотреть детальное видео по разработке 2D платформера на Python + PyGame:
Дополнительный курс
На нашем сайте также есть углубленный курс по изучению языка Питон . В ходе огромной программы вы изучите не только язык Питон, но также научитесь создавать веб сайты за счёт веб технологий и фреймворка Джанго. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Питон, создавать на нём полноценные ПК приложения на основе библиотеки Kivy, а также создавать веб сайты на основе библиотеки Джанго.
Больше интересных новостей
СЕО-продвижение – верный способ улучшить свой бизнес
Как с помощью JavaScript определить IP адрес пользователя?
Принцип работы беспилотных машин
11 лучших систем для поиска изображений
Вот наш код из предыдущей статьи:
Итак, мы с нашей Кляксой отлично стартовали. Давайте теперь добавим код для среды, в которой эта Клякса будет существовать:
Это просто базовый стартовый код и константы. Цвета — это кортежи RGB. Если вы хотите более подробно ознакомиться с библиотекой Pygame, то обратитесь к ее документации . Но, скорей всего, все необходимое вы найдете в наших статьях. Также в наших видео есть дополнительная информация.
Теперь напишем начало функции, которая обрабатывает отрисовку окружения:
Очевидно, что в обработке графики задействовано много математики и тому подобного, но процесс, с наибольшей вероятностью способный вызвать зависание, обновляет значения пикселей на экране.
Обычно процесс для простой игры выглядит примерно так:
В нашем случае мы просто заполняем экран белым цветом, а затем используем метод .update, чтобы вывести на экран последний кадр.
Теперь напишем функцию main() и условие для прекращения игры:
PyGame работает на вашем процессоре и, как вы только что узнали, по умолчанию будет работать на одном ядре, так что это не идеальная стартовая среда. Преобразование PyGame в многопроцессорный движок — довольно сложная задача, и мы не собираемся делать этого здесь.
Но мы можем проследить за тем, чтобы наша фактическая игровая логика работала в отдельном процессе или нескольких процессах, и чтобы PyGame, по крайней мере, получала все ресурсы одного ядра.
На данный момент мы можем запустить следующий код:
Но пока у нас есть только белое игровое поле. Мы хотим, чтобы наша клякса тоже там была! Давайте создадим объект Blob и добавим его в наше окружение.
Для начала нам нужно создать объект Blob, потому что пока мы создали только соответствующий класс. Мы можем это сделать прямо в главной функции:
В данном случае мы указываем один аргумент, который требуется классу Blob, а именно цвет RED, как было описано в методе __init__. Поэтому данный объект класса Blob будет красным. Теперь давайте передадим этот объект Blob в функцию draw_environment:
И определим саму функцию следующим образом:
Функция game_display.fill (WHITE) заполнит весь экран белым цветом, затем мы рисуем кляксу в виде круга, а затем обновляем отображение.
Запустив данный код, мы получим красную кляксу на экране:
А что если мы захотим, чтобы наша клякса танцевала? Тогда мы просто добавим в нашу функцию draw_environment метод blob.move(). Мы можем это сделать в любом месте, но добавим его в конец:
Наш полный код на данный момент времени:
Теперь при запуске этого кода у нас будет прекрасная, извивающаяся клякса!
Я пытаюсь сделать простую игру 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 =.
Методы работы с 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)
При написании игр часто возникает необходимость проверять взаимное расположение объектов на экране, отслеживать моменты их столкновений, пересечений.
Читайте также: