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