Немного запутался с блиттингом (Pygame)

Я только начал изучать pygame (в целом новичок в программировании), и у меня есть несколько очень простых вопросов о том, как это работает.

Я еще не нашел места, где объясняется, когда мне нужно мигать или не включать определенную поверхность на экран. Например, при рисовании круга:

circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

screen.blit(circle) делать не нужно, но при отображении текста:

text = font.render("TEXT", 1, (10, 10, 10)) 
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
screen.blit(text, textpos)

Если я не блит, текст не появится.

Честно говоря, я действительно не знаю, что должен делать блиттинг, кроме «наклеивания» желаемой поверхности на экран. Надеюсь, я был достаточно ясен.


person Pabce    schedule 03.07.2013    source источник
comment
blitting сначала растрирует любую не векторную графику в буфер, который может быть записан в видеобуфер. как правило, все, что не генерируется динамически векторным рендерером, должно быть скопировано.   -  person OregonTrail    schedule 03.07.2013
comment
pygame.draw.circle(surface, ...) будет рисовать прямо в surface. в то время как font.Render() возвращает новый Surface, но не выполняет рендеринг автоматически. pygame.org/docs/ref/font.html# pygame.font.Font.render   -  person ninMonkey    schedule 04.07.2013
comment
Очень поздно, но @OregonTrail вы имели в виду, что копирование растрирует любую векторную графику в буфер? Поскольку при чтении printcnx.com/ resources-and-support / addiational-resources / мне кажется, что не векторная графика ЯВЛЯЕТСЯ растровой графикой?   -  person samlaf    schedule 26.02.2021


Ответы (3)


Краткий ответ

Я еще не нашел места, где объясняется, когда мне нужно мигать или не включать определенную поверхность на экран.

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

Длинный ответ

Что такое блиттинг?

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

Итак, у вас часто бывает такой код ...

my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)

В двух строках кода мы скопировали тонну пикселей с исходной поверхности (my_image) на экран путем «блиттинга».

Как функции pygame.draw. * Мигают?

Технически методы pygame.draw. * Могли быть написаны для чего-то подобного. Итак, вместо вашего примера ...

pygame.draw.circle(screen, COLOR, POS, RADIUS, WIDTH)

... они МОГЛИ заставить тебя это сделать ...

circle_surface = pygame.draw.circle(COLOR, RADIUS, WIDTH)
screen.blit(circle_surface, POS)

Если бы это было так, вы бы получили тот же результат. Однако внутри метод pygame.draw.circle() напрямую манипулирует поверхностью, которую вы ему передаете, а не создает новую поверхность. Это могло быть выбрано как способ сделать что-то, потому что они могли заставить его работать быстрее или с меньшим объемом памяти, чем создание новой поверхности.

Так что же мне делать?

Итак, чтобы ответить на ваш вопрос о том, «когда использовать» и «когда не следует», в основном, вам нужно прочитать документацию, чтобы увидеть, что на самом деле делает функция.

Вот документы pygame.draw.circle ():

pygame.draw.circle ():

нарисуйте круг вокруг точки

круг (поверхность, цвет, положение, радиус, ширина = 0) -> Прямоугольник

Рисует круглую форму на поверхности. Аргумент pos - это центр круга, а радиус - это размер. Аргумент ширины - это толщина для рисования внешнего края. Если ширина равна нулю, круг будет заполнен.

Обратите внимание, что он говорит, что «рисует фигуру на поверхности», поэтому пиксельные изменения уже были изменены за вас. Кроме того, он не возвращает поверхность (он возвращает Rect, но он просто сообщает вам, где были сделаны изменения пикселей).

Теперь давайте посмотрим на документацию pygame.font.Font.render ():

рисовать текст на новой поверхности

рендеринг (текст, сглаживание, цвет, фон = Нет) -> Поверхность

Это создает новую поверхность с отрисованным на ней указанным текстом. Pygame не предоставляет возможности напрямую рисовать текст на существующей поверхности: вместо этого вы должны использовать Font.render () для создания изображения (поверхности) текста, а затем перенести это изображение на другую поверхность. ...

Как видите, в нем конкретно говорится, что текст рисуется на НОВОЙ поверхности, которая создается и возвращается вам. Эта поверхность НЕ является поверхностью вашего экрана (этого не может быть, вы даже не сказали функции render(), что такое поверхность вашего экрана). Это довольно хороший признак того, что вам действительно нужно перенести эту поверхность на экран.

person Mark Hildreth    schedule 03.07.2013
comment
Хорошо, ваш ответ был отличным, спасибо! Я просто немного запутался во всем, спасибо за разъяснения. - person Pabce; 04.07.2013

Blit означает «BL'ock», «I'mage» T'ranfser.

Когда вы показываете что-то на экране, вы каким-то образом будете использовать screen, потому что это то место, куда вы его помещаете.

Когда вы это сделаете:

pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

вы все еще используете экран, но вы просто не копируете, потому что pygame рисует его за вас.

И когда вы используете текст, pygame отображает его в изображение, тогда вам нужно его преобразовать.

Таким образом, в основном вы копируете изображения, но вы также можете заставить pygame рисовать их за вас. Но помните, когда вы дублируете изображение, скажем, поверх фона, вам нужно зациклить его назад и четвертое; так что он копирует фон, затем изображение, затем фон и т. д.

Вам не нужно знать больше, но вы можете прочитать об этом здесь Pygame Blit

Надеюсь, это помогло. Удачи!

person Serial    schedule 03.07.2013
comment
У вас есть ссылка на происхождение аббревиатуры, поскольку я думаю, что вы не совсем правы в этом. Википедия о bitblit: название происходит от подпрограммы BitBLT для компьютера Xerox Alto, обозначающей перенос блока с граничными битами (выделено мной), а теперь "bit blit" означает просто "перенос битового блока". . en.wikipedia.org/wiki/Bit_blit - person eric; 30.06.2017

Представьте, что вы художник:

У вас есть холст и кисть.

Допустим, ваша основная поверхность экрана будет вашим холстом, а все остальные поверхности находятся «у вас в голове» - вы уже умеете их рисовать.

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

Как уже сказал Марк, вы можете нарисовать круг с помощью функции или сначала перенести его на новую поверхность, а затем перенести его на поверхность экрана.

Если у вас есть более сложная поверхность - кривые, текст и т. Д., Вам не потребуется для этого поверхность, поэтому вам не придется выполнять какие-либо дорогостоящие вычисления, а просто рисовать. Неудача в том, что ваша программа занимает больше памяти, поэтому вам придется выбирать между этими двумя.

person Bartlomiej Lewandowski    schedule 03.07.2013