Есть ли способ очистить поверхность?

Есть ли способ очистить поверхность от всего, что на нее попало?


person Eric    schedule 28.10.2009    source источник
comment
Какой инструментарий вы используете? Tk, Qt, Gtk, WxWidgets?   -  person Otto Allmendinger    schedule 28.10.2009
comment
TkInter я думаю, или я действительно не знаю? Я использую pygame для всей своей графики.   -  person Eric    schedule 28.10.2009
comment
Да, конечно есть способ.   -  person Mark Rushakoff    schedule 28.10.2009
comment
Если это pygame: почему бы просто не заполнить поверхность сплошным цветом (у нее должен быть метод заполнения)....   -  person ChristopheD    schedule 28.10.2009
comment
@Eric: Если вы используете pygame, ОБНОВИТЕ вопрос, чтобы на самом деле сказать, что вы используете pygame.   -  person S.Lott    schedule 28.10.2009


Ответы (10)


Если вы хотите сделать объект pygame Surface "чистым", то есть стереть все изображения, перенесенные на него, связать с ним новые изображения в каждом игровом цикле и сохранить альфа-пиксель равноправного пикселя без создания новой поверхности, вы можете заполнить его, но вместо сплошного цвета используйте прозрачный цвет

from pygame import Color, Surface
empty = Color(0,0,0,0) #The last 0 indicates 0 alpha, a transparent color
field = Surface((width, height), flags=SRCALPHA)

#Inside the game loop
field.fill(empty)

* Извините, мой английский плохой, я все еще учусь

person Wolfang Torres    schedule 18.06.2015

Когда меня не волнует производительность, я использую:

mysurface.fill((0,0,0))

Который будет рисовать заданный цвет (в данном случае черный) по всей поверхности. Это то, что вы имели в виду под "ясно"?

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

person Mizipzor    schedule 04.12.2009

Я не знаю, какой API вы используете, поэтому вот расплывчатый ответ:

Практически во всех случаях «очистка» поверхности просто переносит на нее цветной четырехугольник того же размера, что и поверхность. Используемый цвет - это то, что вы хотите, чтобы ваш чистый цвет был.

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

person Pod    schedule 28.10.2009

Вы не можете отменить один рисунок, написанный поверх другого, точно так же, как вы не можете отменить один рисунок, нарисованный мелом поверх другого рисунка на той же доске.

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

person Kylotan    schedule 28.10.2009

У меня тоже была эта пробема

Чтобы создать поверхность:

mask=pygame.Surface((180,100),pygame.SRCALPHA)

Чтобы очистить поверхность:

mask.fill
mask.set_alpha(255)

Нарисуйте свои линии / изображения и т. Д.

Затем перенесите эту поверхность на вашу основную поверхность, используя флаг Alpha Blend.

screen.blit(mask,(0,0),special_flags=(pygame.BLEND_RGBA_ADD))
person Thomas Collingwood    schedule 10.07.2011

.fill((255,255,255,0)) у меня все равно работает.

person thegunmaster    schedule 09.11.2014

Я использовал следующее в игре, которую я сделал:

self.image = 0 #to empty it
self.image = pygame.image.load("image")
person DrevanTonder    schedule 14.10.2015

Для pygame вы можете использовать Surface.fill

person John La Rooy    schedule 28.10.2009
comment
Да, я мог бы использовать это, но вот сложная часть: моя поверхность переносится на другую поверхность и использует флаг SRCALPHA для поддержки прозрачности. Если я заполню всю поверхность сплошным цветом, вся моя игровая доска окрасится в этот цвет, так как эта поверхность закрашивается на все... И я не знаю, как решить эту проблему. - person Eric; 28.10.2009
comment
@ Эрик, ты должен добавить эти требования к своему вопросу. - person John La Rooy; 28.10.2009

Заполните поверхность заливкой, затем сделайте ее прозрачной с помощью set_alpha

surface.fill
surface.set_alpha(255)
person Charles Ma    schedule 28.10.2009
comment
ах, я вижу, что вы пытаетесь сделать сейчас. Нет, вы не можете отменить блит на поверхности. Следуйте совету Килотана. - person Charles Ma; 29.10.2009

Если вы хотите очистить поверхность перед блитингом, вы можете сначала заполнить поверхность маловероятным случайным цветом, установить альфу (colorkey) с этим цветом, а затем блистать исходный спрайт с прозрачным фоном обратно на поверхность.

idle_image = pg.image.load("sprite.png") #sprite with transparent background
temp_color = pg.Color(132, 23, 213, 255) #random unlikely replacement color

def clear_surface(surface):
    surface.fill(st.temp_color)
    surface.set_colorkey(st.temp_color)
    surface.blit(idle_image, (0,0))
person Mike Lee    schedule 18.12.2020