Поиск…


Синтаксис

  • pygame.draw.rect (Поверхность, цвет, Rect, width = 0)
  • pygame.draw.polygon (Поверхность, цвет, список точек, ширина = 0)
  • pygame.draw.circle (Поверхность, цвет, позиция, радиус, ширина = 0)
  • pygame.draw.ellipse (Поверхность, цвет, Rect, width = 0)
  • pygame.draw.arc (Поверхность, цвет, Rect, start_angle, stop_angle, width = 1)
  • pygame.draw.line (Поверхность, цвет, start_pos, end_pos, width = 1)
  • pygame.draw.lines (Поверхность, цвет, закрытая, pointlist, width = 1)
  • pygame.draw.aaline (Поверхность, цвет, startpos, endpos, blend = 1)
  • pygame.draw.aalines (Surface, color, closed, pointlist, blend = 1)

параметры

параметры подробности
поверхность Поверхность, чтобы нарисовать фигуру.
цвет Целая последовательность 3 или 4, представляющая красный, зеленый и синий (и альфа), каждое значение находится в диапазоне от 0 до 255.
Rect Прямоугольная область, на которую будет нарисована фигура.
ширина Ширина линий. Форма будет заполнена, если ширина = 0.
PointList Список произвольного количества точек / вершин в пикселях (x, y).
позиция Положение центра круга в пикселях (x, y).
радиус Радиус кругов в пикселях.
закрыто Если true, линия между последней и первой точкой будет нарисована, закрывая фигуру.
смешаться = 1 Если true, оттенки будут смешиваться с существующими пиксельными оттенками, а не переписывать их.
start_angle Начальный угол дуги в радианах.
stop_angle Конечный угол дуги, в радианах.
start_pos Исходное положение линии в пикселях.
end_pos Конечное положение линии, в пикселях

Рисование с помощью модуля вытягивания

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 и определяем некоторые константы перед примерами.

import pygame
from math import pi
pygame.init()

screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0) 

Черный цвет - это цвет по умолчанию для поверхности и представляет собой часть поверхности, на которую не нарисовано. Параметры каждой функции описаны ниже в параметрах .

Rect

size = (50, 50)

rect_border = pygame.Surface(size)  # Create a Surface to draw on.
pygame.draw.rect(rect_border, RED, rect_border.get_rect(), 10)  # Draw on it.

rect_filled = pygame.Surface(size)
pygame.draw.rect(rect_filled, RED, rect_filled.get_rect())   

введите описание изображения здесь

многоугольник

size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]  # The corner points of the polygon.

polygon = pygame.Surface(size)
pygame.draw.polygon(polygon, RED, points, 10)

polygon_filled = pygame.Surface(size)
pygame.draw.polygon(polygon_filled, RED, points)

введите описание изображения здесь

Круг

size = (50, 50)
radius = 25

circle = pygame.Surface(size)
pygame.draw.circle(circle, RED, (radius, radius), radius, 10)  # Position is the center of the circle.

circle_filled = pygame.Surface(size)
pygame.draw.circle(circle_filled, RED, (radius, radius), radius)

Отверстия являются неудачным следствием алгоритма рисования pygame.

введите описание изображения здесь

Эллипс

size = (50, 25)  # Minimize it's height so it doesn't look like a circle.

ellipse = pygame.Surface(size)  
pygame.draw.ellipse(ellipse, RED, ellipse.get_rect(), 5)

ellipse_filled = pygame.Surface(size)
pygame.draw.ellipse(ellipse_filled, RED, ellipse.get_rect())

Отверстия являются неудачным следствием алгоритма рисования pygame.

введите описание изображения здесь

дуга

size = (50, 50)

arc = pygame.Surface(size)
pygame.draw.arc(arc, RED, arc.get_rect(), 0, pi)  # 0 to pi is 180° creating a half circle.

введите описание изображения здесь

Линия

size = (50, 50)

line = pygame.Surface(size)
pygame.draw.line(line, RED, (0, 0), (50, 50))  # Start at topleft and ends at bottomright.

введите описание изображения здесь

линии

size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]

lines = pygame.Surface(size)
pygame.draw.lines(lines, RED, False, points)

lines_closed = pygame.Surface(size)
pygame.draw.lines(lines_closed, RED, True, points)

введите описание изображения здесь

Сглаженная линия

size = (50, 50)

antialiased_line = pygame.Surface(size)
pygame.draw.aaline(antialiased_line, RED, (0, 0), (50, 50))

введите описание изображения здесь

Сглаженные линии

size = (50, 50)
points = [(25, 0), (50, 25), (25, 50), (0, 25)]

antialiased_lines = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines, RED, False, points)

antialiased_lines_closed = pygame.Surface(size)
pygame.draw.aalines(antialiased_lines_closed, RED, True, points)

введите описание изображения здесь

Попробуйте

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

import pygame
from math import pi
pygame.init()

screen = pygame.display.set_mode((100, 100))
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(255, 0, 0) 

# But code snippet here

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
    
    screen.blit(image, (25, 25))
    pygame.display.update()

Поверхности

