Немного смущенный с блинтом (Pygame) - программирование
Подтвердить что ты не робот

Немного смущенный с блинтом (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)

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

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

4b9b3361

Ответ 1

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

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

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

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

Что такое блиты?

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

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

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

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

Как работают pygame.draw. * blit?

Технически методы 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() непосредственно манипулирует поверхностью, которую вы передаете, вместо того, чтобы создавать новую поверхность. Это могло быть выбрано как способ сделать что-то, потому что они могли бы работать быстрее или с меньшим объемом памяти, чем создавать новую поверхность.

Итак, что мне делать?

Итак, на ваш вопрос о том, "когда нужно blit" и "when not to", в основном, вам нужно прочитать документацию, чтобы увидеть, что на самом деле делает функция.

Вот pygame.draw.circle() docs:

pygame.draw.circle():

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

круг (поверхность, цвет, позиция, радиус, ширина = 0) → Rect

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

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

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

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

render (текст, антиалиасы, цвет, фон = нет) → Поверхность

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

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

Ответ 2

Blit означает "BL'ock" I'mage 'T'ranfser

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

Когда вы выполните:

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

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

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

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

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

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

Ответ 3

Изображение, которое вы художник:

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

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

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

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

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