Drawing graphics primitives¶
The pygame.draw module allows to draw simple shapes to a surface. This can be the screen surface or any Surface object such as an image or drawing:
- rectangle
- polygon
- circle
- ellipse
The functions have in common that they:
- take a Surface object as first argument
- take a color as second argument
- take a width parameter as last argument
- return a Rect object which bounds the changed area
the following format:
Most of the functions take a width argument. If the width is 0, the shape is filled.
Draw solid and outlined rectangles¶
The following draws first the background color and then adds three overlapping solid rectangles and next to it three oulined overlapping rectangles with increasing line width:
Try to modifiy the parameters and play with the drawing function.
Draw solid and outlined ellipses¶
The following code draws first the background color and then adds three overlapping solid ellipses and next to it three oulined overlapping ellipses with increasing line width:
Detect the mouse¶
Pressing the mouse buttons produces MOUSEBUTTONDOWN and MOUSEBUTTONUP events. The flollowing code in the event loop detects them and writes the event to the console:
Pressing the mouse buttons produces this kind of events:
Just moving the mouse produces a MOUSEMOTION event. The following code detects them an writes the event to the console:
Moving the mosue produces this kind of event:
Draw a rectangle with the mouse¶
We can use this three events to draw a rectangle on the screen. We define the rectangle by its diagonal start and end point. We also need a flag which indicates if the mouse button is down and if we are drawing:
When the mouse button is pressed, we set start and end to the current mouse position and indciate with the flag that the drawing mode has started:
When the mouse button is released, we set the end point and indicate with the flag that the drawing mode has ended:
When the mouse is moving we have also have to check if we are in drawing mode. If yes, we set the end position to the current mouse position:
Finally we draw the rectangle to the screen. First we fill in the background color. Then we calculate the size of the rectangle. Finally we draw it, and at the very last we update the screen:
Draw multiple shapes¶
To draw multiple shapes, we need to place them into a list. Besides variables for start , end and drawing we add a rectangle list:
When drawing of an object (rectangle, circle, etc.) is done, as indicated by a MOUSEBUTTONUP event, we create a rectangle and append it to the rectangle list:
In the drawing code, we first fill the background color, then iterate through the rectagle list to draw the objects (red, thickness=3), and finally we draw the current rectangle which is in the process of being drawn (blue, thickness=1):
Here is the complete file:
Draw a pologyon line with the mouse¶
To draw a polygon line we need to add the points to a list of points. First we define an empty point list and a drawing flag:
At the MOUSEBUTTONDOWN event we add the current point to the list and set the drawing flag to True:
At the MOUSEBUTTONUP event we deactivate the drawing flag:
At the MOUSEMOTION event we move the last point in the polygon list if the drawing flag is set:
Библиотека pygame №1
pygame — это библиотека модулей для языка Python, созданная для разработки 2D игр.
Для того чтобы установить pygame на свой компьютер необходимо открыть командную строку или терминал и написать команду
pip3 install pygame
После установки необходимо создать новый файл и импортировать модуль pygame и написать шаблон игры
# Импортируем библиотеку pygame
import pygame
# Импортируем системную функцию exit
from sys import exit
# Инициализируем pygame
pygame. init ()
# Создаем окошко 800 пикселей шириной
# и 600 пикселей высотой и записываем его
# в переменную display.
# Переменную display называют поверхностью.
display = pygame.display. set_mode ( ( 800 , 600 ) )
# Основной цикл игры
while True :
# Ждем события (действия пользователя)
f or event in pygame.event. get ():
# Если нажали на крестик,
# то закрываем окно
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
# Обновляем поверхность игры
# на каждом шаге основного цикла игры
pygame.display. update ()
Пользователь может взаимодействовать с нашей игрой. Каждое действие пользователя — это некоторое событие , которое мы можем обработать . Выражение pygame.event.get() — это список событий, произошедших в нашей игре.
Цикл for просто перебирает необработанные события. Каждое событие он присваивает переменной event (можно написать любую другую).
Поговорим о цикле while , основном цикле игры . Как часто он выполняется? Очень и очень часто, это зависит от мощности компьютера. Для обновления экрана в играх часто используют 60 кадров в секунду.
Ограничим количество выполнений цикла.
import pygame
from sys import exit
display = pygame.display. set_mode ( ( 800 , 600 ) )
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
display = pygame.display. set_mode ( ( 800 , 600 ) )
# Рисуем полигон (да, получится квадратик)
pygame.draw. polygon ( display, ( 255 , 0 , 0 ) , ( ( 0 , 0 ), ( 100 , 0 ), ( 100 , 100 ), ( 0 , 100 ) ) )
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 ) )
# Рисуем квадратик
pygame.draw. polygon ( display, ( 255 , 0 , 0 ) , ( ( 0 , 0 ), ( 100 , 0 ), ( 100 , 100 ), ( 0 , 100 ) ) )
# Рисуем синий треугольник
pygame.draw. polygon ( display, ( 0 , 0 , 255 ) , ( ( 100 , 100 ), ( 200 , 200 ), ( 100 , 200 ) ) )
FPS = 60 # Создаем переменную FPS
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
(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 ) )
# Рисуем квадратик
pygame.draw. polygon ( display, ( 255 , 0 , 0 ) , ( ( 0 , 0 ), ( 100 , 0 ), ( 100 , 100 ), ( 0 , 100 ) ) )
# Рисуем синию линию
pygame.draw. polygon ( display, ( 0 , 0 , 255 ) , ( ( 100 , 100 ), ( 200 , 200 ), ( 100 , 200 ) ) )
# Рисуем желтую окружность с радиусом 100 пикселей
pygame.draw. circle ( display, ( 255 , 255 , 0 ) , ( 400 , 200 ), 100 )
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 ) )
# Рисуем квадратик
pygame.draw. polygon ( display, ( 255 , 0 , 0 ) , ( ( 0 , 0 ), ( 100 , 0 ), ( 100 , 100 ), ( 0 , 100 ) ) )
# Рисуем синию линию
pygame.draw. polygon ( display, ( 0 , 0 , 255 ) , ( ( 100 , 100 ), ( 200 , 200 ), ( 100 , 200 ) ) )
# Рисуем желтую окружность с радиусом 100 пикселей
pygame.draw. circle ( display, ( 255 , 255 , 0 ) , ( 400 , 200 ), 100 )
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 ) )
# Рисуем квадратик
pygame.draw. polygon ( display, ( 255 , 0 , 0 ) , ( ( 0 , 0 ), ( 100 , 0 ), ( 100 , 100 ), ( 0 , 100 ) ) )
# Рисуем синию линию
pygame.draw. polygon ( display, ( 0 , 0 , 255 ) , ( ( 100 , 100 ), ( 200 , 200 ), ( 100 , 200 ) ) )
# Рисуем желтую окружность с радиусом 100 пикселей
pygame.draw. circle ( display, ( 255 , 255 , 0 ) , ( 400 , 200 ), 100 )
# Рисуем фиолетовый прямоугольник 200х300
pygame.draw. rect ( display, PURPLE , ( 600 , 300 , 200 , 300 ))
FPS = 60
clock = pg.time. Clock ()
while True :
f or event in pygame.event. get ():
if event.type == pygame.QUIT:
pygame. quit ()
exit ()
Если ваша творческая натура требует большего, то вот ссылка на документацию модулю draw
Там можно найти рисование линий, дуг, эллипсов.
Большой пример ( запусти его у себя на компьтере:
import pygame
from sys import exit
from random import randint
# Функция, возвращающая случайный оттенок зеленого цвета
def randomGreen ():
return randint ( 0 , 100 ), randint ( 100 , 255 ), randint ( 0 , 100 )
# Функция, возвращающая случайный оттенок красного цвета
def randomRed ():
return randint ( 100 , 255 ), randint ( 0 , 100 ), randint ( 0 , 100 )
Pygame Drawing a Rectangle
I’m making a game that requires knowing how to draw a rectangle in Python (3.2).
I have checked lot of sources but none show exactly how to do it.
6 Answers 6
This creates a simple window 500 pixels by 400 pixels that is white. Within the window will be a blue rectangle. You need to use the pygame.draw.rect to go about this, and you add the DISPLAY constant to add it to the screen, the variable blue to make it blue (blue is a tuple that values which equate to blue in the RGB values and it’s coordinates.
Look up pygame.org for more info
Have you tried this:
Taken from the site:
pygame.draw.rect(screen, color, (x,y,width,height), thickness) draws a rectangle (x,y,width,height) is a Python tuple x,y are the coordinates of the upper left hand corner width, height are the width and height of the rectangle thickness is the thickness of the line. If it is zero, the rectangle is filled
With the module pygame.draw shapes like rectangles, circles, polygons, liens, ellipses or arcs can be drawn. Some examples:
pygame.draw.rect draws filled rectangular shapes or outlines. The arguments are the target Surface (i.s. the display), the color, the rectangle and the optional outline width. The rectangle argument is a tuple with the 4 components (x, y, width, height), where (x, y) is the upper left point of the rectangle. Alternatively, the argument can be a pygame.Rect object:
pygame.draw.circle draws filled circles or outlines. The arguments are the target Surface (i.s. the display), the color, the center, the radius and the optional outline width. The center argument is a tuple with the 2 components (x, y):
pygame.draw.polygon draws filled polygons or contours. The arguments are the target Surface (i.s. the display), the color, a list of points and the optional contour width. Each point is a tuple with the 2 components (x, y):
Minimal example: repl.it/@Rabbid76/PyGame-Shapes
pygame
Рисование на экране
Pygame имеет модуль pygame.draw , который содержит функции, которые могут рисовать фигуры непосредственно на поверхности.
функция | Описание |
---|---|
pygame.draw.rect | нарисовать прямоугольную форму |
pygame.draw.polygon | нарисуйте фигуру с любым количеством сторон |
pygame.draw.circle | нарисуйте круг вокруг точки |
pygame.draw.ellipse | нарисуйте круглую форму внутри прямоугольника |
pygame.draw.arc | нарисуйте частичную часть эллипса |
pygame.draw.line | нарисуйте отрезок прямой линии |
pygame.draw.lines | нарисовать несколько смежных отрезков |
pygame.draw.aaline | нарисовать тонкие сглаженные линии |
pygame.draw.aalines | нарисовать связанную последовательность сглаженных линий |
Как использовать модуль
Чтобы использовать модуль, вам сначала нужно правильно импортировать и инициализировать pygame и установить режим отображения. Удобно определять цветовые константы заранее, делая ваш код более читабельным и красивым. Все функции принимают поверх поверхности, аргумент цвета и позиции, который представляет собой либо pygame Rect, либо 2-элементную последовательность integer / float ( pygame.draw.circle будет принимать только целые числа из-за неопределенных причин).
пример
В приведенном ниже коде будут показаны все различные функции, способы их использования и способы их просмотра. Мы инициализируем pygame и определяем некоторые константы перед примерами.
Черный цвет — это цвет по умолчанию для поверхности и представляет собой часть поверхности, на которую не нарисовано. Параметры каждой функции описаны ниже в параметрах .
многоугольник
Отверстия являются неудачным следствием алгоритма рисования pygame.
Эллипс
Отверстия являются неудачным следствием алгоритма рисования pygame.
Линия
линии
Сглаженная линия
Сглаженные линии
Попробуйте
Попробуйте сами: скопируйте один из фрагментов кода выше и код ниже в пустой файл, измените изображение имени на имя поверхности, которую хотите разбить и поэкспериментировать.
Поверхности
В pygame вы обычно используете Surfaces для представления внешнего вида объектов и Rectangles для представления своих позиций. A Поверхность похожа на чистый лист бумаги, который содержит цвета или изображения. Существует два способа создания Поверхности: пустая с нуля или загрузка изображения.
Создание поверхности
Чтобы создать Поверхность, вам нужен минимум ее размер, который представляет собой 2-элементную целую последовательность ширины и высоты, представляющую размер в пикселях.
Вы также можете передавать дополнительные аргументы при создании Поверхности для управления глубиной, масками и дополнительными функциями в качестве пикселя альфа и / или создания изображения в видеопамяти. Однако это выходит за рамки этого примера.
Вы можете использовать модуль pygame.draw для рисования фигур на поверхности или заливки цветом, вызвав метод fill(color) поверхности fill(color) . Цвет аргумента представляет собой целую последовательность из 3 или 4 элементов или объект pygame.Color .
Загрузить изображение
Чаще всего вы хотели бы использовать свои собственные изображения в игре (называемые спрайтами). Создание поверхности с вашим изображением так же просто, как:
Путь к изображению может быть относительным или абсолютным. Для повышения производительности обычно целесообразно преобразовать изображение в тот же формат пикселей, что и экран. Это можно сделать, вызвав метод Surface метода convert() , например:
Если ваше изображение содержит прозрачность (альфа-значения), вы просто вызываете метод convert_alpha() :
блиттинг
Для того, чтобы их можно было отображать, на экране должны быть блистерны. Blitting по существу означает копирование пикселей с одной поверхности на другую (экран также является поверхностью). Вам также необходимо передать позицию поверхности, которая должна быть 2-элементной целочисленной последовательностью или объектом Rect. Поверхность Поверхности будет помещена в позицию.
Можно смешать с другими поверхностями, чем экран. Чтобы показать, что было на экране, вам нужно вызвать pygame.display.update() или pygame.display.flip() .
прозрачность
В pygame есть виды 3 прозрачности: colorkeys, Surface alphas и per-pixel alphas.
Colorkeys
Делает цвет полностью прозрачным или более точно, делая цвет просто не blit. Если у вас есть изображение с черным прямоугольником внутри, вы можете установить colorkey, чтобы черный цвет не блистал.
Поверхность может иметь только один colorkey. Установка другого colorkey перезапишет предыдущий. Colorkeys не может иметь разные значения альфа, он может только сделать цвет невидимым.
Поверхностные альфы
Делает всю поверхность прозрачной по альфа-значению. С помощью этого метода вы можете иметь разные значения альфа, но это повлияет на всю поверхность.
Пер-пиксельная альфа
Делает каждый пиксель в прозрачной поверхности индивидуальным альфа-значением. Это дает вам максимальную свободу и гибкость, но также является самым медленным методом. Этот метод также требует, чтобы поверхность создавалась как пиксельная альфа-поверхность, а цветовые аргументы должны содержать четвертое целое число.
Теперь поверхность будет рисовать прозрачность, если цвет содержит четвертое значение альфа.
В отличие от других поверхностей, этот цвет по умолчанию не будет черным, но прозрачным. Вот почему черный прямоугольник посередине исчезает.
Объединить colorkey и Surface alpha
Colorkeys и Surface alphas можно комбинировать, но альфа-пиксель не может. Это может быть полезно, если вы не хотите более медленную производительность для пиксельной поверхности.
Полный код
Скопируйте это в пустой файл и запустите его. Нажмите клавиши 1, 2, 3 или 4, чтобы отобразить изображения. Нажмите 2, 3 или 4 раза, чтобы сделать их более непрозрачными.