В pygame вы обычно используете Surfaces для представления внешнего вида объектов и Rectangles для представления своих позиций. A Поверхность похожа на чистый лист бумаги, который содержит цвета или изображения. Существует два способа создания Поверхности: пустая с нуля или загрузка изображения.

Создание поверхности

Чтобы создать Поверхность, вам нужен минимум ее размер, который представляет собой 2-элементную целую последовательность ширины и высоты, представляющую размер в пикселях.

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

size = width, height = (32, 32)
empty_surface = pygame.Surface(size)

Вы можете использовать модуль pygame.draw для рисования фигур на поверхности или заливки цветом, вызвав метод fill(color) поверхности fill(color) . Цвет аргумента представляет собой целую последовательность из 3 или 4 элементов или объект pygame.Color .

Загрузить изображение

Чаще всего вы хотели бы использовать свои собственные изображения в игре (называемые спрайтами). Создание поверхности с вашим изображением так же просто, как:

my_image = pygame.image.load(path_to_image)

Путь к изображению может быть относительным или абсолютным. Для повышения производительности обычно целесообразно преобразовать изображение в тот же формат пикселей, что и экран. Это можно сделать, вызвав метод Surface метода convert() , например:

my_image = pygame.image.load(path_to_image).convert()

Если ваше изображение содержит прозрачность (альфа-значения), вы просто вызываете метод convert_alpha() :

my_image = pygame.image.load(path_to_image).convert_alpha()

блиттинг

Для того, чтобы их можно было отображать, на экране должны быть блистерны. Blitting по существу означает копирование пикселей с одной поверхности на другую (экран также является поверхностью). Вам также необходимо передать позицию поверхности, которая должна быть 2-элементной целочисленной последовательностью или объектом Rect. Поверхность Поверхности будет помещена в позицию.

screen.blit(my_image, (0, 0))
pygame.display.update()  # or pygame.display.flip()

Можно смешать с другими поверхностями, чем экран. Чтобы показать, что было на экране, вам нужно вызвать pygame.display.update() или pygame.display.flip() .

прозрачность

В pygame есть виды 3 прозрачности: colorkeys, Surface alphas и per-pixel alphas.

Colorkeys

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

BLACK = (0, 0, 0)
my_image.set_colorkey(BLACK)  # Black colors will not be blit.

Поверхность может иметь только один colorkey. Установка другого colorkey перезапишет предыдущий. Colorkeys не может иметь разные значения альфа, он может только сделать цвет невидимым.

введите описание изображения здесь

Поверхностные альфы

Делает всю поверхность прозрачной по альфа-значению. С помощью этого метода вы можете иметь разные значения альфа, но это повлияет на всю поверхность.

my_image.set_alpha(100)  # 0 is fully transparent and 255 fully opaque.

введите описание изображения здесь

Пер-пиксельная альфа

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

size = width, height = (32, 32)
my_image = pygame.Surface(size, pygame.SRCALPHA)  # Creates an empty per-pixel alpha Surface.

Теперь поверхность будет рисовать прозрачность, если цвет содержит четвертое значение альфа.

BLUE = (0, 0, 255, 255)
pygame.draw.rect(my_image, BLUE, my_image.get_rect(), 10)

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

введите описание изображения здесь

Объединить colorkey и Surface alpha

Colorkeys и Surface alphas можно комбинировать, но альфа-пиксель не может. Это может быть полезно, если вы не хотите более медленную производительность для пиксельной поверхности.

purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)

введите описание изображения здесь

Полный код

Скопируйте это в пустой файл и запустите его. Нажмите клавиши 1, 2, 3 или 4, чтобы отобразить изображения. Нажмите 2, 3 или 4 раза, чтобы сделать их более непрозрачными.

import pygame
pygame.init()

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255, 50)  # This color contains an extra integer. It's the alpha value.
PURPLE = (255, 0, 255)

screen = pygame.display.set_mode((200, 325))
screen.fill(WHITE)  # Make the background white. Remember that the screen is a Surface!
clock = pygame.time.Clock()

size = (50, 50)
red_image = pygame.Surface(size)
green_image = pygame.Surface(size)
blue_image = pygame.Surface(size, pygame.SRCALPHA)  # Contains a flag telling pygame that the Surface is per-pixel alpha
purple_image = pygame.Surface(size)

red_image.set_colorkey(BLACK)
green_image.set_alpha(50)
# For the 'blue_image' it's the alpha value of the color that's been drawn to each pixel that determines transparency.
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)

pygame.draw.rect(red_image, RED, red_image.get_rect(), 10)
pygame.draw.rect(green_image, GREEN, green_image.get_rect(), 10)
pygame.draw.rect(blue_image, BLUE, blue_image.get_rect(), 10)
pygame.draw.rect(purple_image, PURPLE, purple_image.get_rect(), 10)

while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1:
                screen.blit(red_image, (75, 25))
            elif event.key == pygame.K_2:
                screen.blit(green_image, (75, 100))
            elif event.key == pygame.K_3:
                screen.blit(blue_image, (75, 175))
            elif event.key == pygame.K_4:
                screen.blit(purple_image, (75, 250))

    pygame.display.update()


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow