Как рисовать в pygame

Рисование графических примитивов

Обратите внимание у всех этих функций первым параметром идет surface – поверхность, на которой выполняется рисование. Забегая вперед отмечу, что таких поверхностей можно создавать множество, накладывая друг на друга. Но на этом занятии мы будем использовать базовую поверхность, представляющую клиентскую область окна приложения:

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Ссылку на этот объект можно получить в момент создания окна:

(здесь sc – ссылка на базовый объект Surface). Давайте теперь нарисуем в окне прямоугольник с помощью функции rect:

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

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Обратите внимание, что координаты откладываются от верхнего левого угла и ось Oy направлена вниз (а не вверх, как мы привыкли по математике).

Итак, указание нарисовать прямоугольник даны. Но если сейчас выполнить программу, то мы ничего не увидим на экране. Почему? Это связано с тем, что базовый объект Surface использует механизм рисования, известный как буферизация вывода.

Ее принцип проще пояснить на таком рисунке. Представим, что объект Surface имеет две стороны A и B:

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Изначально мы видим сторону B, но рисование выполняется на противоположной стороне – A. Затем, чтобы отобразить нарисованные объекты, мы должны перевернуть объект Surface другой стороной. В PyGame это делается с помощью функции flip():

Теперь при запуске программы мы видим сторону A с нарисованным прямоугольником. В этом заключается принцип буферизации вывода графической информации. Но спрашивается: зачем все это нужно? Почему бы сразу не рисовать на видимой стороне объекта? В этом случае при большом числе объектов и сложной анимации пользователь будет замечать процесс отрисовки текущего кадра игры. И это негативно скажется на визуальном восприятии игрового процесса. Чтобы перерисовка кадров проходила незаметно для человеческого глаза, как раз и используется механизм буферизации.

Помимо метода flip() можно использовать похожий метод:

Здесь rectangle – это прямоугольная область, которую требуется перерисовать (по умолчанию, если ничего не указано, то перерисовывается вся клиентская область и метод update повторяет метод flip).

Так как метод update более гибкий, то в дальнейшем я буду использовать именно его.

Итак, мы с вами нарисовали закрашенный прямоугольник. Если нужно нарисовать не закрашенный, то следует указать следующий параметр – толщину линии:

Разумеется, все функции рисования должны следовать до метода update. Наконец, последний важный штрих. Цвета заливки или линий обычно задаются вначале в виде констант, а затем, уже используются в функциях рисования:

Так программа выглядит более читабельной. Давайте теперь посмотрим как рисуются остальные графические примитивы:

Вот такие примитивы существуют в PyGame.

Видео по теме

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Что такое Pygame? Каркас приложения, FPS | Pygame #1

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Рисование графических примитивов | Pygame #2

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как обрабатывать события от клавиатуры | Pygame #3

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как обрабатывать события от мыши | Pygame #4

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Создание поверхностей (Surface) и их анимация. Метод blit | Pygame #5

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Класс Rect. Его роль, свойства и методы | Pygame #6

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать текст различными шрифтами | Pygame #7

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как работать с изображениями. Модули image и transform | Pygame #8

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Что такое спрайты и как с ними работать | Pygame #9

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как делать контроль столкновений | Pygame #10

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Добавляем звук в игровой процесс. Модули mixer и music | Pygame #11

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

Источник

Как рисовать в pygame

Draw several simple shapes to a surface. These functions will work for rendering to any format of surface. Rendering to hardware surfaces will be slower than regular software surfaces.

Most of the functions take a width argument to represent the size of stroke (thickness) around the edge of the shape. If a width of 0 is passed the shape will be filled (solid).

All the drawing functions respect the clip area for the surface and will be constrained to that area. The functions return a rectangle representing the bounding area of changed pixels. This bounding rectangle is the ‘minimum’ bounding box that encloses the affected area.

All the drawing functions accept a color argument that can be one of the following formats:

an (RGB) triplet (tuple/list)

an (RGBA) quadruplet (tuple/list)

