Как сделать стены в 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 адрес пользователя?

Как с помощью JavaScript определить IP адрес пользователя?

Принцип работы беспилотных машин

Принцип работы беспилотных машин

11 лучших систем для поиска изображений

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)

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

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