Немного запутался с блитирование (с которым Pygame)
Я только начал изучать pygame (совершенно новый для программирования в целом), и у меня есть некоторые очень простые вопросы о том, как это работает.
Я еще не нашел место, которое объясняет, когда мне нужно blit или не включать определенную поверхность на экране. Например, при рисовании круга:
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)
Если я не blit, текст не появится.
честно говоря, я действительно не знаю, что блитинг должен делать, кроме "вставки" желаемой поверхности на экран. Надеюсь, я достаточно ясно выразился.
3 ответов
короткий ответ:
Я еще не нашел место, которое объясняет, когда мне нужно blit или не включать определенную поверхность на экране.
каждая операция будет вести себя по-разному, и вам нужно будет прочитать документацию для функции, с которой вы работаете.
долгий ответ
Что Такое Блиттинг?
во-первых, вам нужно понять, что делает blitting. Ваш экран-это просто набор пикселей, и blitting делает полную копию одного набора пикселей на другой. Например, вы можете иметь поверхность с изображением, которое вы загрузили с жесткого диска, и можете отображать его несколько раз на экране в разных положениях, стирая эту поверхность поверх screen
поверхность несколько раз.
Итак, у вас часто есть такой код...
my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)
в двух строках кода мы скопировали тонну пикселей с исходной поверхности (my_image) на экран с помощью "блитирование".
как сделать pygame.рисовать.* функции blit?
технически, pygame.рисовать.* методы могли быть написаны, чтобы сделать что-то подобное. Итак, вместо вашего примера...
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.рисовать.circle () docs:
, С которым Pygame.рисовать.circle():
нарисуйте круг вокруг точка
круг (поверхность, цвет, pos, радиус, ширина=0) - > Rect
рисует круглую форму на поверхности. Аргумент pos является центром круга, а radius-размером. Аргумент width - это толщина для рисования внешнего края. Если ширина равна нулю, то круг будет заполнен.
обратите внимание, что он говорит, что "рисует фигуру на поверхности", поэтому он уже сделал изменения пиксела для вас. Кроме того, он не возвращает поверхность (it возвращает прямую кишку, но это просто говорит вам, где были сделаны изменения пикселей).
теперь давайте посмотрим на , с которым Pygame.шрифт.Шрифт.render () documentation:
нарисуйте текст на новой поверхности
рендер(текст, сглаживания, цвет, фон=Нет) -> поверхность
это создает новую поверхность с указанным текстом, отображаемым на ней. Pygame не позволяет напрямую рисовать текст на существующей поверхности: вместо этого вы должны использовать Шрифт.render () чтобы создать изображение (поверхность) текста, затем Блит это изображение на другую поверхность. ...
как вы можете видеть, в нем конкретно говорится, что текст рисуется на новой поверхности, которая создается и возвращается вам. Эта поверхность не является поверхностью вашего экрана (это не может быть, вы даже не сказали
Blit означает 'BL'ock' i'Mage ' t'ranfser
когда вы показываете вещи на экране, вы будете, в некотором роде, использовать screen
потому что именно туда вы его помещаете.
Если вы:
pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)
вы все еще используете экран, но вы просто не blitting, потому что pygame рисует его для вас.
и когда вы используете текст, pygame отображает его в изображение, тогда вам нужно его уничтожить.
Так что в основном вы blit изображения, но вы можете также у pygame нарисуйте их для вас. Но помните, когда вы стираете изображение, скажем, на фоне, вам нужно зациклить его назад и в-четвертых; так что он стирает фон, затем изображение, затем фон и т. д...
вам не нужно знать гораздо больше, чем это, но вы можете прочитать все об этом здесь , С Которым Pygame Блитировать
надеюсь, это помогло. Удачи!
представьте, что вы художник:
У вас есть холст и кисти.
предположим, что ваша основная поверхность экрана будет вашим холстом, а все остальные поверхности "в вашей голове" - вы уже знаете, как их рисовать.
когда вы называете blit, вы рисуете сверху поверхности, покрывающей любые перекрывающиеся пиксели. Вот почему вам нужно перекрасить весь экран в черный цвет, чтобы у вас не было никаких пятен на картине в то время как перемещение объекта.
Как уже сказал Марк, вы можете нарисовать круг с функцией, или сначала Блит его на новую поверхность, и Блит, что на поверхности экрана.
Если у вас более сложная поверхность - кривых, текста и т. д. для этого вам не нужно иметь поверхность, поэтому вам не нужно делать никаких дорогостоящих вычислений, просто рисовать. Неудача заключается в том, что ваша программа занимает больше памяти, поэтому вам придется выбрать между этими 2.