A color’s alpha value will be written directly into the surface (if the surface contains pixel alphas), but the draw function will not draw transparently.

These functions temporarily lock the surface they are operating on. Many sequential drawing calls can be sped up by locking and unlocking the surface object around the draw calls (see pygame.Surface.lock() lock the Surface memory for pixel access and pygame.Surface.unlock() unlock the Surface memory from pixel access ).

See the pygame.gfxdraw pygame module for drawing shapes module for alternative draw methods.

Draws a rectangle on the given surface.

(optional) used for line thickness or to indicate that the rectangle is to be filled (not to be confused with the width value of the rect parameter)

(optional) used for setting the value of bottom right border. If you don’t set this value, it will use the border_radius value.

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the position of the given rect parameter and its width and height will be 0

The pygame.Surface.fill() fill Surface with a solid color method works just as well for drawing filled rectangles and can be hardware accelerated on some platforms with both software and hardware display modes.

Changed in pygame 2.0.0: Added support for keyword arguments.

Changed in pygame 2.0.0.dev8: Added support for border radius.

Draws a polygon on the given surface.

(optional) used for line thickness or to indicate that the polygon is to be filled

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the position of the first point in the points parameter (float values will be truncated) and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Draws a circle on the given surface.

(optional) used for line thickness or to indicate that the circle is to be filled

(optional) if this is set to True then the bottom right corner of the circle will be drawn

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the center parameter value (float values will be truncated) and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments. Nothing is drawn when the radius is 0 (a pixel at the center coordinates used to be drawn when the radius equaled 0). Floats, and Vector2 are accepted for the center param. The drawing algorithm was improved to look more like a circle.

Changed in pygame 2.0.0.dev8: Added support for drawing circle quadrants.

Draws an ellipse on the given surface.

(optional) used for line thickness or to indicate that the ellipse is to be filled (not to be confused with the width value of the rect parameter)

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the position of the given rect parameter and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Draws an elliptical arc on the given surface.

stop angle of the arc in radians

(optional) used for line thickness (not to be confused with the width value of the rect parameter)

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the position of the given rect parameter and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Draws a straight line on the given surface. There are no endcaps. For thick lines the ends are squared off.

(optional) used for line thickness

For odd width values, the thickness of each line grows with the original line being in the center.

For even width values, the thickness of each line grows with the original line being offset from the center (as there is no exact center line drawn). As a result, lines with a slope = 1 (vertical-ish) will have 1 more pixel of thickness to the right of the original line (in the x direction).

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the start_pos parameter value (float values will be truncated) and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Draws a sequence of contiguous straight lines on the given surface. There are no endcaps or miter joints. For thick lines the ends are squared off. Drawing thick lines with sharp corners can have undesired looking results.

(optional) used for line thickness

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the position of the first point in the points parameter (float values will be truncated) and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Draws a straight antialiased line on the given surface.

The line has a thickness of one pixel and the endpoints have a height and width of one pixel each.

The way a line and it’s endpoints are drawn:

If both endpoints are equal, only a single pixel is drawn (after rounding floats to nearest integer).

Otherwise if the line is not steep (i.e. if the length along the x-axis is greater than the height along the y-axis):

Calculate the position of the nearest point with a whole number for it’s x-coordinate, when extending the line past the endpoint.

Find which pixels would be covered and how much by that point.

Then draw those pixels.

Then for each point between the endpoints, along the line, whose x-coordinate is a whole number:

Find which pixels would be covered and how much by that point and draw them.

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the start_pos parameter value (float values will be truncated) and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Draws a sequence of contiguous straight antialiased lines on the given surface.

a rect bounding the changed pixels, if nothing is drawn the bounding rect’s position will be the position of the first point in the points parameter (float values will be truncated) and its width and height will be 0

Changed in pygame 2.0.0: Added support for keyword arguments.

Источник

Как рисовать в pygame

