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

Есть ли какой-нибудь способ очистить поверхность от всего, что на ней было скрыто?

12 ответов

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

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)

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

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

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

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

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

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

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

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))

.fill((255,255,255,0)) похоже, работает на меня в любом случае.

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

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

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

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

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

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

self.image = 0 #to empty it
self.image = pygame.image.load("image")

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

      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))

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

      from __future__ import absolute_import, division, print_function
from itertools import cycle
import pygame

VISITOR_TTF_FILENAME = 'pixelFont.ttf'
BLINK_EVENT = pygame.USEREVENT + 0
empty = (255,255,255,0)


def main():
    pygame.init()
    try:
        screen = pygame.display.set_mode((800, 600))
        screen.fill((255,255,255))
        screen_rect = screen.get_rect()

        clock = pygame.time.Clock()

        font = pygame.font.Font(VISITOR_TTF_FILENAME, 50)
        on_text_surface = font.render(
            'Press Any Key To Start', True, pygame.Color('green3')
        )
        blink_rect = on_text_surface.get_rect()
        blink_rect.center = screen_rect.center
        off_text_surface = pygame.Surface(blink_rect.size)
        off_text_surface.fill(empty)
        
        blink_surfaces = cycle([on_text_surface, off_text_surface])
        blink_surface = next(blink_surfaces)
        pygame.time.set_timer(BLINK_EVENT, 1000)

        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                if event.type == BLINK_EVENT:
                    blink_surface = next(blink_surfaces)

            screen.blit(blink_surface, blink_rect)
            pygame.display.update()
            clock.tick(60)
    finally:
        pygame.quit()


if __name__ == '__main__':
    main()

Когда я хочу избавиться от чего-то, я использую

      screen.fill("Gray")

каждый раз обновляю! Поэтому он прячет его за серым экраном.

Серый — не единственный доступный цвет, поэтому вот список всех доступных цветов, которые вы можете использовать для pygame.

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

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

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

surface.fill
surface.set_alpha(255)
Другие вопросы по тегам