Как сохранить часть экрана pygame и перенести ее в другое место?

Я делаю программу с графиком, который прокручивается, и мне просто нужно переместить часть экрана.

Если я сделаю что-то вроде этого:

import pygame

screen = pygame.display.set_mode((300, 300))

sub = screen.subsurface((0,0,20,20))

screen.blit(sub, (30,40))

pygame.display.update()

Выдает сообщение об ошибке: pygame.error: поверхности не должны быть заблокированы во время блитирования.

Я предполагаю, что это означает, что ребенок заблокирован на своей родительской поверхности или что-то в этом роде, но как еще я мог это сделать?


person bayman21    schedule 03.06.2019    source источник


Ответы (2)


screen.subsurface создает поверхность, ссылающуюся на оригинал поверхность. Из документации:

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

Чтобы избежать неопределенного поведения, поверхности блокируются. Прежде чем вы можно .blit указать его источник:

sub = screen.subsurface((0,0,20,20)).copy()
screen.blit(sub, (30,40))
person Rabbid76    schedule 03.06.2019

Просто не рисуйте прямо на поверхность экрана. Создайте Surface для каждой части вашей игры/интерфейса и выведите каждую из них на экран.

import pygame

def main():
    pygame.init()
    screen = pygame.display.set_mode((640, 480))

    # create two parts: a left part and a right part
    left_screen = pygame.Surface((400, 480))
    left_screen.fill((100, 0, 0))

    right_screen = pygame.Surface((240, 480))
    right_screen.fill((200, 200, 0))

    x = 100
    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return

        # don't draw to the screen surface directly
        # draw stuff either on the left_screen or right_screen
        x += 1
        left_screen.fill(((x / 10) % 255, 0, 0))

        # then just blit both parts to the screen surface
        screen.blit(left_screen, (0, 0))
        screen.blit(right_screen, (400, 0))

        pygame.display.flip()

if __name__ == '__main__':
    main()
person sloth    schedule 03.06.2019