Те, кто хорошо поняли прошлую статью, могут сказать, что этот метод создает окно с размерами 400х100. На самом деле все немного не так, вернее все так только я тогда полностью не объяснил весь метод, если простыми словами, то этот метод создает окно и возвращает изображение, которым является поверхность окна. Наверное я вас запутал, сейчас попробую это исправить, давайте рассмотрим этот метод более детально.
pygame.display.set_mode(resolution=(0,0), flags=0, depth=0): return Surface, здесь resolution – это список чисел в котором хранится размер окна по оси х и у, flags – флаг окна (полный экран, изменяемые размеры и и т.д), depth – глубина цвета. Как видно описание такое же, как и в прошлой статье, но есть одно но, тогда мы не рассмотрели то, что возвращает этот метод. Как видно этот метод возвращает объект класса Surface. Surface – если перевести на русский будет – поверхность, в целом это правильный перевод, но что тогда принимать за поверхность? Поверхность в данном контексте это объект, на котором мы можем рисовать, например если сравнивать PyGame с другими графическими библиотеками, то там поверхность рисования называется Canvas, Image и т.д. По сути, класс Surface это представление изображения в библиотеки PyGame. Далее изображение и поверхность рисования будут иметь одинаковый смысл. Про класс Surface мы с вами поговорим в следующих статьях, сейчас вам главное понять то, что Surface это изображение в PyGame.
Теперь мы знаем, что есть девять методов, которые рисуют на изображении простые фигуры, но изучать их сейчас мы не будем, все это будет потом, а сейчас нам надо построить скелет программы на PyGame.

Часть вторая. Составление скелета программы на PyGame.

Часть третья. Практика и теория.

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

Как рисовать в pygame. Смотреть фото Как рисовать в pygame. Смотреть картинку Как рисовать в pygame. Картинка про Как рисовать в pygame. Фото Как рисовать в pygame

В итоге должен быть написан следующий код:

Часть четвертая. Заключение.

В итоге мы рассмотрели полностью класс Draw библиотеки PyGame, поняли, что из себя представляет класс Surface и написали шаблон, который мы будем использовать в следующих статьях. В следующей статье мы поговорим об событиях в PyGame.
Если есть, вопросы или проблемы по статье обращайтесь ко мне в Л.С.
Все всем пока, желаю удачи в геймдеве. Спасибо за внимание с вами был noTformaT.

Источник

Библиотека pygame №1

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

pip3 install pygame

После установки необходимо создать новый файл и импортировать модуль pygame и написать шаблон игры

# Импортируем библиотеку pygame
import pygame
# Импортируем системную функцию exit
from sys import exit

# Инициализируем pygame
pygame. init ()

# Основной цикл игры
while True :
# Ждем события (действия пользователя)
f or event in pygame.event. get ():
# Если нажали на крестик,
# то закрываем окно
if event.type == pygame.QUIT:
pygame. quit ()
exit ()

# Обновляем поверхность игры
# на каждом шаге основного цикла игры
pygame.display. update ()

Цикл for просто перебирает необработанные события. Каждое событие он присваивает переменной event (можно написать любую другую).

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

import pygame
from sys import exit

FPS = 60 # Создаем переменную FPS
clock = pg.time. Clock () # Создаем счетчик для FPS
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()

clock. tick (FPS) # Замедляем цикл до 60 выполнений в секунду

Методу tick() передается желаемое количество кадров в секунду. Задержку он вычисляет сам. На каждой итерации основного цикла игры секунда делится на 60 и на вычисленную величину выполняется задержка.

Рисование фигур

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

Функция polygon() рисует произвольную фигуру. Она принимает 3 обязательных параметра (поверхность, цвет и кортеж координат) и 1 необязательный (толщину линий).

import pygame
from sys import exit

FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()

Давайте нарисуем треугольник

import pygame
from sys import exit

FPS = 60 # Создаем переменную FPS
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()

Самостоятельно нарисуйте пятиугольник (вам помогут карандаш и лист бумаги)

Рисование окружностей

Чтобы нарисовать окружность нужно вызвать метод circle из модуля draw. Команда выглядит так: pygame.draw.circle(display, color, position, radius).

import pygame
from sys import exit

FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()

Объявления переменных для цветов

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

import pygame
from sys import exit

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) )

import pygame
from sys import exit

FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()

Если ваша творческая натура требует большего, то вот ссылка на документацию модулю draw

Там можно найти рисование линий, дуг, эллипсов.

Большой пример ( запусти его у себя на компьтере:

Задания:

1. Нарисуйте дерево из minecraft, используя полученные знания

2. Нарисуйте оранжевую, красную, синию и фиолетовую звезды

Источник

Модуль pygame.draw

Функции модуля pygame.draw рисуют геометрические примитивы на поверхности – экземпляре класса Surface. В качестве первого аргумента они принимают поверхность. Поэтому при создании той или иной поверхности ее надо связать с переменной, чтобы потом было что передать в функции модуля draw.

Поскольку мы пока используем только одну поверхность – главную оконную, то ее будем указывать в качестве первого параметра, а при создании свяжем с переменной:

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

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

После прорисовки, чтобы увидеть изменения в окне игры, необходимо выполнить функцию update() или flip() модуля display. Иначе окно не обновится. Рисование на поверхности – одно, а обновление состояния главного окна – другое. Представьте, что в разных местах тела главного цикла на поверхности прорисовываются разные объекты. Если бы каждое такое действие приводило к автоматическому обновлению окна, то за одну итерацию оно обновлялось бы несколько раз. Это приводило бы как минимум к бессмысленной трате ресурсов, так как скорость цикла связана с FPS.

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

Все функции модуля draw возвращают экземпляры класса Rect – прямоугольные области, имеющие координаты, длину и ширину. Не путайте функцию rect() модуля draw и класс Rect, это разные вещи.

Начнем с функции rect() модуля draw:

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

Следует отметить, что в функцию draw.rect() и некоторые другие третьим аргументом можно передавать не кортеж, а заранее созданный экземпляр Rect. В примере ниже показан такой вариант.

Обычно цвета выносят в отдельные переменные-константы. Это облегчает чтение кода:

Чтобы нарисовать линию, а точнее – отрезок, надо указать координаты его концов. При этом функция line() рисует обычную линию, aaline() – сглаженную (толщину для последней указать нельзя):

Координаты можно передавать как в виде списка, так и кортежа.

Функции lines() и aalines() рисуют ломанные линии:

Координаты определяют места излома. Количество точек может быть произвольным. Третий параметр (True или False) указывает замыкать ли крайние точки.

Функция polygon() рисует произвольный многоугольник. Задаются координаты вершин.

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

Так же как в случае rect() для polygon() можно указать толщину контура.

Функция circle() рисует круги. Указывается центр окружности и радиус:

В случае эллипса передается описывающая его прямоугольная область:

Указывается прямоугольник, описывающий эллипс, из которого вырезается дуга. Четвертый и пятый аргументы – начало и конец дуги, выраженные в радианах. Нулевая точка справа.

Практическая работа. Анимация

На данном этапе мы уже готовы создать анимацию. Никакого движения объектов на экране монитора нет. Просто от кадра к кадру изменяются цвета пикселей экрана. Например, пиксель с координатами (10, 10) светится синим цветом, в следующем кадре синим загорается пиксель (11, 11), в то время как (10, 10) становится таким же как фон. В следующем кадре синей будет только точка (12, 12) и так далее. При этом человеку будет казаться, что синяя точка движется по экрану по диагонали.

Суть алгоритма в следующем. Берем фигуру. Рисуем ее на поверхности. Обновляем главное окно, человек видит картинку. Стираем фигуру. Рисуем ее с небольшим смещением от первоначальной позиции. Снова обновляем окно и так далее.

Как «стереть» старую фигуру? Для этого используется метод fill() объекта Surface. В качестве аргумента передается цвет, т. е. фон можно сделать любым, а не только черным, который задан по-умолчанию.

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

Шапошникова С. (plustilino) © 2020

Pygame. Введение в разработку игр на Python

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *