如何保存pygame屏幕的一部分并将其blit到另一个位置?

时间:2019-06-03 03:18:11

标签: python 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:在blit期间不能锁定表面

我认为这意味着孩子被锁定在其父表面或其他物体上,但是我还能怎么做呢?

2 个答案:

答案 0 :(得分:1)

screen.subsurface创建一个曲面,该曲面引用原始曲面。来自文档:

  

返回与新父对象共享像素的新Surface。

为避免不确定的行为,表面会被锁定。您必须先.copy表面,然后才能.blit将其返回到源:

sub = screen.subsurface((0,0,20,20)).copy()
screen.blit(sub, (30,40))

答案 1 :(得分:1)

请勿直接在屏幕表面上绘制。为游戏/ UI的每个部分创建一个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()